PHP审计源码学习
一、渗透测试
起因是朋友问fanwei o2o源码搭建的站后台能不能拿shell,于是我进后台进行了一番尝试,各功能点没什么进展,好多地方过滤了,上传也是白名单,编辑器的1day修了,万幸的是有个拿不到shell但是可以执行sql语句的功能点,再通过fofa提取特征,在其他站点下拿到一份残缺的源码(Git_Extract工具拖出来的源码文件名是中文会乱码,换用GitHack解决)。
这次学习过程中不同时间拿到了三份不同版本的源码(v1.x,v3.x,v6.5),真实环境的站一个是朋友发的那个v3.x的站一个是fofa找的v6.9的站。
尝试Shell写到慢日志绕过priv,需要绝对路径,我是这么找的:
1.写python脚本遍历源码下的所有路径和文件后burp suite访问所有文件甚至是构造畸形参数以尝试出现报错页面。
2.在上传iconv压缩包处上传畸形压缩包制造报错找到了绝对路径
可惜sql语句执行错误,没有写入权限,高版本的话对这里则是做了过滤,替换了反斜杠。
** 二、审计源码**
通过前期翻sql表的信息收集可以知道任务计划表的data字段是序列化后存储在数据库的表里的,所以拿到源码先看了任务计划处功能点的“立即执行计划任务”的操作,使用
“立即执行计划任务”操作会将yanhuo_schedule_list表的data字段值反序列化后再调用类自定义的exec函数,所以我就想通过updata语句修改成我们需要的payload然后流入exec函数,而残缺的源码里正好缺了这部分找不到exec()函数里面咋写的。
源码残缺的太多了,就通过源码特征发现了个高版本(v6.5)而且齐全的源码(但本地搭不起来),在这里审到了 二次注入配合下的文件写入漏洞,只要update语句修改fanwe_conf表里面的字段构造payload,调用update_sys_config()函数触发file_put_contents() 应该就能成功写shell。
在修改佣金提现手续费处会调用update_sys_config()函数
构造payload时要注意:1.对于value字段用addslashes ()函数做了一遍过滤payload插name字段即可.2闭合数组
真实环境下6.9版本的站,修复了这个漏洞(6.9版本对name字段似乎也做了一定黑名单过滤php关键字会替换为空,即使payload尝试写入html文件,也触发不了file_put_contents ()函数
文件上传漏洞(v3.x) ,这个漏洞利用过程比较常规:
do_upload_icon()函数内对上传的zip文件解压后递归删除文件、文件夹
跟进unzip函数
提取压缩包文件名:
这里拼接了我压缩包内文件的文件名(…/ll.php)导致文件创建到上一级目录避免被删除:
三、最后
这次学习觉得很有意思,萌新的一次分享希望能够对大家有帮助!有什么没讲清楚的地方可以回复我