目录
- 堆叠查询注入
- WAF绕过-SQL注入
- 简要讲解安全狗、宝塔等防护waf策略规则
- 大小写和关键字替换
- 加密解密
- 编码解码
- 等价函数
- 特殊符号
- 反序列化
- 注释符混用
- 更改提交方式
- Fuzz大法
- 数据库特性
- 垃圾数据溢出
- HTTP参数污染
- 实测简易CMS头部注入漏洞Bypass原理分析
堆叠查询注入
stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语多条一起执行。而在真实的运用中也是这样的,我们知道在 mysql 中,主要是命令行中,每一条语句结尾加;表示语句结束。这样我们就想到了是不是可以多条语句一起使用。这个叫做 stacked injection。
堆叠注入是分数据库的,有些支持有些不支持。
堆叠注入是有局限性,仅支持部分数据库(mysql),像sql server、oracle,就不支持。
堆叠查询,就是在原有的代码调用语句执行之上,在注入时,将变量的参数值加入另外一条SQL语句进行注入,就实施我们定义的SQL语句
堆叠注入的一个用处,因为我们讲一个漏洞,如果你不知道,它的一个实际应用的话,学了之后,对我们的印象也不太好,我们也不太知道这个应用的应用场景
注入需要得到管理员的帐号密码,密码是加密的,无法解密出来。这个时候,我们可以利用堆叠注入进行插入数据,由于是我们插入的数据,所以用户密码是自定义的,可以正常解密登录
密码加密经常解密不出来,这个是很正常的,我们可以利用这个注入漏洞,实现堆叠注入。
分享这个例子,只是说它的用处,不要理解为它只能做这个事情,后面的语句可以写成update或者其它语句都是可以的。
一般我们管理员和普通用户在一张表或数据库里面,会用id值和组进行区分,我们只需要把添加的用户设置为1组或2组进行权限的划分,因为很多网站会用这个东西来判定是管理员还是普通用户。
WAF绕过-SQL注入
绕过上传、绕过注入、绕过扫描
WAF:宝塔、安全狗、阿里云盾
阿里云服务器,在初次安装服务的时候,会默认自带阿里云盾
简要讲解安全狗、宝塔等防护waf策略规则
宝塔是一键化的搭建工具,它上面有些插件是要收费的
安全狗的防护能力是跟不上其它防护软件的,用的人比较多是因为它是免费的,而且它的历史比较悠久,它出现的时候,很多WAF还没有出现,例如D盾、360网站卫士、护卫神这些
宝塔比安全狗更难绕过,当我们把宝塔研究清楚之后,很多东西就很好研究了。安全狗只是开胃小菜。
我们一般完成防护软件安装之后,都会去采用默认的防护配置
把安全狗的防护策略全部打开,肯定是会更加安全的,但是有时候正常的访问、正常的地址,你在访问的时候,这个网站也会出现误报,就是它会拦截一些正常的页面和正常的应用。为了防止一些误报,安全狗在安装的时候,会把它关闭,就是为了防止误报。大部分人在安装完之后,会对默认的配置进行初始设置,但是也不排除有些人为了安全,把这些配置全部打开
HTTP安全检测这块除了常见漏洞的拦截,还有一些常见扫描工具的拦截
资源防护这块,有后台地址防护,防止黑客扫描到后台
特定资源防护,假设网站有mdb文件、sql文件,我们在访问的时候,没有WAF,可能直接显示或下载,但是有这种防护软件,你在访问的时候,他会直接拦截
我们经常在扫描网站、目录的时候,工具一开,突然网站就打不开了,这就是流量防护,他根据你自身IP地址请求次数过多,流量速度过快,然后判定你为黑客扫描攻击,直接拦截;这个也是很正常的情况,都有这个经验,都有碰到过
我们讲这个WAF绕过,其实是讲他拦截的这个东西,怎么突破;所以WAF绕过是针对某个漏洞、某个攻击方式的绕过,不是单纯的说怎么绕过,我们能不能进行突破,绕过是有个目标的,这个绕过的东西不一样,方法和思路是不一样的,因为每个东西都有相应的检测规则和绕过方式
程序员在开发这款软件的时候,它会有这个检测,检测是通过代码实现的,所以检测的全,我们就无法绕过,检测的不全,我们就有空子可以钻;所以我们后续在研究如何绕过的时候,就是在测试这个规则都有那些东西,有没有搞全,或者有那些缺陷
代码会决定你的接收方式,有的代码只接受get或者说全部接受,如果只接受get,那么post是接收不到的
采用更改提交方式去绕过WAF,这个思路是正确的,但是后台代码不支持,那就无法攻击成功
我们在学WAF绕过的时候,它的规则其实是多方面的,不仅是一方面
数据:网站参数的数据,大部分过滤是根据你提交的数据有一个检测,所以,我们在数据上会有一个变异来进行绕过
大小写和关键字替换
id=1 UnIoN/**/seLecT 1,user()
Hex() bin()等价于ascii()
Sleep() 等价于 benchmark()
Mid() substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version()
加密解密
s->%73->%25%37%33
hex,unlcode,base64等
编码解码
等价函数
特殊符号
在数据库查询的时候,添加特殊符号,数据库不会受到影响,也能查询出数据,就实现了绕过
WAF在检测的时候,类似于我们在开发里面的正则表达式,就是在我们输入的数据里面去匹配关键性的东西,关键性的东西匹配出来能够跟它数据库里面的字典匹配上,那它就会拦截,如果没有就会放过;我们用这些特殊符号就能够达到
我们绕过的前提条件是既保证了语句的正常运行结果,又能防止软件的正常匹配能够实现绕过。我们的绕过就是围绕这两块做文章
反序列化
把数据以反序列化的格式提交来绕过,但是有一个前提条件,对方的代码是支持反序列化的
注释符混用
// -- --+ # /**/ + :%00 /!**/等
注释符是为了便于代码的可阅读性,数据库当中也有注释符;注释符用的好,就会实现和特殊符号一样的含义,利用注释符可以实现干扰特殊符号的匹配,来实现绕过
这个注释符和特殊符号是要看具体的数据库、具体的情况才能知道的;因为每个数据库的注释符号和特殊符号都是不一样的
WAF拦截关键字拦截的是一个整体,我们可以采取拆分关键字的方法
/**/,mysql特有的注释符,这个是不会影响数据库执行的,database/**/
()就可以绕过拦截
安全狗在匹配到database/**/()的时候。其实就不是原则意义上的database了,是因为有/**/
在干扰,就没有去拦截。
安全狗的很多拦截是针对get型提交方式的
union/**/select
un/**/ion/**/select,执行不了,因为关键字被拆分掉了,数据库识别不了
%0a是换行符,%23是注释符
-1/*%Oa*/union/*%Oa*/select/*%0a*/1,2,3,如果还是拦截那就再加一下干扰字节,例如X、a
#部分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*/
用到了参数污染、数据库特性、注释符混合,这个绕过方式非常的巧妙
这里的%20是不能换成空格的,因为这样就会绕不过去
因为是apache,它接收的是-1%20union%20select%201,2,3%23*/,#号把*/给屏蔽掉了,它不会影响到我们的语句;安全狗是全部接收,1/**-1%20union%20select%201,2,3%23*/但是执行是执行-1%20union%20select%201,2,3%23*/的,因为参数污染只接收后面数据的
/***/是mysql里面的注释符
当前执行语句: SELECT * FROM users WHERE id=-1 union select 1,2,3#*/ 遵循参数污染
安全狗是全部接收,它可能接收1/**-1%20union%20select%201,2,3%23*/也可能接收1/**&id=-1%20union%20select%201,2,3%23*/,中间这串代码实际上是被注释掉了,安全狗误认为后面这串代码没有起到任何作用,实现了绕过
其实是配合参数污染,让安全狗在检测的时候,产生错觉,从而绕过;数据库在接收数据的时候不是接收这个数据,它接收的是-1%20union%20select%201,2,3%23*/
安全狗匹配的时候匹配的是1/**-1 union select 1,2,3#*/或1/**&id=-1%20union%20select%201,2,3%23*/其中符号中起到注释作用,正常情况下没有执行,安全狗直接不管,但是参数污染导致接收的真实数据是-1 union select 1,2,3#*/能正常执行sql
id=-1 %20union%20all%23%0a%20select%201,2,3%23
-1 %20union%20all%23%0a%20select%201,%230%0Adatabase/**/(),3%23
union select 1,2,3#
union #a
select 1,2,3#
换行是让安全狗截止匹配,a是为了防止前后的一个匹配,就是为了保证这个语句的正常执行;单独写个a是绕过了,但是语句错误了,所以我写了个#闭合掉,然后再加个换行符,这样换行符就不会受到#号的干扰,然后select也能够正常拼接到数据库语句当中,数据库执行的原型是union select 1,2,3#;如果不换行,相当于select语句会被屏蔽掉,数据库执行的原型是union #aselect 1,2,3#
mysql数据库是支持换行符的,在数据库当中换行是不会受到影响的,它是能够正常执行的
更改提交方式
前提:代码要能够支持其它方式提交
变异
其它:根据绕过的漏洞,注入里面的数据库,每个数据库有它相应的特性,还会有一些方法,比如垃圾数据
Fuzz大法
fuzz我们称呼为模糊测试,就是暴力测试,什么都不知道,我们就是测试,就是吃西瓜,有点类似于我们对登录密码进行爆破,就是不管三七二十一,就是测试
在爆破的时候,爆破到账号然后成功登录,模糊测试就是这么个意思
fuzz不是一个技术,它是一个概念,一个思路
注入语句的任意一个地方,做个字典,批量的去写脚本生成很多种可能性,依次去请求数据包,来判断数据包在发送的时候,没有被安全狗拦截,那么那条语句的代码就视为绕过了注入
fuzz其实就等同于我们手工不断测试,只是说它利用脚本帮助我们实现,就不需要人工一个个的去访问,我们写好相应的脚本,相应的字典,去批量化的访问这个地址,就完事了
fuzz就是个思路,你明白了这个思路,你就明白了它
fuzz通常是用脚本和工具去批量测试,实际上是要我们去编写脚本,这就是我们学开发的一个很重要的原因
可以用fuzz去测试什么方式可以绕过waf
数据库特性
/*!select * from users*/
数据库特性,在数据库里面仍然能够正常执行
1、Mysgl技巧
(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};
2、SQL Server技巧
(1)用来注释掉注入后查询的其余部分
/* c语言风格注释
– SQL注释
;00% 空字节
(2)空白符:[0x01-0x20]
(3)特殊符号:%3a 冒号
id=1 union:select 1,2 from:admin
(4)函数变形:如db_name空白字符
垃圾数据溢出
HTTP参数污染
多个一样参数的时候,它以那个参数为准,不同的服务端,它的处理方式是不一样的
WAF绕过后面还会有文件上传绕过
我们在实际测试过后,我们这个思路会有点险隘,这个时候,我们就把可能性写到脚本里面,让脚本去帮我们跑,跑出来之后,分析为什么能绕过就完事了,上面那些绕过语句,全都是用fuzz跑出来的
我们只要掌握常见技巧,放到脚本里面跑就完事了,几分钟就能跑出我们的答案来,非常快
我们一个个写一个个猜,是很费时间的
fuzz要看具体情况,有些是用不了的
实测简易CMS头部注入漏洞Bypass原理分析
X-Forwarded-For: 8.8.8.8’ union select 1,2,3,database(),5#,可以直接注入因为安全狗规则里面没有检测头部注入,安全狗是检测URL的