思维导图
见 41WEB攻防
知识点:
- 46、CSRF-原理&检测&利用&防御
- 47、CSRF-防御-Referer策略隐患
- 48、CSRF-防御-Token校验策略隐患
章节点:
Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….
CSRF-无检测防护-检测&生成&利用
检测:黑盒手工利用测试,白盒看代码检验(有无token,来源检验等)
生成:BurpSuite->Engagement tools->Generate CSRF Poc
利用:将文件防止自己的站点下,诱使受害者访问(或配合XSS触发访问)
CSRF-Referer同源-规则&上传&XSS
https://blog.csdn.net/weixin_50464560/article/details/120581841
严谨代码PHP DEMO:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <?php // 检测来源 function checkReferrer() { $expectedReferrer = "http://example.com"; // 期望的来源页面
if (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] !== $expectedReferrer) { die("非法访问"); } }
// 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 检测来源 checkReferrer();
// 获取用户输入的数据 $name = $_POST['name']; $email = $_POST['email'];
// 输出用户输入的数据 echo "姓名:$name<br>"; echo "邮箱:$email<br>"; exit; } ?>
<!DOCTYPE html> <html> <head> <title>检测来源示例</title> </head> <body> <h1>检测来源示例</h1> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <label for="name">姓名:</label> <input type="text" name="name" id="name" required /> <br> <label for="email">邮箱:</label> <input type="email" name="email" id="email" required /> <br> <input type="submit" value="提交" /> </form> </body> </html>
|
绕过0:规则匹配绕过问题(代码逻辑不严谨)
1、
2、http://xx.xx.xx.xx/http://xx.xx.xx.xx
绕过1:配合文件上传绕过(严谨使用同源绕过)
绕过2:配合存储XSS绕过(严谨使用同源绕过)
CSRF-Token校验-值删除&复用&留空
https://blog.csdn.net/weixin_50464560/article/details/120581841
严谨代码PHP DEMO:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| <?php session_start();
// 生成并存储 CSRF Token function generateCSRFToken() { $token = bin2hex(random_bytes(32)); $_SESSION['csrf_token'] = $token; return $token; }
// 检查 CSRF Token 是否有效 function validateCSRFToken($token) { return isset($_SESSION['csrf_token']) && $_SESSION['csrf_token'] === $token; }
// 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 检查 CSRF Token if (!isset($_POST['csrf_token']) || !validateCSRFToken($_POST['csrf_token'])) { die("CSRF Token 验证失败"); }
// 获取用户输入的数据 $name = $_POST['name']; $email = $_POST['email'];
// 输出用户输入的数据 echo "姓名:$name<br>"; echo "邮箱:$email<br>"; exit; }
// 生成 CSRF Token $csrfToken = generateCSRFToken(); ?>
<!DOCTYPE html> <html> <head> <title>CSRF Token 示例</title> </head> <body> <h1>CSRF Token 示例</h1> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <input type="hidden" name="csrf_token" value="<?php echo $csrfToken; ?>" /> <label for="name">姓名:</label> <input type="text" name="name" id="name" required /> <br> <label for="email">邮箱:</label> <input type="email" name="email" id="email" required /> <br> <input type="submit" value="提交" /> </form> </body> </html>
|
绕过0:将Token参数值复用(代码逻辑不严谨)
绕过1:将Token参数删除(代码逻辑不严谨)
绕过2:将Token参数值置空(代码逻辑不严谨)