PHPSTORM2018调试bwapp小记

代码审计 2018-10-22

上周看了部门同伴风小半同学使用phpstorm调试了yxcms,分析了其中的一个固定会话攻击漏洞。

刚好前段时间在研究php的代码审计,总是依赖肉眼+rips/Fortify这样其实不是自己想要的一种方式。

毕竟肉眼看不过来那么多,工具可能会有误/漏报,使用IDE像代码开发人员一样跟踪变量和语句其实才是安全研究想要的效果。

看了好几款php的ide,最后还是选择了jetbrains旗下的phpstorm,为什么呢?

因为idea和pycharm都安装了,激活服务器都搭好了,多来一个争取早日集齐全家桶,哈哈

之所以先分析bwapp也是对它相对比较熟悉,代码简单漏洞多,适合入门

古月蓝旻

环境准备

其实环境准备我也不打算多说的,但是坑点太多,这里我先给一下我自己用到的教程,然后说下我遇到的坑

系统:Windows 7 SP1
内存:4G
版本:PHPStorm 2018.1.1
中间件全家桶:Wampserver 3.1.4_x64(各组件版本见下图)
php项目:bwapp源码包
xdebug版本:v2.6.1
xdebug helper版本: v1.6.1

搭建教程我主要参考以下两篇,相互补全,一定需要仔细看

最详细的phpstorm+xdebug调试详细教程

PhpStorm本地断点调试

下面说下坑,搭建顺利的小伙伴可以跳过

坑点1:

PHPStorm 2018.1.1这个先说下,其实现在更高版本早就有了,之所以用这个是因为jetbrains旗下产品自PHPStorm 2018.2.x版本起使用新的反激活机制,使用公网主机反代激活的方式被封杀,替换文件+注册机激活方式自己一向不太爱用,所以还是用了相对老一点的版本,其实完全不影响。

坑点2:

其实我这台测试主机是我的虚拟机,经典win7,4G内存勉强够用,原先就安装了老版本wampserver+iis,但是为啥现在用最新版wamp呢(下载需FQ)?

因为老版本wamp查看phpinfo的时候,将页面信息粘贴到https://xdebug.org/wizard.php,查询该装啥版本xdebug的时候,直接告诉我Compiler MSVC9 is old,编译器太老了?

好吧,那就装个新版wamp好了,于是翻越万里长城去官网下了最新版,安装到最后来了一个“VCRUNTIME140.DLL缺失”

后面在win7上打开ss时也提示“.net framework版本至少要4.6”

其实这几个问题是一样的,都在暗示win7 sp1已经不行了,编译器和安装的框架,runtime库都老了

于是索性见招拆招呗,缺啥补啥,直接一套net framework 4.7补上,VC++ 2015运行库补上

坑点3:

xdebug的dll是一定要安装的,然后其中的ide key可以去phpinfo界面查看,一开始我以为和教程一样都是phpstorm,结果我自己的是主机名,简直哭晕在测试,phpstorm的设置要改成一样的,然后我安装的最新版wampserver安装的php7其实自带xdebug.dll拓展,只是没有开,所以php.ini里要开,至于怎么开,我自己是这样的

开之前phpinfo画风是这样的

开之后phpinfo画风是这样的

坑点4:

虚拟机里最好安装一个新版chorme,调试方便,然后xdebug helper插件也是需要安装的,建议FQ到谷歌商店安装,直接下载crx文件导入安装在我这里失败了,而且xdebug helper记得右键单击“选项”配置一下“IDE KEY”,如果你和我一样key值画风诡异,建议选择other然后自己输入

我遇到的坑点大致这些,反正环境搭建一波三折,其实windows10+xampp就没这么多乱七八糟的问题,权当锻炼一下解决问题的能力了

bwapp

上面也说了这次的任务是调试bwapp,以前我安装bwapp直接官网下载个虚拟机,方便又快捷,这回不行了,还好bwapp官方很贴心的把源码包也放出来了,所以我们直接去官网下载源码包,然后拖到wamp的目录下

在wamp启动的情况下即可安装

安装参考渗透测试平台bwapp简单介绍及安装

其实很简单,把bwapp/admin目录下的settings.php文件打开,改一下mysql数据库root用户的密码,然后访问http://x.x.x.x/bwapp/install.php,然后单机一下安装就完成了,非常方便

如果你和我一样安装的是wamp,那么root用户密码默认就是空

此时访问http://x.x.x.x/bwapp/login.php就会正常显示

phpstorm

做完bwapp的工作,接下来就是phpstorm的配置了

首先将bwapp项目源码加载到phpstorm里,File-Open,添加项目路径

可以看到代码成功导入,然后编辑运行/调试配置

然后添加一个运行调试项目,类型是“PHP web page”,老版本是“php web aplication”

起个名字就叫bwapp,编辑一下主机和端口(我的80被占用,这里用81)

添加完成可以单击下面的validate验证一下,记得绝对路径和url要能对上,所以url to validation script这里往往需要改一下,然后点击右下“validate”一路绿勾即可

至此准备工作结束

正式开始

那么我们要调试什么文件呢?

想了一下还是调试登录页面login.php吧,看看输入正确密码和错误密码时,相关变量的变化情况

所以我们在44行查询语句处下个断点,然后右上角选择我们配置的server并且打开监听

$recordset = $link->query($sql);

之后直接右上角单机运行,然后浏览器打开login.php

由于这里下断点的地方是登录查询处,不涉及页面生成,所以页面很快打开,我们先试一下使用正确的用户名密码登录,各变量情况

直接输入bee/bug,然后。。。。什么也没抓住,因为没启用xdebug helper插件,现在我们激活一下,再来一次

可以看到成功拦截,网页左上角不停转圈,类似burp抓包中效果,phpstorm断点处也出现?,底下也出现了很多变量值

当我们把光标移动到断点上面的php变量的时候,可以看到断点前变量的当前值

我们可使用F7进行单步调试,也可以使用F8步过函数,当我使用F7时,44行的$recordset 变成什么了呢?

返回一个mysqli结果集,其中num_rows=1说明数据库中有一行是这样的,说明结果正确

然后一路F7或者F8跟踪可以看到,后续开始创建cookie,session然后跳转到portal.php了,而chorme页面也跳转过去了,这里不多截图了

如果输入错误的帐号密码会怎么样?

退出登录,无需重新运行phpstorm,浏览器随便输入一下,断点依然

F7单步调试,看下44行的$recordset 的值

亦是mysqli结果集,其中num_rows=0说明数据库中查无此行,继续跟踪发现会在页面出echo $message变量,显示"Invalid credentials or user not activated!",浏览器显示的很清楚,此处不多截图

至此,使用phpstorm+xdebug简单的小实例就是这样,非常nice,跟多phpstorm使用基础快捷键,见
PhpStorm的使用姿势

调试原理前面的文章有,这里就不多说了,总之非常好用,希望有机会能多调试一些CMS~


本文由 古月蓝旻 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

只有地板了

  1. 鸟云何时归来
    鸟云何时归来

    全网看了很多文章,您这篇相对入门来说很合适,谢谢!

添加新评论