手注测试并编写sqlmap-tamper绕过某中学waf2020-05-09 金睛安全研究团队
sqlmap可谓是SQL注入的一大神器,但实际使用的时候经常会遇到网站waf的拦截。但是,sqlmap给 我们提供了一种绕过waf的方法——tamper脚本。tamper脚本能按照特定的规则编码或者改变payload,从而绕过防火墙的检测和过滤,达到成功注入的目的。 下面,笔者将记录采用sqlmap- tamper绕过某waf进行注入并获取数据库的实战过程,仅供小白研究学习使用。
首先,在目标网站的查询框输入 1' 测试是否能闭合,结果出现如下500错误,说明单引号成功闭合。
接着测试常用的注释符,发现-- 能成功注释语句后面的内容,此时服务器报错为 '%1' 附近有语法错误。 此处可以看出注入的位置是常见的搜索功能like语句注入%……% 尝试输入 1' or '%'=' 构造闭合, 发现成功返回查询结果,到此发现服务器竟然还没有过滤。由之前的报错信息可以看出服务器采用的ASP.NET架构,那么多半是MSSQL数据库。 那么我们再输入 1' and exists(select * from sysobjects)-- 确认一下。结果成功的触发了网站的waf...
经过笔者艰苦卓绝的手动测试,发现waf拦截了带有from[空格]的请求。将from后面的空格换成 %2b 也就是空格的双重编码,再在语句末尾的注释符前加一个)来闭合原语句的前括号,便可以绕过waf,成功查询出数据。 现在,目标明确了,剩下的就是和这个尽职尽责的waf决斗了。 单刀直入的测试输入1' and 1=(select db_name()))-- ,希望能通过报错得到当前数据库的名字,结果是再一次的waf警告... 经过笔者艰苦卓绝的手动测试X2,发现waf过滤的其中一条规则:等号后跟括号视作违规。那么机智的将等号换成了<> 之后,警报解除。(这里也可以将等号换成%253d )我们从服务器的报错中,成功获取了当前数据库的名字
打码的地方就是数据库的名字 到了这一步,基本上已经可以为所欲为了:爆库名 1' and 1<>(select name from+master.dbo.sysdatabases where dbid=N))--爆任意表和列1' and (select top 1 name from+(select top N id,name from+sysobjects where xtype=char(85)) T order by id desc)>1)--(N的地方换成1,2,3,4……) 但是,搞了这么多,究竟能不能拿到系统的shell呢? 输入1';declare @a int-- ,闭上眼敲出回车。。。
FXXXXXXXXCK!!!!(大写加粗) 好吧,这样说明数据库设置为不支持多行查询,也就说明我们受此限制,无法通过这个sql注入漏洞拿到系统的shell。那么,我们退而求其次,就注出你的敏感数据吧。众所周知,手工注入效率极低,关键时刻还是得上脚本。咱上sqlmap瞧一瞧,先输入最基础的命令:python sqlmap.py -u http://www.target.com/Search/?P=1 --dbms mssql -v3
果不其然,一堆403错误。还能怎么办?上tamper!找到sqlmap的tamper文件夹,随便打开一个tamper脚本,观察其规律,再仿照规律新建一个py文件,前半部分为:
这里的priority指定了tamper脚本的优先级。由于这里我们只用得到这一个tamper,所以随便 设置一个LOW就行了。
进一步观察脚本发现,我们需要定义一个tamper函数来接受并处理sqlmap的原始payload。也就是说,tamper就是一个字符串处理函数,把未处理的payload经由我们想要的方式处理过后再发送请求给 服务器,达到变形payload,绕过waf的目的。 这里总结一下之前手注测试出来的绕waf的tips:
1.末尾注释符要用--
2.单独的函数关键字没有过滤,但联合使用的时候,其间的空格需要用 %0A 来替换以绕过waf
3.CONCAT(***)被严格过滤,可用CONCAT_WS()函数绕过
4.FROM(FROM后跟空格),空格只能用它的双重url编码,即 %2b 绕过
5.与括号连接的等号= ,可用<> 或双重url编码 %253d 来绕过
6.频繁访问会被ban ip,应指定更低的--thread参数,并添加--delay参数
综上,最终的tamper长这个样子:
所以最终在命令行输入python sqlmap.py -u http://www.target.com/Search/?P=1 --dbms mssql --dbs --tamper bypass.py --thread 2 --delay 0.2 就可以看到效果了(可以加上-v3参数观察payload是否按照我们的想法进行了变化)
·
end
·
数据运营·情报赋能