Web漏洞-CSRF-CSRF防御 实验步骤

1、进入靶机,启动PHPStudy。

在C:/phpstudy/phptutorial/WWW/csrf目录下,编写代码文件。以下所有文件放入此目录下。

2、在靶机上编写登录前端页面login.html.

<html><meta charset="utf-8">

<form action="login1.php" method="POST">

username:<br>

<input type="text" name="username"><br>

password:<br>

<input type="text" name="password"><br>

<input type="submit" value="Submit">

</form>

</html>

3、编写登录认证页面login1.php。

<?php

session_start();

usr = _POST'username';

pwd=_POST'password';

if(usr==='admin' \&\& pwd==='admin')

{

echo '登录成功!';

$_SESSION"admin"=1;

var_dump($_SESSION);

}

else

{

echo '登录失败!';

}

?>

从测试机访问http://ip/csrf/login.html, 并输入admin / admin登录验证

编写管理页面manage-defense.php,加入密码确认表单及token生成函数。

编写修改密码页面add-pass.php,加入token校验机制,并在token使用一次后,销毁token,将修改后的密码写入passowrd.txt。

manage-defense.php源码:

<?php

session_start();

if($_SESSION"admin"!=1){

die('You are not adminer!!');

}

$csrf_token = sha1(mt_rand() . time() . "Impossible");

_SESSION\["csrf_token"\] = csrf_token;

?>

<html>

<meta charset="utf-8">

<form action="add-pass.php" method="GET">

New password:<br>

<input type="text" name="password_new"><br>

Confirm new password:<br>

<input type="text" name="password_conf"><br>

<input name="csrf_token" value="<?php echo($csrf_token); ?>" type="hidden">

<input type="submit" value="Submit">

</form>

</html>

add-pass.php源码:

<?php

session_start();

if($_SESSION"admin"!=1){

die('You are not adminer');

}

csrf_token = _GET'csrf_token';

if(!isset(_SESSION\["csrf_token"\]) \|\| _SESSION"csrf_token"!==$csrf_token){

echo $csrf_token;

var_dump($_SESSION"csrf_token");

die('Don\'t csrf attack!!');

}

password_new = _GET'password_new';

password_conf = _GET'password_conf';

if(password_new === password_conf){

echo 'pwd changed ok';

$log = fopen("password.txt", "a");

fwrite(log, password_new ."\n");

fclose($log);

}else{

echo "PWDs doesn\'t match!!";

}

unset($_SESSION"csrf_token");

//销毁token

?>

从测试机访问http://ip/csrf/manage-defense.php页面测试

全部填写admin后,确认,会显示更新完毕,然后刷新一会,会显示如下图。

进行一次完整的登录及修改密码过程,验证几个页面联动是否成功。

从测试机重新访问登录页面,验证效果。

在login1.php中加入两行代码以查看token

$csrf_token = sha1(mt_rand() . time() . "Impossible");

_SESSION\["csrf_token"\] = csrf_token;

提交后,可以看到,生成了Token。

然后访问:http://ip/csrf/manage-defense.php页面,修改密码。

可以看到,密码修改成功。密码也被记入了password.txt文件中,可以打开查看。

3、CSRF防御效果验证

验证思路:通过burpsuite抓包重放、删除token等模拟攻击,检测同一个token能否成功修改密码。

启动Burpsuite做好代理配置,开启抓包。启动Firefox访问http://ip/csrf/login.html然后以admin / admin登录,再访问http://ip/csrf/manage-defense.php 页面,修改密码。

密码修改成功。然后再次访问:http://ip/csrf/add-pass.php, 输入两次密码12345678 / 12345678

在Burpsuite中将Token替换为上次使用的Token,然后再转发数据包,发现被拒绝。

可以看到提示,系统检测到了,Token失效的情况。

验证的方法,也可以利用Burpsuite的Repeater修改Token后进行重放

也可看到,检测到Token失效的提示。

实验小结

通过本实验,演示了利用Token机制防止CSRF攻击的工作原理。利用session、Token机制以及用后即销毁的方法,可以防止CSRF攻击。对本实验进行仔细分析,可加深对CSRF的防御机制的深刻理解。

相关推荐
SM177152118382 天前
NSK紧凑型FA系列丝杠技术详解
经验分享·规格说明书
闪闪发亮的小星星2 天前
高斯光以及高斯光公式解释
笔记
cqbzcsq2 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
fofantasy2 天前
NSK SFT3210-2.5 滚珠丝杠技术详解
经验分享·规格说明书
BomanGe102 天前
NSK USS1205N1D0321 紧凑型精密滚珠丝杠技术详解
经验分享·规格说明书
阿米亚波2 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
AIHR数智引擎2 天前
KPI物理失效:AI原生组织的效能重构与技能度量
人工智能·经验分享·职场和发展·重构·ai-native·aihr
自传.2 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding
.千余2 天前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他
自传.2 天前
尚硅谷 Vibe Coding|第二章 AI编程工具生态 学习笔记
笔记·学习·ai编程·尚硅谷·vibe coding