没有断点,不用动态调试的代码审计,是没有灵魂的。正所谓工欲善其事必先利其器,所以 要想代码审计好,配置环境少不了(单押)。在写完本文之后,后面博客应该就会经常更新代码审计相关的文章了。

前言

没有断点,不用动态调试的代码审计,是没有灵魂的。2020 年初审计了一个 CMS ,写了篇文章PHP代码审计初次尝试之新秀企业网站系统,因为是第一次审计,直接拿起 VSCode 就上了,找函数全部手工使用搜索来定位的,所以这个简单的 CMS 硬是审计了 2天,效率太低了,后来在评论中看到网友 prontosil 的一个贴图:

被惊艳到了,没想到还可以有这种操作,所以本文就这样诞生了,最终配置之后也可以达到同样的效果。

PHP 调试环境

看到专业程序员都是在 macOS 下手动编译安装 PHP 的,这样太硬核了,国光我玩不来,还是使用集成环境吧,安装卸载也会比较方便。下面推荐几个不错的工具:

  • macOS 10.15.6:macOS 程序猿必备操作系统
  • MAMP PRO:经典老牌的 PHP 集成环境
  • Navivat Premium:强大的数据库图形化管理工具
  • Xdebug:PHP 动态调试必备扩展
  • Docker:Docker 里面安装宝塔来调试也是不错的选择(挖个坑 本文暂时没有写到相关的配置细节)

MAMP PRO

MAMP PRO 是 macOS 平台上经典的本地环境应用,专门为专业的Web开发人员和程序员轻松地安装和管理自己的开发环境。类似于 Windows 下的 PHPStudy 支持 PHP 版本切换,Xdebug 配置也比较方便。

下载链接MAC精品软件

下面列举一下基本的环境信息:

组件 端口
Apache 2 8888
Nginx 1.13.2 7888
MySQL 5.7.26 8889
默认 Web 根目录 /Applications/MAMP/htdocs

MySQL

MySQL 配置主要参考下面的截图:

  1. Change password 这里重置 MySQL 的 root 密码很方便,服务停止状态下可以直接修改 root 用户密码
  2. 勾选上之后 可以本地使用类似于 Navicat 的软件来连接本地的 MySQL
  3. MAMP 也自带 PHPMyAdmin 这种 Web 端的 MySQL 管理工具,PHP >= 5.5 环境下即可正常激活使用

PHP

PHP 配置主要参考下面的截图:

  1. 切换 PHP 版本,支持:5.4.45、5.6.40、7.0.33、7.1.32、7.2.22、7.3.9、7.4.2
  2. 右箭头图标,点击可以直接打开对应 PHP 版本的 ini 配置文件
  3. Xdebug 扩展,是一个好用的 PHP 扩展,提供调试和性能分析功能,代码审计必备

验证 Xdebug 是否开启,在网站根目录下新建一个 info.php 文件:

➜  htdocs pwd
/Applications/MAMP/htdocs

➜  htdocs ls
MAMP-PRO-Logo.png index.php         info.php

➜  htdocs cat info.php
<?php phpinfo();?>

访问验证查看 phpinfo() 页面信息,搜索 xdebug 关键词,可以搜索到即表示 xdebug 开启成功了:

Xdebug

虽然 Xdebug 扩展开启了,但是 IDE Key 这里显示:no value,所以我们还需要手工在配置一下。手动编辑配置文件:

修改完最后的内容如下:

[xdebug]
MAMP_Xdebug_MAMPzend_extension="/Applications/MAMP/bin/php/php5.4.45/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
 xdebug.remote_enable=1
 xdebug.remote_host=localhost
 xdebug.remote_port=9000
 xdebug.remote_autostart=1
 xdebug.profiler_enable=0
 xdebug.profiler_output_dir="/Applications/MAMP/tmp"
 xdebug.idekey="this_is_your_idekey"

其中 remote_portidekey 是可自定义的,端口国光这里保持默认,idekey 自定义为:this_is_your_idekey 细心的小伙伴会发现我们编辑的这个文件为:php5.4.45.ini

修改完退出时候,这个时候 MAMP 会自动重启服务生效配置。

这里实际上有一个坑,后面我们使用 PhpStorm 去接入 PHP 的时候,PhpStorm 会找不到这个 ini 配置文件,具体到下面章节再来详细说一下解决方法,国光这里先提前说一下相关路径的所在位置:

文件名 位置
可执行文件 php /Applications/MAMP/bin/php/php5.4.45/bin
原版配置文件 php.ini /Applications/MAMP/bin/php/php5.4.45/conf
临时配置文件 php5.4.45.ini /Library/Application Support/appsolute/MAMP PRO/conf

下面进入终端来验证一下路径是否正确:

➜  ~ cd /Library/Application\ Support/appsolute/MAMP\ PRO/conf

➜  conf pwd
/Library/Application Support/appsolute/MAMP PRO/conf

➜  conf ls
httpd.conf    nginx.conf    php.ini       php5.4.45.ini php5.6.40.ini php7.4.2.ini

这个时候再查看 phpinfo() 页面来检验一下,会发现 xdebug 已经设置好了 IDE Key:

新建站点

新秀企业网站系统 PHP 版源码下载: SINSIU_1_0.zip

接下来尝试使用 MAMP 来安装一下这个有漏洞的 CMS。配置细节直接参考下图:

下面来简单讲解一下上面的各个标记的含义:

  1. 添加一个新的 hosts 站点
  2. 添加站点的名称
  3. 自定义站点的名称,此时国光我这里的命名为 sinsiu ,那么此时这个站点就可以通过如下 URL 进行访问了:http://sinsiu:888
  4. 点击可以直接在浏览器打开这个站点
  5. 自定义站点网站根目录的路径信息
  6. 实际上访问 sinsiu 可以打开刚刚网站的原理就是因为 MAMP 编辑了我们本地的这个 hosts 文件了

接着就是常规 CMS 安装了,填写数据库用户名和密码,然后设置网站后台密码等。这一步国光不再赘述,大家可以看到这篇文章,说明肯定是有安全基础的了。

编辑器/IDE

PhpStorm

官网地址Download PhpStorm

JetBrains 公司出品的 IDE,强大好用毋庸置疑的,就是注册码有点难搞,还好国光我学生认证了一下,可以白嫖 1 年,哈哈哈嗝

主题推荐

字体: Monaco 15 主题下面列举两个国光我认为还算不错的主题:

  • Xcode-Dark Theme

  • One Dark theme

本地调试 MAMP

PhpStorm 在配置接入 MAMP 这一块有点坑爹,所以就得多啰嗦一点了。

设置 PHP 解析器

打开 PhpStorm 在菜单栏中依次点击 「 Preference」-「Languages & Frameworks」-「PHP」选择好对应的 PHP 版本,然后在 「CLI Interpreter」解释器中找到对应的 MAMP 中的 PHP 可执行文件:

会发现 PhpStorm 提示了:

Debugger: Not installed

点击刷新按钮右边挨着的 感叹号,查看一下 phpinfo() 的情况:

一开始我也很郁闷,明明前面 MAMP 已经配置开启好了 Xdebug 为啥 PhpStorm 还是没有识别到 Xdebug 开启了呢?仔细观察上面截图,会发现 PhpStorm 是去这里找配置文件了:

/Applications/MAMP/bin/php/php5.4.45/conf/php.ini

而 MAMP 临时编辑的配置文件位置为:

/Library/Application Support/appsolute/MAMP PRO/conf/php5.4.45.ini

知道这个就知道解决方法了,那就是再手工编辑原版 php.ini 文件,点击 「Open in Editor」即可直接在 IDE 中编辑配置文件:

截图:

提取出配置代码,仅供读者参考:

[xdebug]
zend_extension="/Applications/MAMP/bin/php/php5.4.45/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/Applications/MAMP/tmp"
xdebug.idekey="this_is_your_idekey"

设置 PHP 调试器

打开 PhpStorm 在菜单栏中依次点击 「 Preference」-「Languages & Frameworks」-「PHP」-「Debug」,

Debug Port 位置填写我们上面配置的默认端口:9000

然后在菜单中依次点击 「 Preference」-「Languages & Frameworks」-「PHP」-「Debug」-「DBGp Proxy」,

填写上文中自定义的 IDE Key,已经填写对应的 Host 和 Port:

另外需要过滤默认的 MAMP 自带的项目,防止打开这些项目会进入PHPStorm 中的断点。

然后在菜单中依次点击 「 Preference」-「Languages & Frameworks」-「PHP」-「Debug」-「Skipped Paths」,

最后验证下配置,在菜单中依次点击 「 Preference」-「Languages & Frameworks」-「PHP」-「Debug」

打开监听 「Start Listening」,有个小电话按钮会变成绿色,然后点击 「Validate」 验证,在跳出的窗口中点击 「VALIDATE 」,输出如下信息即表示功能正常:

设置 PHPServer

打开 PhpStorm 在菜单栏中依次点击 「 Preference」-「Languages & Frameworks」-「PHP」-「Servers」, 填写本地 MAMP 新建的 Host 站点名称以及对应的 Web 端口,选择 Xdebug:

配置好以上步骤后就可以本地调试了,网站根目录下新建一个 test.php 文件,内容为:

<?php

$a = 'Hello';
$b = 'World';
$c = $a . $b;
echo $c;

右键,按照下图来进行来 「Debug」:

此时会发现本地命令行下的程序调试功能是正常的:

如果要从浏览器中访问调试的话,需要我们手动开启小电话监听,小电话按钮要是打开的绿色状态 :

除了 Debug 单个的 PHP 文件,也可以添加一个 PHP Web Page 将整个网站添加进来,点击「Edit Configurations」:

添加一个 PHP Web Page 即可:

最终效果

以之前的文章新秀:后台语言设置Getshel 为例子,通过 PhpStorm + Xdebug 可以无需抓包,直接在 Debug 中修改值进行调试,最终的效果如下:

VSCode

插件推荐

  • Chinese (Simplified) Language Pack for Visual Studio Code:官方的简体中文包
  • PHP Debug:调试 PHP 必备扩展

  • Vibrancy:毛玻璃主题

  • One Dark Pro:颜色主题

  • vscode-icons-mac:文件图标主题

调试 MAMP

首先使用 VSCode 打开 MAMP 本地的站点源代码:

接着点击左侧的活动栏中的 Debug 图标,点击「创建 lanunch.json 文件」:

选择要调试的语言为 「php」 ,查看 luanch.json 文件配置是否符合你的实际情况:

然后点击左上角的 「运行 Listen for XDebug」,如果提示端口已占用,那么在 PhpStorm 里面把小电话监听状态关闭即可,最终的调试效果如下:

MySQL 数据监控

原理就是开启 MySQL 的日志监控功能,然后从日志中提取分析出 MySQL 的执行语句。MAMP PRO 的默认 MySQL 日志路径为:

/Library/Application Support/appsolute/MAMP PRO/db/mysql57

实际上也可以自定义日志的存储路径,所以 PHPMyAdmin 中利用修改日志存储位置 Getshell 也是用的这个原理(又扯多了)下面直接贴一些 MySQL 日志操作的相关语句吧:

show variables like 'general_log'; # 查看日志是否开启

set global general_log=on; # 开启日志功能

show variables like 'general_log_file'; # 看看日志文件保存位置

set global general_log_file='tmp/general.lg'; # 设置日志文件保存位置

show variables like 'log_output'; # 看看日志输出类型 table或file

set global log_output='table'; # 设置输出类型为 table

set global log_output='file'; # 设置输出类型为file

知道原理之后那么直接使用 Github 上的轮子吧,看了下代码原理就是开启日志,将日志自定义为项目下的 txt 文件,然后从 txt 文件中分析 MySQL 执行语句。

项目地址TheKingOfDuck/MySQLMonitor

脚本要求 Python3 使用前先安装好依赖:

pip3 install pymysql
pip3 install configparser

接着就可以愉快地查看 MySQL 执行日志了:

# git clone 下载源码git clone https://github.com/TheKingOfDuck/MySQLMonitor.git

# 进项目下编辑 ini 配置文件 填写好数据库的相关信息cd MySQLMonitor
➜ vim config.ini

# 下面国光的配置信息 MAMP 数据库端口为 8889cat config.ini
[dbconf]
host=127.0.0.1
port=8889
user=root
password=P@ssw0rd
db_name=mysql
charset=utf8

➜ python3 main.py
[09:24:16]配置解析成功...
[09:24:16]数据库连接成功...
[09:24:16]当前数据库版本为: 5.7.26
[09:24:17]日志状态为:ON
[09:24:17]日志监听中...
[09:24:17]show variables like 'general_log_file'
[09:24:41]set names utf8
...
...
...

总的来说效果还是不错的:

效果和 seay 的源码审计工具里面的 mysql 监控小插件差不多了。

总结

本文可能没哈技术含量,但是编写起来还是十分耗费时间的,写本文只想让后面在 macOS 下配置代码审计环境的小伙伴少走弯路,帮助到更多的人。实际上还有更多不错的方案,比如 Docker + 宝塔 然后 VSCode 远程调试,由于时间有限,先挖个坑,日后有空了再来编写。感兴趣的朋友可以自己先去研究看看,等你们好消息。

参考资料

支持一下

本文可能实际上也没有啥技术含量,但是写起来还是比较浪费时间的,在这个喧嚣浮躁的时代,个人博客越来越没有人看了,写博客感觉一直是用爱发电的状态。如果你恰巧财力雄厚,感觉本文对你有所帮助的话,可以考虑打赏一下本文,用以维持高昂的服务器运营费用(域名费用、服务器费用、CDN费用等)

微信
支付宝

没想到文章加入打赏列表没几天 就有热心网友打赏了 于是国光我用 Bootstrap 重写了一个页面用以感谢支持我的朋友,详情请看 打赏列表 | 国光