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

如何用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();

问题原因说明

  1. curl脚本失败原因:--user用于HTTP基本认证,而目标站点是表单登录,需要POSTcsrf、username、password三个字段;登录页面会生成CSRF令牌,必须携带才能完成登录。
  2. JavaScript脚本失败原因:直接发送JSON不符合站点表单格式要求;未获取CSRF令牌导致登录验证失败;未正确处理会话cookie(PortSwigger实验的会话令牌存于cookie中,而非响应头)。

内容的提问来源于stack exchange,提问作者user11492382

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:30:40