如何用curl或JavaScript登录网站?PortSwigger实验室登录问题求助
解决PortSwigger CSRF实验的curl与JavaScript自动化登录问题
我在PortSwigger学习XSRF基础内容,已经通过Firefox完成「无CSRF防御漏洞」实验,但用curl脚本和Node.js(axios)尝试自动化登录时,服务器始终返回登录页面,即使提供正确的用户名密码也无法完成认证。下面是修正后的脚本和问题原因说明:
一、修正后的curl脚本
原脚本用--user做HTTP基本认证,但目标站点是表单提交登录,且登录页面需要先获取CSRF令牌(尽管实验本身无CSRF防御,但登录流程仍需验证该令牌)。修正后的脚本先获取CSRF令牌和初始cookie,再POST表单数据完成登录,最后访问个人账号页面:
#!/usr/bin/env zsh # 1. 获取登录页面,提取CSRF令牌并保存cookie csrf_token=$(curl -iLs --compressed --cookie-jar ./tmpCookie.txt \ "https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/login" | grep -oP 'csrf" value="\K[^"]+') # 2. 提交登录表单,带上CSRF令牌和cookie curl -iLs --compressed --cookie ./tmpCookie.txt --cookie-jar ./tmpCookie.txt \ -d "csrf=$csrf_token&username=wiener&password=peter" \ "https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/login" # 3. 访问个人账号页面 curl -iLs --compressed --cookie ./tmpCookie.txt \ "https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/my-account?id=wiener"
二、修正后的JavaScript(axios)脚本
原脚本直接发送JSON格式的登录请求,不符合站点的表单格式要求;同时未获取登录页面的CSRF令牌,也没正确处理会话cookie(会话令牌通常存于cookie而非响应头)。修正后的脚本用表单格式提交,配合cookie jar处理会话,并先获取CSRF令牌:
先安装依赖:
npm install axios axios-cookiejar-support tough-cookie
修正后的代码:
#!/usr/bin/env node const axios = require('axios'); const { wrapper } = require('axios-cookiejar-support'); const { CookieJar } = require('tough-cookie'); // 配置axios支持cookie jar const jar = new CookieJar(); const client = wrapper(axios.create({ jar })); // 从登录页面提取CSRF令牌 async function getCsrfToken(url) { const response = await client.get(url); const csrfMatch = response.data.match(/csrf" value="([^"]+)"/); return csrfMatch ? csrfMatch[1] : null; } // 登录函数 async function authenticate(url, username, password) { try { const csrfToken = await getCsrfToken(url); if (!csrfToken) { throw new Error('Failed to get CSRF token'); } // 表单格式提交登录数据 const response = await client.post(url, new URLSearchParams({ csrf: csrfToken, username, password })); // 登录成功后,cookie已自动保存到jar中,返回客户端实例即可 return client; } catch (error) { console.error('Authentication failed:', error.message); return null; } } // 主函数 async function main() { const loginUrl = "https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/login"; const authenticatedClient = await authenticate(loginUrl, "wiener", "peter"); if (authenticatedClient) { // 访问个人账号页面 const accountResponse = await authenticatedClient.get("https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/my-account?id=wiener"); console.log('Account page status:', accountResponse.status); // 后续可添加CSRF攻击操作,比如修改邮箱等 } } main();
问题原因说明
- curl脚本失败原因:
--user用于HTTP基本认证,而目标站点是表单登录,需要POSTcsrf、username、password三个字段;登录页面会生成CSRF令牌,必须携带才能完成登录。 - JavaScript脚本失败原因:直接发送JSON不符合站点表单格式要求;未获取CSRF令牌导致登录验证失败;未正确处理会话cookie(PortSwigger实验的会话令牌存于cookie中,而非响应头)。
内容的提问来源于stack exchange,提问作者user11492382
相关产品推荐
相关产品推荐

