带你挖掘文件包含漏洞之代码审计 #4 实战五个案例
一、文件包含漏洞挖掘要点
核心关键字:require()、require_once()、include()、include_once()(注意:函数名中括号与参数间存在空格,效果相同);
本次实战对象:CMS 系统 ECShop_V2.7.3_GBK_release1106(测试中发现 4 个文件包含漏洞,后续补充第 5 个案例)。
二、实战案例解析
案例一:通过include_once定位的文件包含漏洞
漏洞定位:
以include_once为关键字在 CMS 源码中搜索,发现大量相关调用,其中一处可疑代码位置如下:
进一步定位到具体漏洞文件地址:
代码分析:
双击打开漏洞文件,查看核心代码逻辑:
关键代码:$directory = ROOT_PATH . 'includes/modules/shipping';,结合上下文判断,变量$file可控,无有效过滤。
漏洞利用:
进入includes/modules/shipping目录,新建test.php文件,写入phpinfo()代码:
构造 URL 访问,成功执行phpinfo():
案例二:可控变量$shipping导致的文件包含漏洞
漏洞定位:
搜索发现另一处可疑代码,涉及include_once调用:
打开文件查看详细代码:
代码分析:
变量$shipping通过 POST 请求赋值,且无过滤直接传入包含函数:
include_once(ROOT_PATH . 'includes/modules/shipping/' . $shipping . '.php');,确认$shipping可控。
漏洞利用:
进入includes/modules/shipping目录,确认已存在test.php(含phpinfo()):
构造 POST 请求访问,成功执行代码:
案例三:可控变量$payment导致的文件包含漏洞
漏洞定位:
发现类似案例二的代码逻辑,变量$payment可疑:
代码分析:
$payment通过 POST 请求传入,无过滤直接用于包含:
include_once(ROOT_PATH.'includes/modules/payment/'.$payment.'.php');,确认$payment可控。
漏洞利用:
进入includes/modules/payment目录,新建2.php(含phpinfo());
构造 POST 请求访问,成功执行代码:
案例四:$_REQUEST['code']未过滤导致的文件包含漏洞
漏洞定位:
发现直接使用$_REQUEST['code']的包含代码,无任何过滤:
代码分析:
核心代码:include_once(ROOT_PATH.'includes/modules/payment/'.$_REQUEST['code'].'.php');,code参数完全可控。
漏洞利用:
进入includes/modules/payment目录,新建测试文件;
构造 URL 传入code参数,成功执行代码:
案例五:快速定位的第五个文件包含漏洞
漏洞定位:
延续前序思路,快速发现另一处可控变量的包含代码:
代码分析:
变量无过滤,直接用于文件包含,原理与前四个案例一致。
漏洞利用:
确认包含目录,新建测试文件:
构造 URL 访问,成功触发漏洞:
三、实战总结
文件包含漏洞挖掘核心技巧:定位包含函数→判断变量是否可控→无过滤则可利用。本次在 ECShop 系统中快速发现 5 个漏洞,可见此类漏洞在老旧 CMS 中较为常见,需重点关注用户可控变量的过滤情况。