好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Qibocms图片系统任意文件查看导致的多处注入(可提

最大化。 还有个跟之前类似的洞 这里就不多说了。

http://bbs.qibosoft.com/down2.php?v=photo1.0#down

下载地址 还有类似的 就说这里了。 在photo/member/post.php中  

require_once(Mpath."inc/check.postarticle.php"); if($job=='postnew') { if($step=='post') { post_new(); //生成静态 make_article_html("$Murl/member/post.php?job=endHTML&aid=$aid"); $mid && $mid<106 && $none='none'; refreshto("?job=postnew&fid=$fid","<CENTER>[<A HREF='?job=postnew&fid=$fid'>继续发表新主题</A>] <span style='display:$none;'>[<A HREF='?job=post_more&fid=$fid&aid=$aid'>续发本主题</A>]</span> [<A HREF='myarticle.php?job=myarticle&fid=$fid'>返回主题列表</A>] [<A HREF='$Mdomain/bencandy.php?fid=$fid&aid=$aid' target=_blank>查看主题</A>] [<A HREF='?job=edit&aid=$aid'>点击修改</A>]</CENTER>",60); }

在这里 又是包含这个文件进来。 inc/check.postarticle.php 进去看看。  

$postdb[smalltitle]=filtrate($postdb[smalltitle]); $postdb[picurl]=filtrate($postdb[picurl]); //$postdb[description]=filtrate($postdb[description]); $postdb[author]=filtrate($postdb[author]); $postdb[copyfrom]=filtrate($postdb[copyfrom]); $postdb[copyfromurl]=filtrate($postdb[copyfromurl]); $postdb[description]=preg_replace('/javascript/i','java script',$postdb[description]); $postdb[description]=preg_replace('/<iframe ([^<>]+)>/i','&lt;iframe \\1>',$postdb[description]); //针对火狐浏览器做的处理 $postdb[content]=str_replace("=\\\"$webdb[updir]/","=\\\"$webdb[www_url]/$webdb[updir]/",$postdb[content]); if(!$groupdb[PostNoDelCode]){ $postdb[content]=preg_replace('/javascript/i','java script',$postdb[content]); $postdb[content]=preg_replace('/<iframe ([^<>]+)>/i','&lt;iframe \\1>',$postdb[content]); } //采集外部图片 $postdb[content]=get_outpic($postdb[content],$fid,$GetOutPic);

在这里又调用了get_outpic这个函数 可以跟之前发的媒体版结合解析 漏洞 Getshell那样一样的利用。 这里我就不多说这个了、 继续往下面看 看看有神马不同的没。 这里和媒体版的那个还是有不同的  

if($post_db){ foreach($post_db[photourl][url] AS $key=>$value){ $value=trim($value); if(!$value||eregi("://",$value)){ continue; } if(!$postdb[picurl]){ copy(ROOT_PATH."$webdb[updir]/$value",ROOT_PATH."$webdb[updir]/{$value}.jpg"); $postdb[picurl]="{$value}.jpg"; } move_attachment($lfjuid,tempdir($value),$downloadDIR);

在这里$post_db 结合 qibocms的伪全局 直接 提交一下就行了。  

foreach($post_db[photourl][url] AS $key=>$value){ $value=trim($value); if(!$value||eregi("://",$value)){ continue; }

在这里循环出来后 不能让他匹配出:// 然后继续看 if(!$postdb[picurl]){ 当这个为false的时候进入分支所以就不提交这个了。  

copy(ROOT_PATH."$webdb[updir]/$value",ROOT_PATH."$webdb[updir]/{$value}.jpg"); $postdb[picurl]="{$value}.jpg";

然后把循环出来的value copy成jpg。 这里如果我们控制这个$value为配置文件 然后copy成.php.jpg后就可以直接查看配置文件了。 但是这只是一个任意文件读取。 怎么来把他最大利用呢。 继续看在member/yz.php中 elseif($action=='mobphone2') { if($lfjdb[mob_yz]){ showerr("请不要重复验证手机号码!"); } if(!$yznum){ showerr("请输入验证码"); } elseif(!$md5code){ showerr("资料有误"); }else{ unset($code,$mobphone,$uid); list($code,$mobphone,$uid)=explode("\t",mymd5($md5code,"DE") ); if($code!=$yznum||$uid!=$lfjuid){ showerr("验证码不对"); } } add_user($lfjuid,$webdb[YZ_MobMoney],'手机号码审核奖分'); $db->query("UPDATE {$pre}memberdata SET mobphone='$mobphone',mob_yz='1' WHERE uid='$lfjuid'"); 把$mobphone直接带入到了查询当中 而且在set位 如果可以成功引入单引号的话 那可就可以直接提升自己为管理了。 但是qibocms 对全局的GET POST COOKIE都addslashes了。 来看看这函数  

function mymd5($string,$action="EN",$rand=''){ //字符串 加密 和解密 global $webdb; $secret_string = $webdb[mymd5].$rand.'5*j,.^&;?.%#@!'; //绝密字符串,可以任意设定 if(!is_string($string)){ $string=strval($string); } if($string==="") return ""; if($action=="EN") $md5code=substr(md5($string),8,10); else{ $md5code=substr($string,-10); $string=substr($string,0,strlen($string)-10); } //$key = md5($md5code.$_SERVER["HTTP_USER_AGENT"].$secret_string); $key = md5($md5code.$secret_string); $string = ($action=="EN"?$string:base64_decode($string)); $len = strlen($key); $code = ""; for($i=0; $i<strlen($string); $i++){ $k = $i%$len; $code .= $string[$i]^$key[$k]; } $code = ($action == "DE" ? (substr(md5($code),8,10)==$md5code?$code:NULL) : base64_encode($code)."$md5code"); return $code; }

是一个加密解密的函数  如果可以知道key的话 那就可以自己生成一个语句然后来注入了。 然后利用任意文件读取那洞 可以看到key的。 SO Come on.

首先利用任意文件读取。读取data/config.php

 

成功拿到key 然后自己写个脚本 来生成一个语句。  

 

构造一下语句yu',groupid=3 where uid=2# groupid 为3的话即为管理员 不知道uid的话 可以直接就构造yu' 报错后就能看到uid 然后调用函数生成一下语句。  

 

 

成功update。 调用这函数的地方还有很多 —————————————————————————————————————— 在inc/common.inc.php中  

if($_COOKIE["adminID"]&&$detail=mymd5($_COOKIE["adminID"],'DE',$onlineip)){ unset($_uid,$_username,$_password); list($_uid,$_username,$_password)=explode("\t",$detail); $lfjdb=$db->get_one("SELECT * FROM {$pre}memberdata WHERE uid='$_uid' AND username='$_username'"); } if($lfjdb[yz]){ $lfjid=$lfjdb['username']; $lfjuid=$lfjdb['uid']; $lfjdb[icon] && $lfjdb[icon]=tempdir($lfjdb[icon]); if($lfjdb['groupid']==3||$lfjdb['groupid']==4){ $web_admin=$sort_admin='1'; } if( file_exists(ROOT_PATH."data/group/{$lfjdb[groupid]}.php") ){ $groupdb=@include( ROOT_PATH."data/group/{$lfjdb[groupid]}.php");

貌似验证通过了就直接登录后台 来看看。 $_COOKIE["adminID"]&&$detail=mymd5($_COOKIE["adminID"],'DE',$onlineip 在这里 调用了这函数 这里需要注意一下 后面还跟了第三个参数$onlineip 看看第三个参数在函数中起的作用。  

function mymd5($string,$action="EN",$rand=''){ //字符串加密和解密 global $webdb; $secret_string = $webdb[mymd5].$rand.'5*j,.^&;?.%#@!';

加入到了这个$secret_string里面。 然后$onlineip 这个是根据xff来的 最后判断了一下是否是正确的ip 如果不正确 ip就为0.0.0.0 这里我们构造xff为一个错误的ip就行 $onlineip就为0.0.0.0了。 然后再生成一下语句。  

应该可以直接登录后台 懒得弄了。

修复方案:

源头还是任意文件查看。,

查看更多关于Qibocms图片系统任意文件查看导致的多处注入(可提的详细内容...

  阅读:44次