
2.1 代码调试工具phpStorm+Xdebug
使用phpStorm编辑器可以很直观地看到开源代码文件的结构,使用Xdebug可以方便地、更好地查看可控参数到漏洞产生点的执行过程。将phpStorm与Xdebug结合在一起,可使代码审计效率有极大的提升,如能够快速设置断点、代码高亮、模块跟踪等。
1.phpStorm简介
phpStorm是JetBrains公司开发的一款商用PHP集成开发工具,可随时帮助用户对其程序在开发过程中的编码进行调整,运行单元测试或者提供可视化Debug功能。
phpStorm提供了必不可少的工具,如自动化重构、深层代码分析、联机错误检查和快速修复等。
笔者在审计程序时,常用到的功能是代码追踪,且使用echo、die、var_dump等PHP基础语句来进行调试输出,以便定位代码中有安全隐患的位置。
2.Xdebug简介
Xdebug是一个开源的PHP程序调试器(即一个Debug工具),可以用来跟踪、调试和分析PHP程序的运行状况。
本章程序运行环境是用phpStudy集成包搭建的。此处将用phpStorm+Xdebug+phpStudy 2018来演示Xdebug如何辅助进行代码审计。
2.1.1 配置
这里用的PHP版本是5.3,具体配置步骤如下:
1)打开phpStudy,点击“其他选项”菜单,选择“PHP扩展及设置→PHP扩展”,选中Xdebug。
2)回到“其他选项”菜单,选择“打开文件位置→PHP”,找到php-5.3.29-nts文件夹里的php.ini,搜索Xdebug。在Xdebug模块后面追加(注意,是追加的方式)以下内容:

由此得到xdebug.dll的绝对路径,如下所示,这个路径是笔者自己的路径。

重启一下phpStudy,看一下phpinfo,出现如图2-1所示的界面,表明Xdebug开启成功。

图2-1 Xdebug开启成功
3)打开phpStorm,在菜单栏处依次选择File→Settings→Languages & Frameworks→PHP,设置PHP版本,结果如图2-2所示。

图2-2 在菜单栏中选择PHP版本
其中,PHP language level选择5.3;CLI Interpreter中如果没有显示PHP5.3,则点击当前框后面的按钮,出现对话框,再点击绿色“+”,填写Name为PHP5.3,PHP executable为PHP5.3的php.exe文件的路径,结果如图2-3所示,然后点击OK。

图2-3 php.exe物理路径配置
4)选择Languages & Frameworks→PHP→Debug port,填写Debug port端口为9000。结果如图2-4所示,然后点击OK。

图2-4 填写端口
5)在IDE key中填写PHPSTORM,与php.ini填写的一致。结果如图2-5所示,然后点击OK。

图2-5 IP与端口配置
6)载入要审计的程序。在菜单栏处选择File→Open,选择要审计的程序的文件夹,载入程序后,找到Edit Configurations。结果如图2-6所示。
7)点击Edit Configurations,点击左侧的绿色“+”,选择PHP Web Page(与PHP Web Application一样),点击Server框右侧的按钮。结果如图2-7所示。

图2-6 配置编辑

图2-7 PHP应用配置
点击Server框右侧的按钮后出现对话,点击左侧的绿色“+”,在Name中填写test8(因为载入的程序是在根目录的test8文件夹下,所以笔者就设置了这个名字),在Host中填写localhost/test8(这是程序访问路径),在Port中填写80,Debugger默认为Xdebug。结果如图2-8所示,然后点击OK。

图2-8 调试端口设置
8)回到图2-7所示的页面,选择Server为test8,Browser为Chrome。结果如图2-9所示,点击OK,配置完成。

图2-9 调试时默认浏览器的选择
2.1.2 使用
测试一下test8程序首页的搜索功能,打开/test8/framework/www/search_control.php,如图2-10所示。
在箭头1处,使其为绿色表示开启Xdebug监听模式(可单击变换)。在箭头2处,点击第26行的红点处,使其出现红点,设置为断点(再点击一下红点则取消断点设置)。在箭头1、箭头2处操作完后点击箭头3指向的按钮,跳转到如图2-11所示的页面,并进行如下访问测试:http://localhost/test8/?XDEBUG_SESSION_START=11593,证明Xdebug监听成功。在搜索框中随意输入字符,例如dsada,点击“搜索”按钮就可以在phpStorm上监听了。

图2-10 功能测试

图2-11 测试正常
再次回到phpStorm,可以看到如图2-12所示的监控状态。“2”处为关键词到第26行设置断点处之前调用的所有方法,可以选中每个调用方法,点击查看具体代码。
右侧Variables为请求的参数数据,点击“1”处的按钮后可以重新开启Xdebug监听模式。也可以在设置其他断点后,点击“1”处的按钮重启Xdebug监听模式。这样我们就可以观察到可控参数到漏洞执行处所经过的各方法调用的全过程。

图2-12 监控状态