HackThisSite - ExtBasic Mission 05

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()

1
2
3
4
5
6
7
8
9
<?php
include ('safe.inc.php');
if ($access=="allowed") {
eval($_GET['cmd']);
if (!empty($_GET['cmd2'])) {
eval($_GET['cmd2']);
}
}
?>

Sam 写了个 shell 脚本,用 sedeval 批量改写成 safeeval

1
2
3
4
5
6
#!/bin/sh
rm OK
sed -E "s/eval/safeeval/" <exec.php >tmp && touch OK
if [ -f OK ]; then
rm exec.php && mv tmp exec.php
fi

页面说明 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