命令执行

Linux

多行命令执行

拼接绕过关键字拦截

利用环境变量完成拼接

列目录:

利用设置变量拼接

编码绕过

base64

hex

others

cat绕过

空格绕过

那么为何$IFS及其衍生的一系列变形可以绕过空格呢?解释如下:

$IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用 ,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

Linux无空格命令执行

某老哥遇到一个极端环境,所有的空格都被过滤了,如何无空格curl呢?

首先肯定想到老几样绕空格:

但是不用这些呢?

Linux下使用这条命令就行了:

把curl的语句hex编码一下就可以了

image-20220710232902877

那么说一下,网上原文为

可能是考虑到在PHP代码中需要把这个$符号进行一次转义,否则会导致PHP认为这是变量,但是如果只是放在shell中,肯定不行。

所以这句话应该写成:

之后,我发现仍然不对(在我的环境下)

可以看到Ubuntu用户和root用户给出的$0是不同的

image-20220710233747298

-bash肯定没法用了

当然,我们面向WEB,则发现wwwapache至少在我的环境里他们都是sh。也就是说这条语句在我目前搭建的这些环境下通用。

过滤/禁用>写入

脏数据

有时候添加一些脏数据对WAF也能起到不错的效果,但是哪些字符对语句无影响,哪些字符对语句有影响,则是我们需要关注的。不同的操作系统,一定有不同的

符号

shell特殊变量

| 变量 | 含义 | | ---- | ------------------------------------------------------------ | | $0 | 当前脚本的文件名 | | $n | 传递给脚本或者函数的参数。这里的n代指一个数字,表示第几个参数。参数不存在时,其值为空 | | $# | 传递给脚本或函数的参数个数 | | $* | 传递给脚本或函数的所有参数,参数不存在时其值为空 | | $@ | 传递给脚本或函数的所有参数,参数不存在时其值为空。被双引号包括的时候,与$*不同 | | $? | 上个命令的退出状态,或函数的返回值 | | $$ | 当前shell进程ID |

image-20220711004202933

于是我们找一些可以不影响命令正常执行的符号来

字符

上面的如果都觉得不过瘾,我们直接滚键盘输入垃圾字符

只需要保证反引号括起来的东西组合出来是个whoami就可以

image-20220711005557636

亦可:

只要保证除$()外的命令能够组合成为一个whoami就行

image-20220711005654709

不太常见的反弹shell之exec反弹shell

image-20220711004847486

Windows CMD

命令分割符

绕过空格

Windows上绕过空格的技巧并非对全部命令都适用,可以按照这个思路去尝试你想要绕过空格的命令能否支持这些方法

image-20220716194813411

然而这些字符无法让ping、net等命令绕过空格

image-20220716195558753

于是我们可以利用环境变量中的空格来代替人为输入的空格

环境变量截取,%%取环境变量,:截取字符串。~10表示从前十开始,1代表取1位,-5代表取倒数第五位。带空格的环境变量您可以通过set命令查看。

image-20220716200148457

红框框选的c:\program正好是10位,从第十位起的第一位就是空格

例如:

image-20220716195657277

正常运行

%path:~10,1以外,还可以是:

拼接绕过关键字过滤

前置知识:%a%==wh 被两个%包裹起来的视为一个变量

%b:~0,1 == 截取第0到1个字母

合起来就是whoami

image-20220710215451377

脏数据

windows的似乎没发现什么好的脏数据填充的绕过姿势,总结下来就这几种

image-20220711010149371

image-20220711010438171

image-20220711010542012

image-20220711010700273

可以发现第二条语句比较有意思,三个双引号仍然可以正常执行

但是值得注意的是"wh""o^a^mi"这种开头有引号的情况是无法正常执行的

命令加个括号仍然可以正常执行,例如

image-20220711011016612

Windows Powershell

Powershell拥有一些独特的特性,所以我们单独拿出来说说。

https://yangsirrr.github.io/2021/08/11/powershell-bypass-tips/

&

可以在命令前面加一个&但是值得注意的是,如果你是在cmd终端下,那么必须得将这个&转义

不转义:

image-20221008173205608

就只会调出powershell,具体原理大家懂的都懂。

转以后就可以正常用了:

image-20221008173302929

函数

image-20221008173716443

字符拆分

参考

https://mp.weixin.qq.com/s/Yj9xgjQud8ScXAuV4JS4og

https://blog.csdn.net/qq_45552960/article/details/104576189

两篇文章都很不错,第一篇文章主要是直接开始介绍各种方法,而第二篇文章除去介绍方法还关注了一下原理方面。所以这两篇文章取长补短,"凑"出了这篇文章。