在对CodeDB系统进行安全审计时,发现了一个经典的本地文件包含漏洞(LFI),问题根源在于list.php文件对用户输入的处理存在缺陷。下面分析具体的代码逻辑——漏洞位置非常明显,易于触发。
漏洞代码分析
关键代码片段如下:
2. $lang = htmlspecialchars($_GET['lang']); // ok, but.... for what ? lol
7. if(file_exists('templates/'.$lang.'_middle.php')) // 如果文件存在...
8. include('templates/'.$lang.'_middle.php'); // 直接包含进来
第2行虽然使用了htmlspecialchars对lang参数进行了HTML实体转义,但并未阻止路径遍历攻击。第7行在检查文件是否存在时,直接拼接了$lang变量,随后第8行便执行了文件包含。这意味着攻击者只需通过../进行目录跳转,即可读取服务器上的任意文件——漏洞成因非常直接,属于典型的路径遍历与文件包含结合问题。
漏洞验证示例
实际利用方法非常直观:
https://[host]/[codeDB_path]/list.php?lang=../readme.txthttps://[host]/[codeDB_path]/list.php?lang=../../../../etc/passwdhttps://[host]/[codeDB_path]/list.php?lang=../[local_file]
从这些示例可以看出,只要传入适当的lang参数,就能实现任意文件读取。漏洞成因极为简单:对用户输入缺乏充分的过滤和验证,直接拼接至文件路径中。这种问题在早期PHP应用中较为常见,但如今依然值得警惕——毕竟,仅靠htmlspecialchars无法防御路径遍历攻击,安全开发中必须结合路径白名单、输入校验等更严格的措施。
