DVWA V1.9:CSRF(跨站请求伪造)
CSRF 介绍
CSRF是一种攻击,强制终端用户在其当前认证的Web应用程序上执行不必要的操作。
在社会工程(例如通过电子邮件/聊天发送链接)的帮助下,攻击者可能会迫使Web应用程序的用户执行攻击者选择的动作。
成功的CSRF开发可以在正常用户的情况下危及终端用户数据和操作。
如果目标最终用户是管理员帐户,这可能危及整个Web应用程序。
这种攻击也可以被称为“XSRF”,类似于“跨站点脚本(XSS)”,并且它们经常一起使用。
Low 级别
核心代码
<?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 = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );
// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );
// Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}
mysql_close();
}
?>
可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现= =)。
官方提示
没有采取措施来防止这种攻击。
这意味着可以制作一个链接来实现特定的动作(在这种情况下,改变当前的用户密码)。
然后用一些基本的社会工程,让目标点击链接(或者只是访问某个页面),触发动作。
Spoiler: ?password_new=password&password_conf=password&Change=Change.
漏洞利用
方法一:构造链接
最基础的,当受害者点击了这个链接,他的密码就会被改成password
(这种攻击显得有些拙劣,链接一眼就能看出来是改密码的,而且受害者点了链接之后看到这个页面就会知道自己的密码被篡改了)
http://43.247.91.228:81/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change
需要注意的是,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求,所以如果受害者之前用Chrome浏览器登录的这个系统,而用搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利用Chrome浏览器的cookie,所以会自动跳转到登录界面。
有人会说,这个链接也太明显了吧,不会有人点的,没错,所以真正攻击场景下,我们需要对链接做一些处理。
方法二:短链接
我们可以使用短链接来隐藏URL:
如http://dwz.cn/**** 点击短链接,会自动跳转到真实网站
因为服务器域名是ip所以无法生成相应的短链接= =,实际攻击场景下只要目标服务器的域名不是ip,是可以生成相应短链接的。
需要提醒的是,虽然利用了短链接隐藏url,但受害者最终还是会看到密码修改成功的页面,所以这种攻击方法也并不高明。
方法三:构造攻击页面
现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。
这里为了方便演示,就在本地写一个test.html,下面是具体代码。
<img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
<h1>404