一.原理:
攻击者利用服务器端没有对用户上传的文件进行正确的处理,导致攻击者可以向某个可通过 Web 访问的目录上传恶意文件,并且该文件可以被Web服务器解析执行。
move_uploaded_file(file,newloc):
• move_uploaded_file() 函数将上传的文件移动到新位置, 若成功,则返回 true,否则返回 false
1. 后缀绕过
部分服务仅根据后缀、上传时的信息或Magic Header来判断文件类型,此时可以绕过。
php由于历史原因,部分解释器可能支持符合正则 /ph(p[2-7]?|t(ml)?)/
的后缀,如 php / php5 / pht / phtml / shtml / pwml / phtm
等 可在禁止上传php文件时测试该类型。
jsp引擎则可能会解析 jspx / jspf / jspa / jsw / jsv / jtml
等后缀,
asp支持 asa / asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90}
等后缀。
除了这些绕过,其他的后缀同样可能带来问题,如 vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini
等。
2. 系统命名绕过
在Windows系统中,上传 index.php. 会重命名为 . ,可以绕过后缀检查。 也可尝试 index.php%20 , index.php:1.jpg index.php::$DATA
等。 在Linux系统中,可以尝试上传名为 index.php/.
或 ./aa/../index.php/.
的文件
3 .user.ini
在php执行的过程中,除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)
。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。 .user.ini 中可以定义除了PHP_INI_SYSTEM以外的模式的选项,故可以使用 .user.ini 加上非php后缀的文件构造一个shell,比如 auto_prepend_file=01.gif
。
二.流程与攻击防御总结
三.上传攻击的条件
攻击者要想成功实施文件上传攻击,必须要满足以下四个条件:
1.网站有上传功能
2.上传的文件能够被Web服务器解析执行,特定的后缀名。并且存放上传文件的目录要有执行脚本的权限。
3.用户能够通过Web访问这个文件。如果文件上传后,不能通过Web访问,那么也不能成功实施攻击。
4.要知道文件上传到服务器后的存放路径和文件名称。
因为许多Web应用都会修改