我正在 Portswigger 上学习 XSRF 的基础知识,并使用 FireFox 完成了实验室:没有防御措施的 CSRF 漏洞。我试图更进一步,从终端完成相同的实验。但是,当我向服务器发送请求时,它会返回登录页面的正文;因此,即使我提供了访问实验室帐户的用户名和密码,身份验证也无法正常工作。
我的目标是使用
curl
测试登录,然后使用 javascript
实现自动化。
这是 Zshell 脚本:
#!/usr/bin/env zsh
curl -iLs --compressed \
--user 'wiener':'peter' --cookie-jar ./tmpCookie.txt \
"https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/login"
curl -iLs --compressed \
--cookie ./tmpCookie.txt \
"https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/my-account?id=wiener"
这是 JavaScript:
//!/usr/bin/env node
const req = require("axios"); // http requests
// Function to authenticate and obtain session token
async function authenticate(url, username, password) {
try {
const response = await req.post(url, { username, password });
return response.headers["session-token"]; // Assuming server returns session token in headers
} catch (error) {
console.error("Authentication failed:", error);
return null;
}
}
// Make authenticated requests.
async function main() {
const urL = "https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/login"
const sessionToken = await authenticate(urL, "wiener", "peter");
}
main();
JavaScript 将凭证作为 POST 正文的一部分发送:
await req.post(url, { username, password })
cURL 命令将其作为 HTTP 基本身份验证发送:
--user 'wiener':'peter'
这是两件截然不同的事情。您可以通过向 cURL 请求添加 JSON 正文(并将其设为 POST 请求)来匹配 JavaScript 版本:
curl -iLs --compressed \
--header "Content-Type: application/json" \
--request POST \
--data '{"username":"wiener","password":"peter"}' \
--cookie-jar ./tmpCookie.txt \
"https://0ad500d004b92108827b3d3c00770085.web-security-academy.net/login"