好得很程序员自学网

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

Phpyun设计缺陷致任意文件删除可致重装getshell或注

设计缺陷可致任意文件删除 删除lock可直接进行重装直接达到getshell。 或者删除某文件也可以来注入了。 也可导致破坏sql语句。  

依旧官网下的最新版。 在model/ajax.class.php中  

function delupload_action(){ if(!$this->uid && !$this->username && $_COOKIE["usertype"]!=2){ echo 0;die; }else{ $dir=$_POST[str][0]; $isuser = $this->obj->DB_select_once("company_show","`picurl`='$dir'"); if($isuser['uid']==$this->uid) { echo @unlink(".".$dir); }else{ echo 0;die; } } }

0x01 破坏语句执行  

$dir=$_POST[str][0]; $isuser = $this->obj->DB_select_once("company_show","`picurl`='$dir'");

这里可以看到$dir 如果这时候我们提交的是一个字符串的话 [0] 就成了截取字符的了。 截取的是第一个字符。 因为phpyun全局会对'转义变成\' (单引号会被实体化) 截取第一个字符的话 就是一个\了。  

成功引入了转义符。 如果有两个参数可控的话可以 '\',uesr()#' 类似这样的注入 可是这里只有一个参数 所以能引入转义符的话 也无法注入 只能破坏下语句。 _________________________________________________________________________ 0x02 任意文件删除 删lock 可致Getshell 首先来看他这里的判断  

$dir=$_POST[str][0]; $isuser = $this->obj->DB_select_once("company_show","`picurl`='$dir'"); if($isuser['uid']==$this->uid) { echo @unlink(".".$dir); }else{ echo 0;die; } }

这个判断的意思大概是 $isuser['uid']==$this->uid 这个发布的人必须是你 然后才能进行删除操作。 但是在这里 如果DB_select_once("company_show","`picurl`='$dir'");这个查询出来的是空 然后$this->uid也是空的话 那么就通过了这个判断。  

if(!$this->uid && !$this->username && $_COOKIE["usertype"]!=2){ echo 0;die;

在这里 由于用的是&& 所以只有不满足这三个才会退出 在这里我们不登录会员 然后前面那两个都为true了。 但是$_COOKIE["usertype"]!=2 如果这个为false的话 就不会执行die了。 而且COOKIE刚好也是用户可控的。 来测试一下。  

 

可以看到COOKIE usertype为2的时候就不会退出了。 这时候由于我们并没有登录 所以$this->uid 为空(0) 如果这时候$isuser = $this->obj->DB_select_once("company_show","`picurl`='$dir'"); $dir 并不存在于这个表中的话(我们要删除的文件自然是不会在这个表中的) 那么$isuser['uid'] 也为空。(NULL)  

if($isuser['uid']==$this->uid) { echo @unlink(".".$dir);

这时候就通过了这个判断 可以执行unlink了。 然后$dir也可控。 那不就可以删除任意文件了? 这里我们来删除data/phpyun.lock 达到重装 因为他这之前unlink(".".$dir) 定义了一个. 所以直接加个/就行了 删除的是根目录的构造一下目录。  

返回了1 成功删除了。 这里删除了lock就可以进行重装了。  

这里不会被转义。  

访问首页就成功执行代码了。 _________________________________________________________________________ 0x03 如果不想重装别人 系统 但是要注入呢? 在member/model/com.class.php中  

function product_action() { $this->public_action(); $delid=$_GET['delid']; if($delid){ if(is_array($delid)){ $ids=$this->pylode(',',$delid); $layer_type=1; }else{ $ids=$delid; $layer_type=0; } $row=$this->obj->DB_select_all("company_product","`id` in (".$ids.") and `uid`='".$this->uid."'","`pic`");

$delid=$_GET['delid']; 如果不是数组的话就没过滤 直接带入到了查询当中。 而且没单引号 这里直接删除data/db.safety.php 和 include\webscan360\360safe\360webscan.php 就能注入了。  

 

两个都是返回的1 说明成功删除了、 就能来注入了。  

ok 因为删除了拦截文件 所以无拦截。 修复方案:

修改一下逻辑。 把&&改成|| 咋样? 只是个建议 没多思考。 还是你们自己想想。  

查看更多关于Phpyun设计缺陷致任意文件删除可致重装getshell或注的详细内容...

  阅读:43次