首先感谢p总提供的精妙思路
在一些存在命令执行漏洞的地方,通常程序员也会做一些过滤
但是这些过滤往往只是针对某些特定字符,或者关键字的,因此存在绕过的方法。
首先我们来看看在UNIX shell下的一些特殊变量
PS2变量,被定义为>号
PS4变量,被定义为+号
Internal Field Separator(IFS)
IFS,也被称为内部字段分隔符,是一个在shell下的特殊变量
它通常包含空格,tab,以及换行符,默认被shell视为一个分隔符
因此,我们可以使用它来代替空格
比如,我们需要输入ls /home
可以使用ls{$IFS}/home 或者 ls$IFS/home
成功的执行了命令
因此,用IFS变量可以绕过对于空格等的过滤
使用<管道符也可以绕过对空格的过滤,如cat<123.txt
感谢@pupiles的文章,提到了如果$IFS后直接跟数字字母,导致被当做变量名
需要用到$IFS$9,如 cat$IFS$91
$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串
如果有php环境,那么%09也是可以使用的
接下来,我们再看看针对常见字符串过滤的绕过方法
一种常见的方法是
使用wget 16进制ip
再执行文件
但是这种方法受到目录可写权限的限制,有时候会不太好用
另一种方法则是使用base64 -d
使用管道符号 echo xxx|base64 -d|bash
而我们还可以用$variable:start 的方法提取环境变量中从start位开始到结尾的字符
或者$variable:start:end 来提取从start位到end位的字符
为防止歧义,必须写成${variable:start:end}的形式
对于有python等脚本语言的环境
也可以使用python -c ''的方法来执行解码绕过
此外expr表达式也可用于字符串的提取
比如expr表达式
$(expr substr $PATH start end)
当然$()其实等效于
因此`expr substr $PATH start end` 也可以正常使用
作者 Blog of Mathias
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论