CSRF简介
CSRF(Cross-site request forgery)跨站请求伪造,也有人写出XSRF。黑客伪造用户木匾用户的HTTP请求。然后将这个HTTP请求发送给存在CSRF的网站,有CSRF的网站执行了伪造的HTTP请求,就引发了跨站请求伪造。
漏洞本质
攻击者盗用了你的身份信息,以你的名义发送恶意请求。
以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等
造成的问题包括:个人隐私泄露以及财产安全。
挖掘思路
- 后台功能模块:管理后台、会员中心、添加用户等
- 被引用的核心文件里面有没有验证token和referer相关的代码
- 没带token: 可以直接请求这个页面
- 没带referer:返回相同的数据
CSRF攻击过程
conn.php
<?php
$conn = mysql_connect("localhost","root","root");
mysql_select_db("admin");
mysql_query("SET NAMES GB2312");
login2.php
<?php
header("Content-Type:text/html;charset=utf-8");
if(!isset($_POST['submit'])){
exit('非法访问');
}
$username = $_POST['username'];
$password = $_POST['password'];
include ('conn.php');
$sql = "SELECT * FROM admin WHERE username='$username' and password='$password'";
$result = mysql_query($sql) or die(mysql_error());
if($row = mysql_fetch_array($result)){
session_start();
$_SESSION['username'] = $row['username'];
echo $_SESSION['username'] . ",欢迎登录";
echo '<a href="register.html">添加用户</a>>';
}
register.php
<?php
session_start();
header("Content-Type:text/html;charset=utf-8");
if(!isset($_SESSION['username'])){
echo '<script>alert("请您登陆用户")</script>';
exit;
}
$username = $_POST['username'];
$password = $_POST['password'];
include ('conn.php');
$sql = "INSERT INTO admin(username,password) VALUES('$username','$password')";
$res_insert = mysql_query($sql);
if($res_insert){
echo '<script>alert("注册成功")</script>';
}else{
echo '<script>alert("注册失败")</script>';
}
login2.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="login2.php" method="post">
用户名:<input type="text" name="username"><br />
密码:<input type="password" name="password"><br />
<input type="submit" name="submit" value="点击登录">
</form>
</body>
</html>
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>会员注册</title>
</head>
<body>
<form action="register.php" method="post">
注册用户:<input type="text" name="username"><br />
密码:<input type="password" name="password"><br />
<input type="submit" name="submit" value="用户添加">
</form>
</body>
</html>
首先正确登录进入页面,点击添加用户进入VIP注册页面
使用burpsuite抓包,并生成一个CSRF的poc代码
新建一个html文件,将代码粘贴进去
然后将该html文件拖入注册页面,现实中是发送该页面给受害者,点击submit request按钮,现实注册成功
查看数据库时,发现我们注册的用户名和密码都写进了数据库中
修复方案
- 验证码
- 添加 Referer 验证
- 添加 Token 验证