SQL注入总结
一: GET/POST传参注入 :一般情况下有回显
先判断注入类型:?id=1 and 1=1 看过滤了(, ‘, “,等等。
然后判断列的个数: ?id=1’ order by x – a 以引号闭合为例子,x代表数字,来判断列数
2 报错注入
‘ and updatexml(1,concat(0x7e,(select talbe_schema from informaiton_schema.tables where table_schema=’库名’limit 0,1),0x7e)1,) – a 一般形式的字符类报错注入 0x7e为16进制 的 ~ 波浪线符号
3 布尔盲注
and length(database())>1
4 时间盲注
5 二次注入
通常看到 PHP MySQL_real_escape_string()函数时,这个函数的作用是用来防止数据库被攻击,可以利用二次注入。
sqli-labs第25关为例子,admin’#创建这个账号后修改密码,由于单引号闭合后,又加了#,注释了后面的密码,所以修改admin’#的密码相当于直接修改了admin的密码,从而得到flag,实现二次注入
6 宽字节注入:页面和后台的编码不同而产生的漏洞
‘单引号被过滤了,用%df’来拼接成汉字即可绕过(适用于GET传参时)
在POST传参时,用bs修改hex文件来达到目的 例如sqli-labs 第34关
当然,一些汉字(例如:汉)为3个字节时,2个字节一组可以与转义符\相匹配代替%df,从而使转义符失效
7 堆叠注入:可以使用多个SQL语句,多个查询用分号隔开,这就是产生堆叠注入的原因
原理看到函数:Mysqli_multi_query()函数时,可以想到堆叠注入
二 :当存在过滤时,存在的过滤方式
1 如果过滤了 – a 和# 注释方式不管用 可以在注释原来的地方替换为 or ‘1’=’1 来进行闭合,实行SQL注入
例如:preg_replace()函数则为过滤用。一般替换(不能用的字符)为空 。在这个函数中加/i表示大小写都没法用
2 如果过滤了 and 和 or,无法连接代码,可以用&&替换and,||替换or
注意:&&使用需要用url编码:%26%26。不编码的话当作多参数传参,无法生效。
sqli-labs第25关为例子 ,最后需要用information的库,但or会被替换为空,爆出来的结果为infmation,无法爆出所需要的表。所以这里可以采用双写绕过,在报错注入语句里写 from infoorrmation_schema 即可。
3 过滤\s :表示不能有空白 空格可以用%0a或者%a0来替换试试,也可以用select 后面多加个括号()来替换
例如sqli-labs第26关:payload为: ?id=1’||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=’security’))),1))||’0
4 当union和select也被过滤时。先看是不是所有的大小写都被过滤,如果只是单独的,可以用selEct和uniOn来替换。
注意:查表的时候的单引号用database()函数代替,表名可以用十六进制来替代,因为MySQL支持16进制的表达。
三 :基于burp suite修改请求头来进行注入
1 基于reference
2 基于cookie
3 基于X-forward