1、环境搭建
使用PHPStudy环境+MetInfo5.0搭建,将网站源码放入网站根目录,访问安装:
将网站源码放入Seay代码审计工具扫描可能存在漏洞的关键字页面,然后通过白盒加黑盒的方式挖掘漏洞:
配置文件 /include/common.inc.php 在29行将$_request变量传递过来的参数和值注册为变量,这种双$$符号的写法造成变量覆盖漏洞,但这里被覆盖的变量$$key没有被危险函数引用所以没有危害:
2、SQL注入漏洞
打开Seay扫描到可能存在SQL注入漏洞的页面源码/about/show.php和网页,看到$id变量没有经过过滤直接带入数据库语句执行:
将网页url带入sqlmap工具检测是否真的存在sql注入漏洞,看到回显存在 布尔判断注入、时间延迟注入、union联合查询注入三种注入类型:
sqlmap -u "http://192.168.19.131/about/show.php?lang=cn&id=22" --random-agent --batch
漏洞原理研究,使用var_dump()函数查看传入变量的值,看到$id变量从/include/common.inc.php页面的GET请求获取值后没有经过过滤就带入get_one()函数执行sql语句,导致了sql注入漏洞:
3、文件包含漏洞
打开Seay扫描到可能存在SQL注入漏洞的页面源码/about/index.php和网页,看到包含/include/module.php源码和$module变量指定的文件源码:
追踪/include/module.php页面源码,查找$module变量看到当$fmodule变量不等于7时才会对$module变量进行验证,也就是说$fmodule=7就可以指定$module包含任意文件:
在/include/module.php页面源码看到包含了同目录下的common.inc.php文件源码,$fmodule变量和$module变量的值由该页面传入:
修改/about/index.php页面,使用var_dump()函数尝试输出$fmodule变量和$module变量的默认值,看到默认值分别为整型1和字符串show.php:
使用GET请求对$fmodule变量和$module变量进行覆盖,查看回显看到可以成功覆盖:
登入网站后台,上传一个压缩包,压缩包里的文件是一句话木马:
分析网站目录结构发现上传文件目录是根目录下的upload文件夹,通过上传文件回显看到上传后文件重命名为20220401_222657.zip:
使用zip://伪协议覆盖$module变量包含上传的压缩包20220401_222657.zip,然后使用#号解压出压缩包里有恶意php代码的shell.txt文件,包含成功后可以执行任意系统命令:
原文始发于微信公众号(ZackSecurity):【PHP项目审计】MetInfoCMS漏洞审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论