首先这个 CMS 并不怎么出名,拿来当审计样板却很合适。给我的感觉是适合初级水平升中级之间的过程,也算是对上一篇审计文章的后续文了。
审计的版本为: 20180206 发布的免费版 2.0 。另外图很多,建议 PC 端体验更佳!
分析环境及入口
图中的 URL 会出现两个,这是因为部分在公司审计的,部分是周末在家审计的。
官网首页上有文档,里面注明了这套 CMS 所使用环境:
ThinkPHP5.0 MySQL
这样看来实际上我们只需要熟悉 TP5,就能大体知道该 CMS 的请求流程,而 TP5 中有个很有用的东西叫 路由
,通过相关 URL 快速定位源码代码位置。
当然我们在本地部署好站点后,在前台任意点击一个URL:
http://demo.com/index.php?s=/helpcenter/index&id=1
其对应的文件路径为
application/shop/controller/Helpcenter.php
方法则是该文件中的 index()
,参数为 id
。
我的习惯是通读代码,所以让我从中找到了很多有意思的地方。
前台两处任意文件删除
一次删除一个
问题代码位于:
application/wap/controller/Components.php
方法:
这段代码非常直白,居然还是 public
方法,未做任何校验直接删除 post 参数提交过来的文件路径。
我当时看到这里直接是懵逼的,开发新手也不会写这样的代码吧?
删除安装锁文件
Payload:
http://demo.com/index.php?s=/wap/Components/deleteImgUpload
Post Data:
imgsrc=install.lock
权限够的话 imgsrc 参数中如果加 ../
是可以删根目录上级文件夹中文件。
一次删除多个
问题代码位于:
application/wap/controller/Upload.php
方法:
同样的,依然是 public
方法,未做任何校验直接删除 post 参数提交过来的文件路径。
删除安装锁文件
Payload:
http://demo.com/index.php?s=/wap/Upload/removeFile
Post Data:
filename=install.lock,test1.txt,test2.txt
权限够的话 filename 参数中如果加 ../
是可以删根目录上级文件夹中文件。
前台两处 sql 注入
第一处在 getGoodsListByKeyWord
方法
问题出现在 application/shop/controller/Goods.php
文件中,我们直接看到代码。
直接放到 sqlmap 中跑一遍试试:
可以看到,这是一处报错回显的 sql 漏洞。
我们来验证一下。
OK! 我们现在可以直接用 sqlmap 跑库了。
第二处出现在 promotionZone
方法
nice! 这里出现了一个无单引号闭合的 SQL 拼接,我们持续跟进一下。
先用 sqlmap 测试一下
666666,可以看到攻击是成功的。
其实到这里就应该结束了,我也不知道为什么我要接着写下去。 麻烦的不是如何找漏洞,而是你需要将这些知识通过语言整理出来,让阅读的人能理解,能学习。
安装好 xdebug
后,我们来跟踪调试一波,定位下问题是如何出现的,在那出现的。
当然我们输入:
http://cms.com/index.php?s=/shop/Goods/promotionZone&page=1&group_id=1 AND (SELECT * FROM (SELECT(SLEEP(5)))uNuh)
这段 Payload 后,发现已经中断生效。
接着我们开始单步跟踪。
进入到 thinkphp/library/think/db/Query.php
文件中的 where()
方法。
前台上传 getshell
问题代码位于:
application/wap/controller/Upload.php
中的 uploadFile()
方法。
然后我们来看看验证函数:
上传文件的目录在代码中也有给出:
本地构建 Payload :
Payload脚本
hacker.php
<?php phpinfo(); ?>
Payload.php
有意思的地方
最后还知道了一个开发人员手机号,并确认其姓名。要不要给他打个电话拜个年?