文件上传总结

检测维度

  • javascript
    检查没有流量产生,F12或者FireBug移除JS代码
  • MIME
    MIME检测,burp拦截后更改MIME类型
if($_FILES['userfile']['type'] != "image/gif") { // check Content-type  
  • 目录路径
$sFilePath=evil.php%00.gif  !! php<5.3.4
move_uploaded_file( $oFile['tmp_name'], $sFilePath)  

php版本5.3.4以下 and gpc关闭 CVE-2015-2348

  • 扩展名检测
    黑名单绕过(大小写,asa/cer/php345/inc/phtml/phps/phpt,win server命名._,asp0x00截断,.htaccess, user.ini(针对php-fastcgi))
    白名单(asp 0x00,解析漏洞,文件包含,NTFS ADS特性)
.htaccess
    <FilesMatch "filename">
    SetHandler application/x-httpd-php
    </FilesMatch>
  • 文件内容检测
    1.文件幻数检测:
    JPEG:FF D8 FF E0 00 10 4A 46 49 46
    PNG:89 50 4E 47
    GIF:47 49 46 38 39 61
    PHP:<?php>、 <?、 <%、 <script language="php">phpinfo();</script>
    2.文件相关信息检测:添加文件信息
    3.文件加载检测:二次渲染,考虑攻击加载器/绕过PHP图片转换实现RCE SCTF 2016 homework

解析漏洞

  • apapche

    • (2.0-2.2 可能影响版本)一个文件名为 x1.x2.x3 的文件,Apache 会从 x3 的位置往 x1 的位置开始尝试解析如果 x3 不属于 Apache 能解析的扩展名,那么 Apache 会尝试去解析 x2 的位置,这样一直往前尝试,直到遇到一个能解析的扩展名为止.
    • 2.4.0-2.4.29 %0a绕过扩展名检测。只要用正则来匹配后缀进行php解析的Apache就有这个问题。而这个做法刚好是为了解决Apache老的解析漏洞而做的,可谓非此即彼,必然存在一种解析漏洞。详见P牛博文
  • IIS

    • IIS6.0 在解析 asp 格式的时候有两个解析漏洞,一个是如果目录名包含 ".asp" 字符串 ,那么这个目录下所有的文件都会按照 asp 去解析,另一个是只要文件名中含有 ".asp;" 会优先按 asp 来解析
    • IIS7.0/7.5是对 php 解析时有一个类似于Nginx 的解析漏洞,对任意文件名只要在 URL后面追加上字符串 "/ 任意文件名 .php" 就会按照 php 的方式去解析 (IIS6.0 没测试 )
  • Nginx

    • 一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是 test.jpg,可以添加为 test.jpg/x.php 进行解析攻击。(php-cgi)
    • 还有一种是对低版本的 Nginx 可以在任意文件名后面添加 %00.php 进行解析攻击。
  • php-cgi

    Is the PHP option 'cgi.fix_pathinfo' really dangerous with Nginx + PHP-FPM?

reference
1.《Upload Attack Framework》 v1.0 CasperKid [Syclover][Insight-Labs]
2.XMAN 2017 Web
3.PHITHON BLOG

xmsec

xmsec

Lancet成员,很菜却在努力。