Challenge
ExtBasic Mission 05 — fix the broken line in a shell script that is supposed to patch a PHP page. 修正 Sam 用来修补 PHP 页面的 shell 脚本里被写错的那一行。
关卡给出一个 PHP 页面:本该调用 safeeval() 包装函数的地方,写成了裸的 eval()。
<?php include ('safe.inc.php'); if ($access=="allowed") { eval($_GET['cmd']); if (!empty($_GET['cmd2'])) { eval($_GET['cmd2']); } }?>Sam 写了个 shell 脚本,用 sed 把 eval 批量改写成 safeeval:
#!/bin/shrm OKsed -E "s/eval/safeeval/" <exec.php >tmp && touch OKif [ -f OK ]; then rm exec.php && mv tmp exec.phpfi页面说明 Sam 的系统是 freeBSD 6.9,顶部横幅另外提醒:不要写 sed -r,BSD 上要用 sed -E。
任务是修正 shell 脚本里写错的那一行。
Solution
横幅专门提醒 -r 与 -E 的区别,说明出题人预期玩家会先怀疑 sed 标志。脚本里已经是 sed -E,在 FreeBSD 上语法合法。这一行的问题不在方言,而在替换命令本身。
s/eval/safeeval/ 没有写全局标志 g:
- 不带
g:sed 对每一行只替换第一个匹配; - 带
g:替换行内所有匹配。
sed -E “s/eval/safeeval/g” <exec.php >tmp && touch OK