网站物理路径泄露

一个朋友上周给我发了条链接,网站物理说他们公司官网被客户投诉了。泄露我点开一看,网站物理页面报错信息里赫然写着:Fatal error: require_once() [function.require]: Failed opening required '/home/wwwroot/default/includes/config.inc.php'。泄露服务器绝对路径就这么赤裸裸地挂在浏览器上,网站物理连遮掩都没有。泄露

这就是网站物理典型的网站物理路径泄露。不是泄露什么高深漏洞,但危害一点不小。网站物理攻击者拿到这个路径,泄露等于知道了你服务器上的网站物理目录结构——哪层是web根目录,哪层放配置文件,泄露哪层存日志。网站物理有了这些信息,泄露后续的网站物理本地文件包含、任意文件读取、甚至提权操作,都有了明确的靶子。

我见过最离谱的一个案例,是某电商站点的搜索结果页。正常搜索返回商品列表,但如果在搜索框里输入一个单引号,页面直接崩了,报错信息里不仅带出了物理路径,连数据库用户名和表前缀都一起吐了出来。那个站用的是ThinkPHP 3.2,关闭了调试模式但没关错误显示。运维觉得“反正用户看不到”,结果搜索引擎爬虫把报错页面给收录了。你在Google搜 inurl:index.php?id= 加上 /home/wwwroot 这类关键词,能翻出一堆。

路径泄露的入口远不止报错页面。PHP的phpinfo()页面如果没删,_SERVER["DOCUMENT_ROOT"] 直接告诉你根目录在哪。有些CMS的安装目录不删,访问 /install/ 会提示“请删除install目录”,路径也顺带暴露。还有更隐蔽的——CSS或JS文件里的注释,开发人员调试时留下的绝对路径,比如 /* /Users/zhangsan/project/src/... */,打包上线时忘了清。

Nginx配错也有份。autoindex on; 忘了关,目录列表直接列出来,点进去就是文件系统结构。或者alias路径没写好,访问一个不存在的文件,Nginx返回的404页面里带着 /usr/share/nginx/html/... 这样的路径。Apache的ServerSignature和ServerTokens没设成Prod,版本号和路径一起送出去。

怎么防?最直接的一条:生产环境关闭所有错误显示。display_errors = Off,error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT,日志写到文件里,别往浏览器吐。PHP的expose_php = Off,别让响应头带PHP版本。Nginx的autoindex off;,Apache的ServerSignature Off。这些是底线。

再进一步,web根目录和系统目录要隔离。别把项目直接扔在 /home/wwwroot/default 这种一看就是默认路径的地方,改个名字。配置文件移出web根目录,用include_path或者绝对路径引用,别让URL能直接访问到.inc、.conf这类文件。Nginx里加一条location ~ /\.(?!well-known) 拒绝访问所有点开头的文件。

还有个小细节:自定义错误页面。别用框架自带的调试页面,自己写一个静态的404.html和500.html,里面只写“页面不存在”或“服务器繁忙”,什么路径、什么堆栈都别带。用户不需要知道这些,攻击者更不需要。

我自己的习惯是,每次上线前跑一遍curl -I看响应头,再用nikto扫一遍,最后手动触发几个错误看看返回内容。花不了十分钟,但能堵住大部分低级泄露。路径泄露这事,说大不大,说小也不小——它本身不直接丢数据,但它是很多攻击链的第一步。把第一步掐掉,后面的戏就唱不起来了。