背景:服务端代码未对客户端上传的文件做严格的过滤,导致用户可以上传任意文件,包括脚本文件
原理:上传的文件能被Web服务器当作脚本来执行(经常结合文件包含和文件解析);攻击者可以访问到上传文件的路径
类型主要分为以下几种:
客户端检测
程序员使用javascript来拒绝非法文件上传,一般是限制上传类型和文件大小
绕过方式
中间人(burp)改包
**是在HTTP层做手脚
**有一个需要注意的点儿是:请求头Content-Length(实体正文长度),当filename修改时(长度会增加或减少),Content-Length也会改变,此时应当修改Content-Length(修改成实际的请求长度就行)
**上传正常文件抓包修改文件filename;抓包修改content-type
直接禁用js就行
服务器端检测
黑名单过滤
定义不允许上传的文件扩展名。只针对黑名单中没有的后缀名,文件才能上传成功。
绕过
1.从黑名单中找到开发人员忽略的扩展名 。可用burp枚举后缀名,寻找黑名单中没有过滤的后缀名
如:upload-labs-4 未禁止.htaccesss文件上传
2.如果未对文件接收到的文件名扩展名进行大小写转换操作,则可以大小写绕过黑名单验证:
windows:大小写不敏感
linux:大小写敏感
3.在windows系统下,文件以空格或 “.“作为结尾,系统会自动去除 ”.“或空格。因此可上传文件的后缀名 为”.php_“(下划线为空格)、”.php.“,Windows将会自动去除小数点和空格, 服务器端接收到的文件后缀名都是“.php”。
4.特殊符号绕过
windows下文件名后+” ::DATA“,如上传文件名为test.php::DATA则会在服务器上生成一个test.php文件,其内容和所上传内容相同,并被解析。虽然在windows下新建的文件名中包含特殊符号不能成功创建,但可以通过burp改包
5.路径拼接:
eg:用户新建 1.php.+空格+(具体根据源码来构造)
6.双写绕过:
如果只对黑名单中的内容进行替换,且只替换一次,可造成双写绕过
7.%00:
上传 a.php.jpg 抓包后在php后添加一个字符修改其HEX值为%00,解析后就为a.php
- .htaccess 和 .user.ini 绕过:
.htaccess-------是伪静态环境配置文件,用于lamp,只适用于apache
条件: ①、Allow Override All
②、LoadModule rewrite_module modules/mod_rewrite.so #rewrite模块为开启状态
内容:
LINUX: (1)AddType application/x-httpd-php .jpg (2) <FilesMatch "BaiZe"> setHandler application/x-httpd-phpBZ </FilesMatch> 将所有文件名包含BaiZe的文件作为php文件来解析 Windows: AddHandler fcgid-script .png FcgidWrapper "D:/phpstudy_pro/Extensions/php/php5.6.9nts/php-cgi.exe" .png
.user.ini-------lnmp文件,放在根目录下,存储用户网站的文件夹路径地址。防止跨目录访问和文件跨目录读取
内容:
Linux: AddType application/x-httpd-php .jpg <FilesMatch "BaiZe"> setHandler application/x-httpd-phpBZ
9.竞争条件攻击----利用较短的时间差
将文件(1.php)先上传到临时目录,然后再检测,检测在删除
<?php fputs(fopen('../2.php','w'),'<?php @eval($_POST['a']); ?>'); ?>
上传成功后,客户端立即访问1.php。然后就会在服务端当前目录下自动生成2.php
白名单
定义允许上传的扩展名,如果上传文件的后缀名被允许(命中),则认为该文件合法,否则不允许上传
绕过
1.%00绕过:
一般上传的文件不是直接送到服务器,而是先放到临时目录,然后再重命名(如网上图片的数字),最后再发往服务器。再url中%00表示ascll中的0,而ascll中0作为特殊字符保留,表示字符串的结束。%00只针对GET传参(走url栏), 适用于php>5.3.42,且服务器中的php.ini中的magic_quotes_gpc = Off。
2.竞争攻击
同黑名单
3.图片马-----------------图片 + 代码
进入图片文件(1.png),一句话木马文件(1.php)所在目录,cmd窗口打开,然后执行如下命令
coopy 1.png/b + 1.php/a 1.jpg
然后生成1.jpg这个图片马