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

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

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

文章插图
然后代码又包含了三个文件

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

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

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

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

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

文章插图
很明显这的第191行是执行,但是这里很明显要过一个CheckSql的检测 。
这个函数在这个文件的522行被定义 。
推荐阅读
- SQL注入获取数据的几种原理
- 这可能是最全的SQL注入总结,很有用
- 注入与攻击测试篇 Kali Linux
- 云龙县,多措并举 为茶业发展注入新活力
- 何谓SQL注入,这个漫画告诉你
- 再一次重现sql注入,黑客技法详解
- Python操作db2数据库时如何防止SQL注入
- 黑客工具sqlmap,带你了解什么是sql注入
- linux ubuntu16.04下搭建sqli-labs注入环境
- 黑客必学知识系列之access注入,带你深入了解黑客的世界
