使用Python对WebGoat执行SQL注入时始终被重定向至登录页面的问题求助
使用Python对WebGoat执行SQL注入时始终被重定向至登录页面的问题求助
看起来你遇到的核心问题是没有在会话中完成WebGoat的登录认证,而且大概率忽略了CSRF令牌的校验——这两个点是WebGoat拒绝请求并强制跳转到登录页的主要原因。我来一步步帮你修正脚本:
问题根源分析
- 缺少登录会话:WebGoat的所有课程接口都要求用户处于已登录状态,你的脚本直接访问了SQL注入课程页面,但会话中没有携带登录状态的Cookie,服务器会直接重定向到登录页。
- 未处理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
相关产品推荐
相关产品推荐

