CSRF漏洞详解与挖掘
CSRF的定义:
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
CSRF攻击原理如下:
- 用户打开浏览器,访问登陆受信任的A网站
- 在用户信息通过验证后,服务器会返回一个cookie给浏览器,用户登陆网站A成功,可以正常发送请求到网站A
- 用户未退出网站A,在同一浏览器中,打开一个危险网站B
- 网站B收到用户请求后,返回一些恶意代码,并发出请求要求访问网站A
- 浏览器收到这些恶意代码以后,在用户不知情的情况下,利用cookie信息,向网站A发送恶意请求,网站A会根据cookie信息以用户的权限去处理该请求,导致来自网站B的恶意代码被执行
这样太过于官方,简单来说就是通过构造URL造成攻击的就是CSRF,用目标的cookie来执行我们的攻击
挖掘工具
- burp
- AWVS
- appscan
- netspark
- CSRFTester(后台回复12855)
- CSRF Request Builder
DVWA靶场演练
初级
更改密码发现构造如下
http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change#
复制
发现规律
password_new=admin&password_conf=admin
复制
两者对应,在表单中为新密码与确认新密码,为此我们构造链接如下
http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=admin123&password_conf=admin123&Change=Change#
复制
**一个扩外的知识点:同学们注意到"?“后跟参数的规律了吧,后续再次拼接就不需要再用问号,使用”&"**进行拼接
返回值为;Password Changed.代表我们操作成功
查看背后代码
例子0X00
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
// Update the database
$insert =