如何在Python构建 SQL 注入扫描器?
一般而言,SQLi 是最流行和最危险的代码插入技术。 SQLi 攻击旨在向数据库服务器发送恶意 SQL 命令。最常见的攻击目标是批量提取知识。攻击者可以转储包含数千条客户记录的数据库表。根据环境,还可以利用 SQL 注入来切换或删除数据、执行任意操作系统命令或发起拒绝服务 (DoS) 攻击。
用Python构建 SQL 注入扫描器
使用下面的方法,我们将首先提取 Web 表单,因为 SQL 注入是通过用户输入进行的。然后,我们将检查网页中是否存在 SQL 错误,这在检查 SQL 注入攻击时会很有用,最后,我们将在 HTML 表单上进行测试。
为此,我们需要请求和 BeautifulSoup 包。
方法
- 导入模块
- 现在,初始化 HTTP 会话并为您的浏览器设置最新的用户代理
- 现在我们将提取 HTML 网络表单。
- 为此,首先,我们将编写一个函数,在提供 URL 后,将向该页面发出请求,并从中提取所有 HTML 表单标签
- 然后将这些标签作为列表返回。
- 之后我们可以使用这个列表。
- 现在我们将从其响应输出中检查获取的页面是否存在任何 SQL 漏洞。
- 如果它有任何语法错误,则该页面易受攻击。尽管有很多数据库错误,我们将搜索有限的数据库错误,即 Oracle 和 SQL Server 错误,因为这两个错误最常用。
- 现在,我们将对 HTML 网页中的所有表单应用此搜索方法以查找错误
- 我们的脚本已准备就绪,现在我们将对其进行测试。
- 我们将传递必须检测 SQL 注入的 URL。
- 所以我们将通过命令行传递 URL 参数。
程序:
Python3
import requests
from bs4 import BeautifulSoup
import sys
from urllib.parse import urljoin
s = requests.Session()
s.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
def get_forms(url):
soup = BeautifulSoup(s.get(url).content, "html.parser")
return soup.find_all("form")
def form_details(form):
detailsOfForm = {}
action = form.attrs.get("action").lower()
method = form.attrs.get("method", "get").lower()
inputs = []
for input_tag in form.find_all("input"):
input_type = input_tag.attrs.get("type", "text")
input_name = input_tag.attrs.get("name")
input_value = input_tag.attrs.get("value", "")
inputs.append(
{"type": input_type, "name": input_name, "value": input_value}
)
detailsOfForm["action"] = action
detailsOfForm["method"] = method
detailsOfForm["inputs"] = inputs
return detailsOfForms
def vulnerable(response):
errors = {"quoted string not properly terminated",
"unclosed quotation mark after the character string",
"you have an error in your sql syntax;"}
for error in errors:
if error in response.content.decode().lower():
return True
return False
def sql_injection_scan(url):
forms = get_forms(url)
print(f"[+] Detected {len(forms)} forms on {url}.")
for form in forms:
details = form_details(form)
for c in "\"'":
data = {}
for input_tag in details["inputs"]:
if input_tag["type"] == "hidden" or input_tag["value"]:
data[input_tag["name"]] = input_tag["value"] + c
elif input_tag["type"] != "submit":
data[input_tag["name"]] = f"test{c}"
url = urljoin(url, form_details["action"])
if details["method"] == "post":
res = session.post(url, data=data)
elif details["method"] == "get":
res = session.get(url, params=data)
if vulnerable(res):
print("SQL Injection attack vulnerability detected in link:", url)
else:
print("No SQL Injection vulnerability detected")
break
if __name__ == "__main__":
url_arg = "https://www.geeksforgeeks.org/python-programming-language/"
sql_injection_scan(url_arg)
输出:
[+] Detected 0 forms on https://www.geeksforgeeks.org/python-programming-language/.