[ACTF2020 新生赛]Exec

打开靶场发现是一个输入框用来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):

  1. **第一部分 ping -c 4 abc**:
  • abc 显然不是一个合法的 IP 地址或主机名。
  • 系统尝试去 ping abc 时会解析失败并报错 (例如提示 ping: unknown host abc),此时该命令的返回值为非 0(表示执行失败)。
  1. 触发 || 的条件:
  • 因为前一条命令 ping -c 4 abc 执行失败了,Shell 就会认为:"既然前一步没成功,那我就必须执行后面那条命令来补救/继续"。
  1. **执行 ls**:
  • 于是,紧接着后面的 ls 就被成功触发并执行了,从而把当前目录下的文件列表回显出来。

总结对比

  • &&(逻辑与) :前一句成功,后一句才执行(如 127.0.0.1 && ls)。
  • ||(逻辑或) :前一句失败 ,后一句才执行(如 abc || ls,因为 abc 会让 ping 报错)。
  • ;(分号) :无条件执行,不管前一句成功还是失败,后一句都会执行(如 abc ; ls 或 127.0.0.1 ; ls)。
相关推荐
番茄啊1 小时前
linux 开启xftp连接
linux·运维·服务器
IT利刃出鞘2 小时前
Docker Compose--解决修改配置后不生效的问题
运维·docker·容器
Lsetea2 小时前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
Zhao-Jichao2 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李2 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
Julien20042 小时前
管理机密(一)
运维·服务器·开发语言·学习方法
十碗饭吃不饱3 小时前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络
好用斋3 小时前
拾光坞安装网盘聚合LitePan:把Docker命令翻译成图形界面
运维·docker·容器
La Pulga4 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd4 小时前
秋招学习笔记 day106
笔记·学习