一、连接符
1、双引号
不要求双引号闭合
举例:"who"a"mi" //闭合的 "who"a"mi //不闭合的
![](https://i-blog.csdnimg.cn/blog_migrate/a4b97660722172ee04785d05ebf5f60b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d1a55d57e11ad254dedfa9c26e774fe4.png)
2、圆括号
必须在两边,不能包括中间的字符。
举例:((whoami))
![](https://i-blog.csdnimg.cn/blog_migrate/1806ddf489935cd0de41dca7afd42be1.png)
3、^符号(转译符号)
不可以在结尾,同样不要求闭合
不能同时连续加2个^符号,因为^号是cmd中的转义符,跟在他后面的符号会被转义
举例:wh^o^a^mi
![](https://i-blog.csdnimg.cn/blog_migrate/dfc1eae7b5314f870fde649db4524fed.png)
4、常规替换
%变量名:需要替换的内容=值%
如下举个例子:@符号能够将值传递到前面的环境变量中,如下就是将test传到c@alc的@位置,输出将是ctestalc。
cmd /c "set x=c@alc & echo %x:@=test% | cmd"
![](https://i-blog.csdnimg.cn/blog_migrate/6dd017c813ae8d7a2f9afcef4659edb8.png)
二、set命令和Windows变量
%任意字符%默认为空值。
set用来设置一个变量,%%括起来的用来引用变量,举例如下:
set a=whoami //设置变量a=1
echo a //输出一个a字符
echo %a% //输出变量a的值
%a% //直接引用a变量内的值进行执行
![](https://i-blog.csdnimg.cn/blog_migrate/e3a8ce9cbb39d8175e8f4be31b8f52a0.png)
多环境变量合并拼接利用
cmd /c"set a=ser&& set b=ne&& set c=t u&&call %b%%c%%a%"
cmd /c "string":表示:执行字符串string指定的命令,然后终止。
cmd /V:ON /C "set a=ser&& set b=ne&& set c=t u&& !b!!c!!a!"
/v:on : 启用延迟的环境变量扩展,启用的话,可以不使用call命令来扩展变量,使用%var%或!var!来扩展变量,也就是可以使用感叹号字符来替代运行时的环境变量值。
![](https://i-blog.csdnimg.cn/blog_migrate/7900804f794d439a49563ec9049cf040.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b5a0540620e44af0e15cee8f3f540c69.png)
三、切割字符串
命令行中存在类似php和python之类的语言中截取字符串的用法。
截取字符串的语法:%变量名:~x,y%
即对变量从第x个元素开始提取,总共取y个字符。
当然也可以写-x,-y,从后往前取
写作-x,可取从后往前数第x位的字符开始,一直到字符的末尾
-y来决定少取几个字符
举例如下:
set a=whoami
echo %a%
%a:~0% //取出a的值中的所有字符 //此时正常执行whoami
%a:~0,6% //取出a的值,从第0个位置开始,取6个值 //此时因为whoami总共就6个字符,所以取出后正常执行whoami
%a:~0,5% //取5个值,whoam无此命令
%a:~0,4% //取4个值,whoa无此命令
![](https://i-blog.csdnimg.cn/blog_migrate/5c2fa012fe0eb5ae49239ba26002b493.png)
echo %a%
echo %a:~-5% //从后往前5个字符
echo %a:~-5,-1% //从后往前5个字符并且去掉最后一个
echo %a:~-5,1% //从后往前5个词组并且值展示第一个字符
![](https://i-blog.csdnimg.cn/blog_migrate/07bca957cace46ba6354dc0d003036bc.png)
综合利用:先用set命令查看所有的环境变量及值,然后根据自己想要的命令进行截取拼接。
空格被过滤的情况下也可以根据set变量的值中有空格的值进行提取。
![](https://i-blog.csdnimg.cn/blog_migrate/0d142adca160521e2d6cd43b080975ac.png)
四、for循环拼接命令
For循环经常被用来混淆处理cmd命令,使得cmd命令看起来复杂且难以检测。最常用的For循环参数有 /L,/F参数。
格式为:
for 参数 %变量名 in (相关文件或命令) do 执行的命令
具体利用:
for /L %variable in (start,step,end) do command [command-parameters]
该命令表示以增量形式从开始到结束的一个数字序列。使用迭代变量设置起始值(start).然后逐步执行一组范围的值,直到该值超过所设置的终止值 (end)。
/L 将通过对start与end进行比较来执行迭代变量。
如果start小于end,就会执行该命令,否则命令解释程序退出此循环。
还可以使用负的 step以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。
举例利用:
cmd /C "for /L %i in (1,1,5) do start cmd" //会执行打开5个cmd窗口
![](https://i-blog.csdnimg.cn/blog_migrate/1abf1990b799eb6d6097a2fd5afb56a5.png)
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
(file-set) 为文件名,for会依次将file-set中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白行。
("string")代表字符串
('command')代表命令。
举例利用:
假如文件aa.txt中如下内容:
第1行第1列 第1行第2列;第1行第3列;第1行第4列
第2行第1列 第2行第2列;第2行第3列;第2行第4列
参数一:for /F %i in (aa.txt) do echo %i //默认以空格或者Tab键作为分隔符
![](https://i-blog.csdnimg.cn/blog_migrate/15b80ab77125fb6c6d1777a46034b056.png)
参数二:for /F "delims=;" %i in (aa.txt) do echo %i //将;作为分隔符进行分割
![](https://i-blog.csdnimg.cn/blog_migrate/2b5357e9279a650db97d8a1779a90c26.png)
参数三:for /F "tokens=2 delims=;" %i in (aa.txt) do echo %i //指定用; 作为分隔符并且提取第2列数据
![](https://i-blog.csdnimg.cn/blog_migrate/415f96d2fc027da536ad82ccf07fcbd1.png)
在实战中利用:
文件aa.txt中内容为自己的命令
whoami systeminfo
ipconfig dir
参数一:for /F %i in (aa.txt) do %i //直接执行第一行第一个和第二行第一个参数的命令
![](https://i-blog.csdnimg.cn/blog_migrate/87b0af08a25021d710f164d7519b6352.png)
参数二:for /F "tokens=2 delims= " %i in (aa.txt) do %i //指定用 空格 作为分隔符并且执行第二列参数命令
![](https://i-blog.csdnimg.cn/blog_migrate/87d8c78e0454077878c4955ce8d16ccd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6528096e5822b7bff5a010b1c09a46ac.png)
五、绕过空格过滤
(1) 常规执行方式
直接用%26替换空格
(2) echo输出(绕过空格)
通过=绕过echo test123中的空格
举例:http://xxxx.com/test.php?addr=baidu.com%26echo=test123
(3)逗号和分号
逗号与分号某些情况可以当作一个终止符号或者代替空格。
![](https://i-blog.csdnimg.cn/blog_migrate/266288397a9fdb75c52477ec74836cee.png)