2024

79 阅读7分钟

“&” commandA & commandB 先运行命令A,然后运行命令B “||” commandA || commandB 运行命令A,如果失败则运行命令B “&&” commandA && commandB 运行命令A,如果成功则运行命令B


在Windows操作系统的命令提示符(cmd)或PowerShell中,命令拼接是一种将多个命令结合在一行中执行的技巧。这样可以根据前一个命令的执行结果来决定是否执行后一个命令,或者同时执行多个命令。



1. **“|” 管道符**


	* 管道符用于将一个命令的输出直接作为另一个命令的输入。
	* 例如,`help | more`,这个命令会显示命令帮助信息,并通过 `more` 命令逐屏显示,方便用户阅读。
2. **“&” 连续命令符**


	* 这个符号用于顺序执行两个命令,不管第一个命令执行成功与否,第二个命令都会被执行。
	* 例如,`commandA & commandB`,无论 `commandA` 是否成功执行,`commandB` 都会紧接着执行。
3. **“||” 条件命令符**


	* 条件命令符 `||` 用于在第一个命令执行失败时执行第二个命令。
	* 例如,`commandA || commandB`,如果 `commandA` 执行失败(返回非零退出状态),那么 `commandB` 将会执行。如果 `commandA` 成功,则 `commandB` 不会执行。
4. **“&&” 条件命令符**


	* 条件命令符 `&&` 用于在第一个命令执行成功时执行第二个命令。
	* 例如,`commandA && commandB`,只有当 `commandA` 成功执行(返回零退出状态)时,`commandB` 才会执行。



这些命令拼接方式可以帮助您构建更加复杂的命令序列,实现基于条件的命令执行流程。在编写批处理脚本或在命令行中快速执行多个命令时非常有用。但是应当注意的是,命令的成功或失败是基于其返回的退出状态码来判断的,通常情况下退出状态码为零表示成功,非零表示失败。


RCE常见的考点为命令过滤和绕过,可参考[命令执行 rce各种绕过技巧\_命令执行 /被过滤-CSDN博客文章浏览阅读981次,点赞28次,收藏26次。命令执行 rce各种绕过技巧\_命令执行 /被过滤![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d18ae01a0d9f44b3b30fef35d861e7eb~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=hp8bKDq82KYLQ0yTPMqOg8I2XT8%3D)https://blog.csdn.net/m0\_62102520/article/details/135577112?ops\_request\_misc=&request\_id=&biz\_id=102&utm\_term=RCE%E8%BF%87%E6%BB%A4&utm\_medium=distribute.pc\_search\_result.none-task-blog-2~all~sobaiduweb~default-0-135577112.142%5Ev100%5Epc\_search\_result\_base6&spm=1018.2226.3001.4187](https://blog.csdn.net/m0_62102520/article/details/135577112?ops_request_misc=&request_id=&biz_id=102&utm_term=RCE%E8%BF%87%E6%BB%A4&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-135577112.142%5Ev100%5Epc_search_result_base6&spm=1018.2226.3001.4187 "命令执行 rce各种绕过技巧_命令执行 /被过滤-CSDN博客")



### 实训:


#### 阿?(2023云曦秋季期末考)


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/614e1acface845adb55481937ece1e42~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=mR35OxDGWO5G1BLj%2B364F1yPIwA%3D)



说看源代码,那就看看源代码,但是这里禁用了CTRL+U和鼠标右键,除了这两种,还有一种看源代码的办法:在URL的前面加上view-source:


源代码里是一个路径。


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/12b72e32504f415b8cbfd965ae02ea92~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=e6SsYaYm7ZlqtigvJH9B%2FKKwSL0%3D)


访问一下,得到了一个php脚本页面。


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/93846a94459c4676aa54e210a8260d0f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=3XWCBvVqWVD94TX17fQQrqteV5I%3D)


脚本重定向了一系列表情符号为英文字符,通过对照,我们可以发现大哭的表情包对应为systemsystem函数是php语言的一个内置函数,它用来执行外部程序,并显示输出。这个函数非常的强大和危险,因为它可以执行任何的系统命令。  
     在PHP中,eval是一个语言结构,它将字符串作为PHP代码执行。也就是说,eval可以执行传递给它的字符串中包含的任意有效的PHP代码。因此,这里的eval()函数将会解析外星人头像参数中的内容并作为命令传递给system函数来执行。


至此,可以确定本题为RCE命令执行(远程命令执行)。并且请求方法为GET。


Ls命令查看当前目录下的文件:


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a81ee1c155cf41619b9d24b10eb5317d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=43ATaGA7Cnc1KkS%2FgeD7dnMF43Q%3D)


Ls /返回查看根目录文件:


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ed4bd78ef99140358c7b383aa8a71545~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=odUT%2FTnr40my5euzmtolCh%2FZp3c%3D)


发现flag文件,使用cat命令查看找到flag:


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a92c4e8709e44bd2bd4776eebe1043a7~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=bR3qDxgFH6iL3hSpafsucgS7hYc%3D)


本题完。


#### Eval执行(CTFHUB技能树)


打开题目,eval函数代表可执行php语句。这里有两种做法,第一种蚁剑直接秒了,一句话木马。第二种使用命令。/?Cmd=system(“ls”)列出当前目录文件。


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d062ad7e2cff44408c2a51b757dbc9ee~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=jsQ4NqOvgYG7G2g7587%2B1m6tOoU%3D)


返回根目录


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6762c5625e5840cc8345b6ca9d108a88~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=VdqSMlWT%2BeQDEl3TgcLqf3sLKoQ%3D)


发现flag文件,cat命令


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6a67017bdccb4c438fd4589f952fd9bf~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=EEGYjMVXq3%2FpNZK%2FfB5Ch4%2BrwAA%3D)


#### 命令注入(CTFHUB技能树)


打开靶机,一道经典的命令注入无过滤的题目。


使用ls命令查看当前目录文件


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/cb42fb758f584466bb92b6a8f738d8d0~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=HV%2BL0R1VfTMauP4OW5BrBYICM0I%3D)


Cat命令查看数字文件内容,查看网页源代码发现flag


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/91ecba45d1514e30832b066efe2e540e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=usavcS4QW0rdYjkynmfcOZ0t3RY%3D)


本题完。


#### 过滤cat(CTFHUB技能树)


由题意可知靶机过滤了cat命令,但是我们可以使用head命令。


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d853a225881b4a428df4b11f50e84da8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=vlnoMl76UhfW8dPKi4n8II6WDvo%3D)


本题完。


#### Rceeee(2024云曦春开学考)


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/18eaec0a74a848fd9558e8246f7cf6fd~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=jmszFUGnJjqq49tou4HYzl7xrMM%3D)



![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/90c0a2b3fd3a4b84a6c9b63d74fdca2f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=Duhis%2Bflq9Yf0N9nm17uOXDac7E%3D)   


让我们逐行解释一下这个php脚本都干了些啥:


    1. `<?php`: 这是PHP代码开始的标志。


    2. `error\_reporting(0);`: 这行代码设置了PHP的错误报告级别。数字0表示禁止所有的错误报告,这通常用于生产环境中防止用户看到错误信息。


    3. `highlight\_file(\_\_FILE\_\_);`: 这个函数的作用是将当前文件的源代码显示在浏览器中,并且以高亮显示。`\_\_FILE\_\_` 是一个魔术常量,指向当前执行的脚本文件。


    4. `function strCheck($cmd) { ... }`: 定义了一个名为 `strCheck` 的函数,它接受一个参数 `$cmd`,即用户输入的命令。


    5. `if(!preg\_match("/\;|\&|\\$|\x09|\x26|tac|cat|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){`: 使用正则表达式检查 `$cmd` 变量中是否含有列出的一系列字符或单词(如分号、&、$、制表符、tac、cat等)。这个检查是不区分大小写的,因为正则表达式的末尾有一个 `i` 修饰符。


    6. `return($cmd);`: 如果 `preg\_match` 检查不匹配(即 `$cmd` 中不包含那些字符或单词),函数就会返回 `$cmd`。


    7. `else { die("你的想法很有趣....."); }`: 如果检测到了非法字符或单词,脚本执行将停止,并显示一条消息 “你的想法很有趣.....”。


    8. `$cmd=$\_GET['cmd'];`: 这行代码从URL的查询字符串中获取 `cmd` 参数的值,并将其赋给变量 `$cmd`。


    9. `strCheck($cmd);`: 对变量 `$cmd` 调用 `strCheck` 函数以检查可能的非法字符或命令。


    10. `shell\_exec($cmd);`: 如果 `$cmd` 通过了 `strCheck` 函数的检查,这个命令就会执行。`shell\_exec` 函数用于执行一个命令并通过字符串返回输出,它是PHP中用于执行外部程序的一个函数。


    我们这里的思路是,绕过所有的字符和单词检查,使用tee命令,保存输出的flag的内容到文件中然后直接访问,得到flag。这里用到的命令为?cmd=c\at /fl\ag | tee 1.txt。


    这个题目设计了一个基本的安全机制来过滤掉潜在的危险命令。这个机制通过 `strCheck` 函数实现,它检查传入的 `$cmd` 变量,如果发现一系列特定的字符或命令关键词,如 ";", "&", "tac", "cat" 等,就会终止执行。


    构造的 payload 是 `http://172.16.17.201:50082/?cmd=c\at /fl\ag | tee 1.txt`。这个payload的关键在于绕过了 `strCheck` 函数的检测。具体来说:


    1. 命令拆分:使用了 `\` 来逃避 `strCheck` 函数对 "cat" 和 "flag" 这两个词的检测。实际上命令变成了 `cat /flag`,这是一条合法的命令,用于读取名为 "flag" 的文件。


    2. 命令执行:使用 `| tee 1.txt` 将 `cat` 命令的输出不仅显示在屏幕上,还同时写入名为 "1.txt" 的文件。这样做的目的是为了绕过可能的输出限制,即使直接的命令执行结果无法在网页上显示,输出内容也会被保存到服务器上的 "1.txt" 文件中。


    当访问 `http://172.16.17.201:50082/1.txt` 时,就能看到保存在 "1.txt" 文件中的 flag。这是因为这个文件现在存储在Web服务器的根目录下,可以像访问其他网页资源一样通过URL直接访问。


    因此,这种 payload 的关键在于巧妙绕过了安全检测,同时保证了命令执行的结果可以被存储和访问。


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/250680dacba2430a9cb25148ade9f9be~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=tXh%2BlHz0QmcCEmKWF9XceXU3TII%3D)


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/72ce8a0244d441dbb848f35416f4e20d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1771513953&x-signature=xfUkv81HBcywWdTfFdX1%2FREmDzA%3D)