PHP|网络安全:小记一次代码审计( 二 )




使用 Ctrl+Shift+F 查找哪些位置调用了 write_file , 在 upload/plugins/sys/admin/Plugins.php#Plugins->_route_file 调用了 write_file函数 , 并且 note[note[key
[‘name’
和 note[note[key
[‘url’
的值是以字符串方式拼接到文件内容的 , 该内容是注释 , 我们可以使用换行绕过 。
查找哪些位置调用了 _route_file , 跟踪 $note 的值是否可控 , 调用该函数的位置有很多 , 最终找到一处可利用 。 在 upload/plugins/sys/admin/Plugins.php#Plugins->setting_save 调用了 _route_file , 由于该函数内容有点多 , 所以我将它拆分成两个界面 , 一些不重要的内容进行闭合 。 画红线的位置是调用到 _route_file 必须设置的 , 可以看到在标蓝色3的位置获取到了 $note 的值 , 分析到这里可以开始复现了 。
使用 burpsuite 抓取请求包 。
修改请求包内容写入构造好的代码 , 可以看到我使用了 %0a 换行去绕过注释 。
在 upload/cscms/config/dance/rewrite.php 可以看到成功写入 。
寻找引用 rewrite.php 的位置 , 懒得去看代码了 , 通过点击各个页面 , 经过不懈努力终于在个人中心的音乐页面找到 , 所以你需要注册一个会员用户 。
重放 burpsuite 抓到的请求包 , 成功输出内容 。
到这里其实事情还没有结束 , 当我尝试写入恶意内容发现被转义了 。

试了 eval、shell_exec 等均被转义 , 但是 assert 没有被转义 , 考虑到 assert 在PHP7版本之后的问题 , 我还是需要找一个更好的办法 。 懒得去看转义的代码了 , 我根据PHP的动态特性使用以下方法成功 RCE 。
总结:此次代码审计使用了通用代码审计思路的两种 , 第一种:根据功能点定向审计、第二种:敏感函数回溯参数过程 , 没有用到的是通读全文代码 。 活用 phpstorm 可以让代码审计的效率大大增加 。

相关经验推荐