上周看了部门同伴风小半同学使用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
搭建教程我主要参考以下两篇,相互补全,一定需要仔细看
下面说下坑,搭建顺利的小伙伴可以跳过
坑点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/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~
全网看了很多文章,您这篇相对入门来说很合适,谢谢!