### 简要描述:
设计缺陷可致任意文件删除 删除lock可直接进行重装直接达到getshell。
或者删除某文件也可以来注入了。
也可导致破坏sql语句。
________________________________________________________________________
P.S.又是1点多了,明天又无法认真上课了。 2014年7月23日 01:30:01
新的一天快乐。
### 详细说明:
依旧官网下的最新版。
在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全局会对'转义变成\' (单引号会被实体化)
截取第一个字符的话 就是一个\了。
[<img src="https://images.seebug.org/upload/201407/2300445520cee601ac45ebbfe30c0e03fb972e35.jpg" alt="p1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/2300445520cee601ac45ebbfe30c0e03fb972e35.jpg)
成功引入了转义符。 如果有两个参数可控的话可以 '\',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刚好也是用户可控的。
来测试一下。
[<img src="https://images.seebug.org/upload/201407/230054363c861858a9ced707b1829852a3847a9f.jpg" alt="p2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/230054363c861858a9ced707b1829852a3847a9f.jpg)
[<img src="https://images.seebug.org/upload/201407/23005447061220dfdbc288dc802001ff4bde8799.jpg" alt="p3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/23005447061220dfdbc288dc802001ff4bde8799.jpg)
可以看到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) 定义了一个. 所以直接加个/就行了
删除的是根目录的构造一下目录。
[<img src="https://images.seebug.org/upload/201407/23010515c265d4366d122325196e1e2fd047f71c.jpg" alt="p4.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/23010515c265d4366d122325196e1e2fd047f71c.jpg)
返回了1 成功删除了。
这里删除了lock就可以进行重装了。
[<img src="https://images.seebug.org/upload/201407/23010923c7350efa1e6f83824ca1c19e0bc26b46.jpg" alt="p5.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/23010923c7350efa1e6f83824ca1c19e0bc26b46.jpg)
这里不会被转义。
[<img src="https://images.seebug.org/upload/201407/23011100d8d19cab12dd2a0f8d2632b1849f8b9b.jpg" alt="p6.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/23011100d8d19cab12dd2a0f8d2632b1849f8b9b.jpg)
访问首页就成功执行代码了。
_________________________________________________________________________
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
就能注入了。
[<img src="https://images.seebug.org/upload/201407/230127520f8c63cced9a105577bdf993734092b1.jpg" alt="p7.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/230127520f8c63cced9a105577bdf993734092b1.jpg)
[<img src="https://images.seebug.org/upload/201407/230128391bebb5a0cd75e9fa4fb474cb94f7029b.jpg" alt="p8.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/230128391bebb5a0cd75e9fa4fb474cb94f7029b.jpg)
两个都是返回的1 说明成功删除了、
就能来注入了。
[<img src="https://images.seebug.org/upload/201407/23012936dbf1393cea9def908273b5363d049089.jpg" alt="p9.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/23012936dbf1393cea9def908273b5363d049089.jpg)
ok 因为删除了拦截文件 所以无拦截。
### 漏洞证明:
见上面吧。 好累。
暂无评论