学习CTF这么久还没真正意义上审计过一款cms,这次决定花点时间去审计一款cms作为代码审计提升的跳板。由于相关要求,这里就省去cms全名了,主要分享一下学习思路。
其实一般代码审计都是从安装文件开始审计,一般安装脚本主要存在如下漏洞:
无验证功能,任意重装覆盖
表单不做过滤写入config.php导致getshell
$_GET['step']跳过限制步骤
漏洞文件:install.php
首先我们直奔第一个点能否任意重装,我们可以看到必须常量DEL_INSTALLER
为1的时候才会触发删除install.php
,那么我们追踪DEL_INSTALLER
看看
这里可以看到DEL_INSTALLER
默认值就是0,所以一般情况下这里是可以任意重装的,我们从黑盒的测试也可以印证这一点。同时表单也做了过滤所以这里也没有后面两种情况。
在安装完毕后打开config.php
看到两个比较奇怪的常量定义:AUTH_KEY
和AUTH_COOKIE_NAME
从名字来看这连个常量肯定是有一定联系的。如下图:
我们在抓包时候发现了AUTH_COOKIE_NAME
这个常量,说明这是一个cookie名。我们继续再代码中追踪这个常量。
我们可以看到在登录验证cookie中使用了这个常量,我们追踪一下cookie值是如何构造的
emHash
这个类方法,并且这里使用了AUTH_KEY
这个常量,这里说明这两个常量是有联系的。我们在继续追踪hash_hmac()到底使用key做了什么。AUTH_KEY
进行了md5加密到一个二进制字符串中而后分割为64个字节与一个字符*64次的字符串进行异或最后得到两个字符串$ipad
,$opad
最后再将他们打包拼接用md5加密返回给上级调用。我们再回到上级。generateAuthCookie
方法中的 $key
、$hash
是由AUTH_KEY
加密而成。最终的cookie是由$user_login 、 $expiration $hash
拼接而成,而$expiration是cookie的生存时间,$user_login是用户名。这里可以得知$key、$user_login、$expiration都是固定的那么只要知道AUTH_KEY
就有伪造cookie造成越权的可能。AUTH_KEY
得一致。这里有点鸡肋但是还是有利用的可能。我们将两个靶机的cookie拿出来比较确实是一样的。emUnzip
的函数。$dir
,我们看到switch中plugin
选项,这里又将获取的第一个文件夹名称赋值给$plugin_name
,使用getFromName
方法获取了压缩包是否存在$dir . $plugin_name . '.php'
这个文件。综上这里就是检测压缩包中文件夹里面是否存在一个与文件夹名称一致的PHP文件,最后在再压。这里也没对文件进行其他校验操作。因此我们只要再构造 文件夹名和文件名相同的内容的压缩包,同时由上方代码也可以知道,文件将会被解压到 /content/plugins/a/a.php
(文件夹名称a)学习更多技术,关注我: