写在前面
这个CVE
复现起来很简单的,直接把Orange
大大的两条指令在有漏洞的PHP版本上跑一下就可以看到效果了。
复现之后,大致看了一下代码,感觉没有太多收获…所以决定调试一下PHP
的gd
扩展的源代码,理解一下到底是怎么导致了这个漏洞点的产生。虽然期间踩了不少坑,但确实是一次不错的尝试。
PHP
源码调试新技能get~
Window下PHP源码编译
这部分工作,主要参考了链接:
这中间遇到了很多坑点,在介绍过程中都会列出来。
准备工作
-
首先装好
Visual Studio 2017
,必须要装的是通用Windows平台开发
和使用C++的桌面开发
,其它的不安装也可以。
-
下载
PHP-SDK
和 有漏洞的PHP
版本。我下载的版本分别是PHP-SDK 2.1.10-dev
和PHP 7.1.10
。(github上都有对应的项目,可以直接下载,前面提到的链接中都有写下载地址)
编译
- 进入到
PHP-SDK
所在目录,我的操作系统是64位的,安装了Visual Stadio 2017
,选择目录下的phpsdk-vc15-x64.bat
来编译。 - 在命令行中执行
phpsdk-vc15-x64.bat
,然后执行phpsdk_buildtree phpdev
,之后会在PHP-SDK
所在目录中出现phpdev
文件夹。 - 将之前下载的
php
源码整个文件夹拷贝到php-sdk/phpdev/vc15/x64/
目录下。 - 进入
php-src
目录,执行phpsdk_deps --update --branch master
命令,下载依赖关系组件(需要等待较长时间)。 - 运行
buildconf.bat
生成configure
文件,执行命令configure --disable-all --enable-cli --with-gd --enable-debug
,这一步是要选择安装哪些组件,刚开始的时候,并没有好好看要这条指令是实现什么功能,导致后来没有gd
扩展。使用configure --help
指令可以查看添加某个扩展对应的参数是什么。
这里要说一下,如果编译php
之后还想再添加一些新的扩展,可以通过单独编译一个扩展,或者重新编译php
实现。但是我查了很多,单独添加一个扩展的话,在Linux
下可以使用phpize
实现,Windows
下的方法后来不想找了,所以选择了重新编译。 configure
指令执行之后,再执行nmake
指令来编译php
,最终编译出来的可执行的二进制文件路径为