这是我第一次使用phpstorm+debug来调试代码,关于此次审计也是学习了很多优秀师傅的文章,非常感谢,个人水平较差,文中错误内容还请师傅们指教纠正
其实最近看到许多大佬都在审计这个cms,于是我就去该cms的官网的演示站中,在url中跟了一个逗号发现存在注入,立马提交到某NVD还真的给我归档了,但是还是想搞清楚漏洞原理,这就开始了一次的审计!
debug环境配置这里推荐qing师傅的文章,直接梭哈
这个cms其实爱吃猫的咸鱼师傅和xiaoyu123师傅都审计过了,但是都不是我的这个洞。
咸鱼师傅的漏洞在/Home/c/HomeController.php中342-355行中,用户传入参数url然后进入到find函数中处理
而我这个版本已经是更新过后的,可以看到源码还是有些许不同的了
网站目录结构:
├── 404.html
├── A(admin后台的一些文件,审计重点)
├── Conf(一些网站的配置文件,公共函数)
├── FrPHP(框架)
├── Home(用户的一些文件,审计核心)
├── Public(上传文件保存的地方)
├── README.md
├── admin.php(后台入口)
├── backup(数据库备份文件)
├── cache(网站缓存)
├── favicon.ico
├── index.php(前台入口)
├── install(安装目录)
├── readme.txt
├── sitemap.xml
├── static(一些静态文件)
└── web.config
因为也没学过框架,但是看payload应该也知道应该是控制器出了问题,就决定倒着从payload入手,然后再框架控制器入口处下断点,然后跟踪到问题函数。
首先,开启debug监听小电话和浏览器debug插件
在\Home\c\CommonController.php 入口处18行下好断点,接着在浏览器中输入我们的漏洞url http://127.0.0.1/xinwenfenleier'/13.html
我们不停的F8往下面调试,但是不进入具体的方法中
最后debug停在了\FrPHP\Fr.php中的343行,而我们的浏览器也得到了数据库的报错语句
这个时候我们重新debug一次,跟踪到最后一步也就是fr.php的343行call_user_func_array函数,call_user_func_array是一个回调函数,把数组的参数作为回调函数的参数,也就是下图,我们看到debug信息中调用了jizhi方法,F7跟进去
来到了\Home\c\HomeController.php文件中的jizhi方法,这是一个处理前台所有请求的方法,在debug调试信息我们可以看到我们请求的url
在没有开启url层级的情况下,他会将我们上面得到url参数用 / 分割成数组,在将html参数传给find方法中,我们在F8到70行,看到一个M方法和find方法,先F7跟进M方法
经过debug调试信息得知,这是返回了一个文件路径Frphp\lib\model,所以我们M方法大概率就是加载我们的find函数对应的路径
然后我们在跟进上上图的find方法,路径Frphp\lib\model.php,F7执行到153行 跟进findall方法,
findall方法,也看到没有什么过滤,直接最后拼接到146行的getarray方法,F8执行过去,再F7跟进去
最后来到了\FrPHP\db\DBholder.php 中的getarray方法,65行执行query查询函数,F7跟进去
query函数就是执行SQL语句并打印出来,可以看到debug信息中的查询语句和数据库报错信息。
其中这个这也是一个很基础的漏洞,主要是让自己熟悉phpstorm配合xdebug进行代码调试,对于我这种刚刚代码审计初学者有很多的帮助,在代码不太读得懂的地方可以直观看到代码具体执行过程。如有分析的不对的地方或者见识浅薄的地方还望批评指正。