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

使用Python对WebGoat执行SQL注入时始终被重定向至登录页面的问题求助

使用Python对WebGoat执行SQL注入时始终被重定向至登录页面的问题求助

看起来你遇到的核心问题是没有在会话中完成WebGoat的登录认证,而且大概率忽略了CSRF令牌的校验——这两个点是WebGoat拒绝请求并强制跳转到登录页的主要原因。我来一步步帮你修正脚本:

问题根源分析

  1. 缺少登录会话:WebGoat的所有课程接口都要求用户处于已登录状态,你的脚本直接访问了SQL注入课程页面,但会话中没有携带登录状态的Cookie,服务器会直接重定向到登录页。
  2. 未处理CSRF令牌:WebGoat的表单都会包含一个隐藏的CSRF令牌字段(通常叫_csrf),如果提交请求时不带这个令牌,服务器会判定请求非法,同样触发重定向。

修正后的完整脚本

import requests
from bs4 import BeautifulSoup

# 配置WebGoat的基础信息
base_url = "http://localhost:8080/WebGoat"
username = "user12"  # 替换为你的WebGoat用户名
password = "your_password"  # 替换为你的WebGoat密码
lesson_url = f"{base_url}/start.mvc?username={username}"

# 创建会话,保持Cookie和登录状态
session = requests.Session()

# --------------------------
# 第一步:完成WebGoat登录
# --------------------------
login_url = f"{base_url}/login"
login_data = {
    "username": username,
    "password": password
}
login_response = session.post(login_url, data=login_data)

# 检查登录是否成功
if "Invalid username and password" in login_response.text:
    print("登录失败,请检查用户名和密码!")
    exit()
print("登录成功,开始访问SQL注入课程...")

# --------------------------
# 第二步:访问SQL注入课程页面,提取表单信息
# --------------------------
response = session.get(lesson_url + "#lesson/SqlInjection.lesson/1")
soup = BeautifulSoup(response.text, 'html.parser')

# 查找表单和action地址
form = soup.find('form')
if not form:
    print("未找到课程表单,请确认课程URL是否正确!")
    exit()
form_action = form['action']

# 提取查询输入框的名称和CSRF令牌
input_name = form.find('input', {'name': True, 'type': 'text'})['name']
csrf_token = form.find('input', {'name': '_csrf'})['value']
if not csrf_token:
    print("未找到CSRF令牌!")
    exit()

# --------------------------
# 第三步:构造注入请求并提交
# --------------------------
# 你的SQL注入语句(根据课程要求调整)
sql_query = "SELECT department FROM employees WHERE auth_tan='LO9S2V'"

# 构造POST数据,必须包含查询内容和CSRF令牌
data = {
    input_name: sql_query,
    "_csrf": csrf_token
}

# 拼接完整的提交URL
post_url = f"{base_url}{form_action}"

# 提交请求
submit_response = session.post(post_url, data=data)

# 解析并打印课程返回的结果(而不是整个HTML)
result_soup = BeautifulSoup(submit_response.text, 'html.parser')
# 查找课程内容区域(WebGoat的课程结果通常在main-content里)
result_area = result_soup.find('section', {'id': 'main-content'})
if result_area:
    print("提交后的课程响应内容:")
    print(result_area.get_text(strip=True, separator='\n'))
else:
    print("未找到课程结果区域,可能请求仍有问题")

额外注意事项

  • 确保你填写的username和password是WebGoat中已注册的有效账号(如果没有的话,需要先手动注册或者通过脚本调用注册接口)。
  • 不同版本的WebGoat可能在表单字段名或接口路径上有细微差异,如果脚本仍有问题,可以手动打开浏览器的开发者工具,观察正常提交请求时的参数和Headers,对照调整脚本。
  • 提交后尽量解析响应中的课程内容区域,而不是直接打印整个HTML,这样更容易看到注入是否成功。

备注:内容来源于stack exchange,提问作者Florian Dima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:09:33