PHPMyWind 注入+GetShell 代码审计

一.前言
大家好,我是掌控安全学院的聂风老师
今天写一篇代码审计的文章,分享给同学们学习
这次我们挑选phpMyWind进行审计
PHPMyWind是一个老牌CMS,从2010年开发至今,有15万以上的下载使用量,其安全性也在不断的提高 。
好了,大家开始跟着我的思路学习吧 。
 
二.环境搭建
学习漏洞第一件事就是复现环境:
Phpstudy
PHPMyWind 5.6(http://phpmywind.com/downloads/PHPMyWind_5.6.zip)
代码审计工具(这里拿Seay做演示)
 
三.在审计之前
这个CMS比较老牌,所以我们可以先去查看该CMS的历史漏洞

PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
通过历史漏洞,大致了解CMS的薄弱点,开发人员的思维逻辑等等 。
 
四.审计过程
首先查看index.php文件,开头第一行直接包含了/include/config.inc.php文件,而这个文件又包含了其他好几个文件 。
【PHPMyWind 注入+GetShell 代码审计】在这些被包含的文件中,我们着重看一下common.inc.php 。
 
common.inc.php定义了一个有魔术引号作用的函数_RunMagicQuotes
再看下面45-58行,一个明显的$$,变量覆盖漏洞
实际上这里是一个方便开发的机制,可以使传参转为变量使用,例如我传参a=123 。
那么经过这个处理就变为了$a = 123
PHPMyWind 注入+GetShell 代码审计

文章插图
 
这里记住,我们可以定义变量了 。
我通过全局搜索查询了下,调用这个文件都是文件的开头为主,然后这个文件中被调用的参数大部分都会先初始化参数,然后处理再进行调用 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
然后代码又包含了三个文件
PHPMyWind 注入+GetShell 代码审计

文章插图
 
看开发贴心的注释,这是一个全局配置文件,要是变量覆盖这个在包含common.func.php下面就可以飞起了 。
这三个文件可以先不看,一个是常用函数,一个是各种配置变量定义,还有一个就是连接数据库的文件 。之后就是设置了一些路径之类的变量
 
然后我们还是回来看index.php,整页就没什么有用的地方了 。
各种输出都是读取了数据库里面的数据然后输出 。
 
然后还包含了两个文件,header.php、footer.php,读取这几个PHP后再去按照功能和模块去读取每个文件就行了 。
 
根据我们的信息收集,我们知道了这款CMS,他以前爆过的SQL注入就是因为没用初始化变量SQL,只要想办法跳过这个变量SQL的赋值,就能造成直接传参SQL语句直接执行造成SQL注入 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
我们根据这个思想去找漏洞就很简单,找没有初始化过的传参 。
 
五.SQL注入 1
打开admin目录下面的info_update.php文件
PHPMyWind 注入+GetShell 代码审计

文章插图
 
我们发现第55行有一个变量id,这个地方如果我们能够控制变量id
那么我们可能就可以对这个CMS进行SQL注入,并且这个变量id都没有被单双引号包裹,
如果存在注入,我们都不需要去考虑魔术引号带来的烦恼 。
 
然后这个文件的第57-59行,就是没有初始化这个$id,而且$id的执行语句在初始化之前,算是被我捡到一只漏网之鱼了 。
PHPMyWind 注入+GetShell 代码审计

文章插图
 
但是我这个info_update.php并没有初始化参数,
那么我们就可以控制$id的值,就可以进行SQL注入了 。
我们再来追踪一下GetOne函数究竟干了什么?
看到include目录下面的MySQLi.class.php文件的第262-294行
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
SetQuery函数是替换表名的前缀,然后Execute才是真的执行语句函数,
然后追踪这个函数,他的定义在mysql.class.php这个文件的第165-191行
PHPMyWind 注入+GetShell 代码审计

文章插图
 
 
很明显这的第191行是执行,但是这里很明显要过一个CheckSql的检测 。
这个函数在这个文件的522行被定义 。
PHPMyWind 注入+GetShell 代码审计


推荐阅读