非盲注。 直接出管理的各种数据。
依旧demo测试。
在ask/model/index.class.php中
function attention_action()
{
$this->is_login();//需要登录会员
$is_set=$this->obj->DB_select_once("attention","`uid`='".$this->uid."' and `type`='".(int)$_POST['type']."'");//这里让type为1
if($_POST['type']=='1')
{
$info=$this->obj->DB_select_once("question","`id`='".(int)$_POST['id']."'","`id`,`title`,`uid`");
$gourl= $this->aurl(array("url"=>"c:content,id:".$info['id']));
$content="关注了《".$info['title']."》。";
$n_contemt="取消了对《".$info['title']."》的关注。";
$log="关注了《".$info['title']."》";
$n_log="取消了对《".$info['title']."》";
}else{
$info=$this->obj->DB_select_once("q_class","`id`='".$_POST['id']."'","`id`,`name`");
$gourl= $this->aurl(array("url"=>"c:getclass,id:".$info['id']));
$content="关注了".$info['name']."。";
$n_contemt="取消了".$info['name']."的关注。";
$log="关注了".$info['name'];
$n_log="取消了对".$info['name']."的关注。";
}
if($info['uid']==$this->uid){
echo '4';
}else if(is_array($is_set)){ //这里一开始$is_set为空
所以不会进入这里 当第二次进入的时候 就是数组了 就会进这里面了
所以这个洞 我们一个帐号用一次。
$ids=@explode(',',$is_set['ids']);
if(in_array($_POST['id'],$ids))
{
if($_POST['type']=='1')
{
echo '2';
}else{
foreach($ids as $k=>$v )
{
if($v!=$_POST['id'])
{
$i_ids[]=$v;
}
}
if($i_ids)
{
$n_id=$this->obj->update_once("attention",array("ids"=>@implode(',',$i_ids)),array("id"=>$is_set['id']));
}else{
$n_id=$this->obj->DB_delete_all("attention","`id`='".$is_set['id']."'");
}
if($n_id)
{
$data['uid']=$this->uid;
$data['content']=$n_contemt;
$data['ctime']=time();
$this->obj->insert_into("friend_state",$data);
$this->obj->member_log($n_log);
echo '3';
}
}
}else{
//当不为数组的时候 就是一开始为空的时候
$i_ids=$is_set['ids'].','.$_POST['id'];//这里拼接了$_POST['id] 所以也算部分可控了。
$n_id=$this->obj->update_once("attention",array("ids"=>$i_ids),array("id"=>$is_set['id']));//带入到update中入库
if($n_id)
function attenquestion_action()
{
if($this->uid=='')
{
$this->obj->ACT_msg($_SERVER['HTTP_REFERER'],"请先登录!");
}
$this->public_action();
$ids=$this->obj->DB_select_once("attention","`uid`='".$this->uid."' and `type`='1'","`ids`");//这里出库
$ids=rtrim($ids['ids'],',');//对刚才入库的 赋值给$ids
$pageurl=$this->aurl(array("url"=>"c:".$_GET['c'].",page:{{page}}"));
$question=$this->get_page("question","`id` in (".$ids.") order by `add_time` desc",$pageurl,"10");//没有单引号
if(!empty($question))
{
foreach($question as $k=>$v)
{
$uid[]=$v['uid'];
}
$uids=implode(',',$uid);
$friend_info=$this->obj->DB_select_all("friend_info","`uid` in (".$uids.")","`uid`,`pic`");
foreach($question as $key=>$val)
{
foreach($friend_info as $k=>$v)
{
if($val['uid']==$v['uid'])
{
if($val['uid']==$v['uid'])
{
if($v['pic'])
{
$question[$key]['pic']=$v['pic'];
}else{
$question[$key]['pic']=$this->config['sy_weburl'].'/'.$this->config['sy_friend_icon'];
}
}
}
}
}
}
$this->yunset("question",$question); //这里直接把数据显示出来
if($config['sy_istemplate']!='1' || md5(md5($config['sy_safekey']).$_GET['m'])!=$_POST['safekey'])
{
foreach($_POST as $id=>$v){
$str = html_entity_decode($v,ENT_QUOTES,"GB2312");
$v = common_htmlspecialchars($id,$v,$str,$config);
safesql($id,$v,"POST",$config);
$id = sfkeyword($id,$config);
$v = sfkeyword($v,$config);
$_POST[$id] = $v;
}
}
继续bypass这个
http://www.hr135.com/company/index.php?m=index&c=index&id=3751&style=../../template/admin&tp=/admin_web_config
拿到key 经过计算 继续bypass过滤。
这里需要请求两次。
然后访问 web/web/phpyun32/ask/index.php?m=index&c=attenquestion
直接出数据。 这里我再测试一下demo。
我这里惊人的发现。。 demo有安全狗 我擦 绕过了全局的注入 竟然没过安全狗
懒得去研究安全狗了 直接输出一个 hello phpyun
然后继续
成功出数据。
解决方案:
无尽的过滤。