上个星期我被邀请组队去参加一个由CSAW组织的CTF夺旗比赛.由于老婆孩子的缘故,我只能挑一个与Web漏洞利用相关的题目,名字叫作”HorceForce”.这道题价值300点。这道题大概的背景是,你拥有一个低权限的账号并须要找到方法来得到管理员权限。 php
固然,有不少种方法来介绍如何经过这关,但我想分享下个人通关经验。
html
当把一些单引号做为参数值发送以后返回了MySQL的典型报错信息“MySQL SQL Error Message”,所以能够轻易发现这里存在一个SQL注入漏洞。web
而后,正如你了解的,咱们一般会进行以下尝试:
网络
http://128.238.66.217/horse.php?id=7 or 1 IN (select current_user)
而后我获得了一个错误信息,相似“请中止攻击该网站“这样的内容。框架
在我尝试了不少绕过SQLi filter的方法以后,我意识到在网站背后配置了一个WAF来阻止任意包含“select”或“union”等在利用SQL注入时经常使用的SQL查询关键字。经过这样的黑盒测试能够猜想出WAF使用了相似下面这样的正则:
ide
/^.*select.*$/ or /^.*union.*$/
这意味着,提交任意带有SQL注入企图的字符串,如blablaSELECTblabla或像/*!union*/这样的绕过方式都会触发WAF拦截的错误信息。 测试
在进行了一些研究以后,我发现经过HTTP参数污染的方式可以使攻击者绕过WAF的拦截。 网站
那么,究竟要如何实现呢?spa
咱们假设有一个经过GET方式提交的参数“id”,你能够重复构造这个参数并如下面的形式发送出去:
.net
?id=value1&id=value2
而后,依你使用的框架不一样(PHP,Java,ASP.NET,etc),参数字符串会以不一样的方式进行解析,在咱们实验的场景下Apache/PHP,若是你能够屡次注入同一个参数值,只有最后一个参数值会被框架解析,可是你猜怎么着?只有第一个参数会通过WAF的分析和过滤!
这意味着,经过注入: id=7&id=[SQLi]
WAF的网络层会解析 id=7 <-合法
PHP应用层会解析 id=[SQLi] <-注入语句成功执行
所以,这是一个典型的例子,你注入的东西在网络层和应用层被区别对待了。
下面是一张表格,列举了不一样的框架当屡次接受同一个参数时的不一样表现。像ASP.NET,若是它接受到两个参数值,它会拼接两个相同参数的值,所以你能够将被过滤的关键词拆分到两个参数中进行攻击从而绕过WAF,固然这个主题已经超过这篇文章讨论的范围了。
128.238.66.217/horse.php?id=0&id=7%20union%20select%201,2,3,current_user
你能注意到,全部的注入利用语句都写到了第二个参数值的位置,这将不会被WAF解析。
我获得了第一次正确的返回结果:
csaw_chal1@localhost
接下来就是常规的MySQL注入过程,这里再也不赘述,这篇文章主要在于讲解一种新的绕过WAF的方式,Thx
for reading!
转: http://www.freebuf.com/articles/web/5908.html 谢!