WEB安全

命令执行的bypass技巧

首先感谢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 也可以正常使用

 

原文链接:http://www.math1as.com/index.php/archives/484/

(0)

本文由 安全周 作者:追梦 发表,转载请注明来源!

关键词:,

热评文章

发表评论