[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)。
相关推荐
cg.family1 小时前
K8S:scale 与 delete pod 核心区别
运维·docker·容器
微订校园外卖平台1 小时前
同城外卖跑腿平台需要服务器吗?交付方式、部署架构与上线核对
服务器·架构·github·外卖系统·本地生活·微订
发量惊人的中年网工1 小时前
游戏出海服务器选哪个IDC?开服卡顿、延迟抖动的排查与选节点思路
服务器·idc
开开心心_Every1 小时前
黄金价格软件国内外价格实时监控超方便
运维·服务器·游戏·智能手机·pdf·lua·perl
Initialize293081 小时前
systemd 服务起不来?五步排查法
运维
LMT_Lanmantech1 小时前
HyperWorks许可:almutil显示Unit满了,数据到底准不准?
运维·服务器·算法
system_error_x1 小时前
服务器的替代方案:从物理机到云原生的全面对比
运维·服务器·云原生
努力进修1 小时前
多源异构数据库同步难题:DDL 结构变更自动化解决方案
运维·数据库·自动化
云票1 小时前
从技术视角看AI采购:多智能体、流程重设计与自动化的落地边界
运维·人工智能·自动化