csrf全称跨站请求伪造,攻击者盗用受害者用户的身份,以受害者的身份发送恶意请求
下面进行复现,(本人前端、后端小白,代码有些不规范,大佬们见谅)
这里我创建了三个文件
login.php是用户的登入页面
main.php是商品购买页面
sqlcon.php存放操作数据库的各个函数。
源码如下:
以下代码不只存在csrf漏洞,还存在SQL盲注 有兴趣的可以注一下
login.php页面
<!DOCTYPE html>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="login.php" method="GET">
<p>username: <input type="text" name="username"><br/></p>
<p>password: <input type="text" name="password"><br/></p>
<input type="submit" value="登入" name="login">
</form>
</body>
</html>
<?php
include 'sqlcon.php';
$cookie = loginsql();
if ($cookie == "kong") {
echo "请输入正确的用户名或密码";
}
?>
main.php页面
<?php
include 'sqlcon.php';
if ($_COOKIE['user'] !='xuanling')
{
exit();
}
chaxunprice("apple");
chaxunprice("banana");
if ($_GET['buy']) {
buy($_GET['shangpin'],$_GET['geshu']);
header('Location: http://127.0.0.1/csrf/main.php');
}
?>
sqlcon.php页面
<?php
function sqlconn(){ //连接数据库函数
$servername = "localhost"; //数据库所在主机名
$username = "root"; //使用的数据库的用户名
$password = "root"; //使用的数据库的用户的密码
$dbname = "sql"; //用户所使用的数据库
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("连接失败: ".$dbname);
}
else{
return $conn;
}
}
function loginsql(){ //登入判断函数
$conn = sqlconn();
$sql = "select password from user where username='{$_GET['username']}'";
$result = $conn->query($sql);
if ($result->num_rows > 0)
{
$row = $result->fetch_assoc();
if ($row['password'] === $_GET['password']){
setCookie("user",'xuanling');
header('Location: http://127.0.0.1/csrf/main.php');
}else{
return "kong";
}
}
}
function chaxunprice($name){
$conn = sqlconn();
$sql = "select * from produce where name='$name'";
$result = $conn->query($sql);
if ($result->num_rows > 0)
{
$row = $result->fetch_assoc();
echo '商品:'.$row['name'].' 剩余:'.$row['sum'].' 价格:'.$row['price'].'元';
print <<<EOT
<form action="main.php" method="GET">
<input type="text" value=$name name=shangpin readonly="readonly">
购买的个数:<input type="text" value="1" name='geshu'>
<input type="submit" name='buy' value="购买">
</form>
EOT;
}
$conn->close();
}
function buy($name,$sum){
if ($_COOKIE['user'] !='xuanling')
{
break;
}
$conn = sqlconn();
$sql = "update produce set sum=sum-$sum where name = '$name'";
$conn->query($sql);
$conn->close();
}
?>
构造恶意请求:这里伪装xuanling用户构造恶意请求。为了方便我直接将cookie值设置为xuanling
apple的初始个数是43,如果不知道用户的cookie,将下面的恶意代码发给用户,用户如果此时正在浏览该商品页面,那么用户在不知道的情况下购买了22个apple,(下面url也可以转换成短连接,以增加其隐藏性,让受害者更容易相信,有很多转换短连接的网站大家自行百度)
http://127.0.0.1/csrf/main.php?shangpin=apple&geshu=22&buy=%E8%B4%AD%E4%B9%B0
结果如下:
在实际情况下,如果修改密码的页面存在csrf漏洞,那么可能攻击者就有可以构造出修改密码的恶意代码。