要对公司内部的某系统做测试审计,但是碰到了加密的PHP文件,因为是采购的第三方整套设备所以只能自己做解密啦。
收集了一下PM9SCREW的信息,该使用的加密拓展名字叫PHP_Screw,这是一款免费的针对PHP源码进行加密的PHP的扩展,可以自定义加密的key,加密后的文件运行效率还不会下降。原理是通过压缩取反然后跟加密的key做异或加密的方式,在使用的时候通过.so文件的拓展文件进行解密然后再运行。并且找到了两个前人写好的工具,参考文章及工具链接如下:
在这里感谢前人的工具,以及如果使用该拓展加密,记得改掉或者隐去头部的字符不要留下线索,以及把.so文件隐藏好。
接上篇blog解密php,该系统听说是处于行业领导地位的运维管理系统,不少大厂也在使用,并且传说该系统没有高危安全漏洞,那我们就来挖掘看看吧。
我们可以看到从上图看出该系统因为历史悠久,在架构上还是使用静态php文件的由方式,并没有使用MVC的结构,整体的系统架构略显臃肿。
从头部引入可以发现,该系统是采用定义$CONFIG数组定义一些变量并包含common.php等文件的设置,利用check_perm方法做权限的与鉴定。其中具体结构的实现细节与本文无关,就不多聊结构问题。
不得不说该系统其实对于安全还是处理的比较到位的,各种sql、xss等注入都过滤处理的比较好,也验证了referer防止了csrf。这时候我想到堡垒机系统肯定需要与系统底层进行一些特殊的操作,譬如底层运维的信息的增删改查要与php动态交互,而此系统采用的是调用python的方法来实现这些功能。那这里面会不会有些问题呢?要是有就是直接getshell的大漏洞了。
其中import_request_variables方法是一个在5.4.0以后就废弃的方法,在5.4.0以后一般推荐extract来代替,作用是将GET/POST/Cookie变量导入到全局作用域中。这句话是中文的解释,通俗点说,就是如果传入了一个”password”变量,那么php会得到一个”$req_password”的全局变量。其他的代码作用我尽量详细的写在注释里面了,方便理解。总之开发者应当是想定义一个接受安全传参的数组,若参数在这个数组内则放行,不在参数内则进行过滤。
那我们找找看有没有在数组内的执行,被我找到了一个在数组内的参数crypt_passwd,所以发现了第一个后台getshell漏洞代码如下:
这里利用了一个python其实并不是一定要换行,也可以使用;来做换行的小trick。结果如图:
但是这样只是一个程序员的疏忽导致的getshell,那有没有办法bypass这个看起来很简单的过滤呢?
根据之前分析的我们知道$req_type和$req_action就是接受了type和action的传参,并且这两个参数都不在safe_req的数组里所以都被过滤了,#[\\\/]#这些特殊字符都不能传参。但是我发现特殊字符的过滤忽略了和-符号,而跟-符号其实是可以通过管道符号和编码绕过过滤和之前的语句,执行自己想要执行的payload甚至反弹shell的。
综上所述我利用base64编码构造了一个绕过过滤的payload:之后发包成功执行反弹shell:矢野浩二老婆傅晶