打开靶场发现是一个输入框用来ping先正常输入一个IP看看能不能正常使用
输入本地IP发现正常运行我们可以猜测本题的执行逻辑为
system($input)
其中&input就是我们可以控制的内容
但是我们直接输入ls命令却没有反应可能是因为
ip = _POST'ip'; // 假设用户输入在这里
$cmd = "ping -c 4 " . ip;//将你的输入拼接到ping命令后面system(ip; // 将你的输入拼接到 ping 命令后面 system(ip;//将你的输入拼接到ping命令后面system(cmd);
如果只输入 ls:
拼接后的完整命令变成了:ping -c 4 ls
ls 不是一个合法的 IP 或域名,因此系统的 ping 程序会报错,根本不会去执行目录列表
所以我们可以使用命令分隔符
比如
127.0.0.1;ls
127.0.0.1|ls
127.0.0.1&ls
127.0.0.1&&ls等都可以
然后就按命令执行来写
127.0.0.1;ls/

发现flag文件尝试读取
127.0.0.1;cat /flag

其实输入abc||ls也可以执行
但是我不太清楚原理所以问了ai
这是一个非常经典的 Linux Shell 逻辑运算符(Control Operators)机制问题!
之所以输入 abc || ls 也能够成功执行 ls,原因在于 ||(逻辑或运算符)的执行规则。
1. || 运算符的规则
在 Linux Shell 中,|| 表示逻辑或。它的工作原理是:
- 如果前一条命令执行失败(返回非 0 的退出状态码 / 报错),则立刻执行后面的命令。
- 如果前一条命令执行成功(返回 0),则后面的命令不会被执行。
2. 结合本题的实际场景分析
当你输入 abc || ls 并且拼接到后台的 ping 命令中时(假设后台执行的是 ping -c 4 abc || ls):
- **第一部分
ping -c 4 abc**:
abc显然不是一个合法的 IP 地址或主机名。- 系统尝试去 ping
abc时会解析失败并报错 (例如提示ping: unknown host abc),此时该命令的返回值为非 0(表示执行失败)。
- 触发
||的条件:
- 因为前一条命令
ping -c 4 abc执行失败了,Shell 就会认为:"既然前一步没成功,那我就必须执行后面那条命令来补救/继续"。
- **执行
ls**:
- 于是,紧接着后面的
ls就被成功触发并执行了,从而把当前目录下的文件列表回显出来。
总结对比
&&(逻辑与) :前一句成功,后一句才执行(如127.0.0.1 && ls)。||(逻辑或) :前一句失败 ,后一句才执行(如abc || ls,因为abc会让 ping 报错)。;(分号) :无条件执行,不管前一句成功还是失败,后一句都会执行(如abc ; ls或127.0.0.1 ; ls)。