### 简要描述: 看官网上更新到了2.5。。 漏洞是少了不少。。 不好找了。。。找了很久都没找到什么。。 全局GET POST 转义。 ### 详细说明: Indexaction中 ``` public function checkreset() { parent::tologin(); $uModel=D('Users'); $urldata=$_REQUEST['urldata']; parse_str(base64_decode($urldata)); $user_id=intval($user_id); $user_name=str_replace(array("'",'"'," "),"",$user_name); $mailadres=str_replace(array("'",'"'," "),"",$mailadres); $code=str_replace(array("'",'"'," "),"",$checkcode); if (time()-$dateline>3600*5 && $user_id && $user_name && $mailadres && $code) { setcookie('setok', json_encode(array('lang'=>L('reset3'),'ico'=>2)),0,'/');//该地址已经过期,请重新“找回密码” header('location:'.SITE_URL.'/?m=index&a=reset'); exit; } else { $user=$uModel->getUser("user_id='$user_id' AND user_name='$user_name' AND mailadres='$mailadres' AND resetcode='$code'"); if (!$user['user_id']) { setcookie('setok', json_encode(array('lang'=>L('reset4'),'ico'=>2)),0,'/');//地址验证失败,请重新“找回密码” header('location:'.SITE_URL.'/?m=index&a=reset'); exit; } } ``` parse_str 可以覆盖掉其他变量。...
### 简要描述: 看官网上更新到了2.5。。 漏洞是少了不少。。 不好找了。。。找了很久都没找到什么。。 全局GET POST 转义。 ### 详细说明: Indexaction中 ``` public function checkreset() { parent::tologin(); $uModel=D('Users'); $urldata=$_REQUEST['urldata']; parse_str(base64_decode($urldata)); $user_id=intval($user_id); $user_name=str_replace(array("'",'"'," "),"",$user_name); $mailadres=str_replace(array("'",'"'," "),"",$mailadres); $code=str_replace(array("'",'"'," "),"",$checkcode); if (time()-$dateline>3600*5 && $user_id && $user_name && $mailadres && $code) { setcookie('setok', json_encode(array('lang'=>L('reset3'),'ico'=>2)),0,'/');//该地址已经过期,请重新“找回密码” header('location:'.SITE_URL.'/?m=index&a=reset'); exit; } else { $user=$uModel->getUser("user_id='$user_id' AND user_name='$user_name' AND mailadres='$mailadres' AND resetcode='$code'"); if (!$user['user_id']) { setcookie('setok', json_encode(array('lang'=>L('reset4'),'ico'=>2)),0,'/');//地址验证失败,请重新“找回密码” header('location:'.SITE_URL.'/?m=index&a=reset'); exit; } } ``` parse_str 可以覆盖掉其他变量。 但是user_id被intval mailadres username code 的单引号 双引号 都会被替换成空。 $user=$uModel->getUser("user_id='$user_id' AND user_name='$user_name' AND mailadres='$mailadres' AND resetcode='$code'"); 看看语句 也都是被加了单引号的。 但是在这里 他并没有过滤转义符。 而且后面有3个可控的。 所以 可以来利用了。 因为user_id 被intval 所以无法利用。 从user_name开始利用 首先转义user_name后面的单引号 然后user_name 前面的单引号 和mailadres前面的单引号闭合。 然后再注释掉后面的 就可以来注入了。 而且 虽然全局 GET POST 转义 但是他这里解码 所以 无视转义的。 首先是不能进这个的 要不就不能注入了 if (time()-$dateline>3600*5 && $user_id && $user_name && $mailadres && $code) { 那就让code为false把。 而且空格还被过滤了。。 用/**/ 即可。 ### 漏洞证明: [<img src="https://images.seebug.org/upload/201402/23122321be37d22b1a17a55ce96daa718ada757f.jpg" alt="10.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/23122321be37d22b1a17a55ce96daa718ada757f.jpg) [<img src="https://images.seebug.org/upload/201402/2312240000336113e836d0f56290901724c5e7a8.jpg" alt="11.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/2312240000336113e836d0f56290901724c5e7a8.jpg) 注入成功 有图 有真相。