本实验以简单PHP源码调用关键系统函数,通过WEB执行任意系统命令,有一定的DOS命令基础做起来更轻松。
预备知识:
来了解一下什么是跨站请求伪造(CSRF)?跨站请求伪造是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。攻击者只要借助少许的社会工程诡计,例如通过电子邮件或者是聊天软件发送的链接,攻击者就能迫使一个Web应用程序的用户去执行攻击者选择的操作。例如,如果用户登录网络银行去查看其存款余额,他没有退出网络银行系统就去了自己喜欢的论坛去灌水,如果攻击者在论坛中精心构造了一个恶意的链接并诱使该用户点击了该链接,那么该用户在网络银行帐户中的资金就有可能被转移到攻击者指定的帐户中。
跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种Web安全漏洞,也被称为“one-click attack”或“session riding”。它利用了浏览器对于在同一域名下发送请求时会自动附上相应的cookie的特性。
当CSRF针对普通用户发动攻击时,将对终端用户的数据和操作指令构成严重的威胁;当受攻击的终端用户具有管理员帐户的时候,CSRF攻击将危及整个Web应用程序。
攻击者通过欺骗用户在受信任网站上执行恶意操作,例如点击恶意链接或访问被控制的网站,从而利用用户的身份和权限执行未经授权的操作。
下面是对跨站请求伪造的解析和防御方法:
攻击过程: 攻击者构造恶意请求,通常使用HTML表单,然后将该请求伪装为合法用户发送的请求。
受害者操作: 用户(受害者)在登录了目标网站时,点击了包含恶意请求的链接或访问包含恶意代码的页面。
自动发出请求: 用户的浏览器会自动将用户的cookie添加到请求中,将恶意请求发送给目标网站。
执行攻击: 目标网站接收到请求后,由于没有有效的防护机制,会将该请求当作合法请求处理,从而执行了攻击者欺骗用户执行的恶意操作,可能导致数据泄露、修改、删除等问题。
防御方法:
添加验证码: 在关键操作(如修改密码、更改重要设置)前,要求用户输入验证码进行验证,以防止CSRF攻击。
使用令牌验证: 在用户会话中生成一个随机唯一的令牌(CSRF令牌),并嵌入到表单或请求参数中。目标网站接收到请求后校验令牌的有效性,如果令牌无效,则拒绝请求。
验证请求来源: 目标网站可以通过验证请求头中的Referer或Origin字段来确保请求来源合法。
同源策略: 合理使用同源策略和跨域资源共享(CORS)来限制外部网站对目标网站的请求权限。
限制敏感操作: 针对敏感操作(如修改账户信息、删除数据)要求用户进行双因素认证、增加身份验证等额外的措施。
通过综合应用这些防御方法,可以有效地防范跨站请求伪造攻击,并提高Web应用程序的安全性。
实验环境
IP服务器:win2003+DVWA IP地址:10.1.1.174
测试者:win7,IP地址随机
实验过程与分析
CSRF漏洞和XSS关系比较密切,操作起来比较复杂,可能有的人说在网上看到很简单,其实真正的利用起来实现它的危害还是需要一些功底的。我没找到一套比较合适的可以完整复现其危害的程序,所以这里就仅以DVWA系统自有的漏洞来讨论,其他危害和利用方法不再讨论。
在这个实验中,通过CSRF漏洞在管理员不知情的情况下,诱使管理员点击你伪造好的连接,只要能通过这种方法修改成功密码即可。
现在要更改密码为123
确定之后更改成功,注意现在的URL。
http://10.1.1.174/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
这里要更改的密码直接显示了URL里了,现在就可以通过某种手段把这个URL转换形式或者做成一个链接,诱骗管理员点击,这也就相当于管理员自己发出的更改密码的请求,而这个请求是管理员在不知情的情况下发出的,CSRF攻击就发生了。
攻击者先伪装好这条链接,再通过某种方式发给你,诱使你点击,比如伪装成广告,邮件,信息等等。比如攻击者把它伪装成了一个网页上的链接,其实就是如下代码:
Medium实验源码:
<?php
if (isset($_GET['Change'])) {
// Checks the http referer header if ( preg_match ( "/10.1.1.64/", $_SERVER['HTTP_REFERER'] ) ){
// Turn requests into variables
$pass_new = $_GET['password_new'];
$pass_conf = $_GET['password_conf'];
if ($pass_new == $pass_conf){
$pass_new = mysql_real_escape_string($pass_new);
$pass_new = md5($pass_new);
$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
$result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
echo "<pre> Password Changed </pre>";
mysql_close();
}
else{ echo "<pre> Passwords did not match. </pre>";
} } }
?>
preg_match 是一个正则表达式匹配函数,以这段代码为例,就是在HTTP_REFERER中去匹配 10.1.1.64 这个IP地址。这样可以说在一定程度上减少CSRF攻击的发生,但还是没有根本解决。
现在在已经登录的情况下,新建一个标签打开 http://10.1.1.174/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change#
再重新新建一个标签页,打开上面地址,抓包添加一个referer参数。
修改成功:
想更深度学习有关网络安全方面可以去蚁景网安实验室,里面有大量丰富的学习资源,也有很多CTF来强化自己,夺取flag也挺有意思的,有兴趣的可以去学习。
附链接:https://www.yijinglab.com/