bugku-web-聪明的php
这是一个BugKu平台的PHP题目,名为“聪明的PHP”。这个问题涉及到PHP代码审计和安全性。
题目描述:
<?php
$flag = "bugku{*****************}";
if (isset ($_GET['password'])) {
if (eregi ("iloveyou", $_GET['password'])) {
echo 'YOU SHOULD NOT LOVE ME';
exit;
}
if (eregi ('[a-zA-Z0-9]', $_GET['password'])) {
echo 'ONLY NUMBERS AND LETTERS';
exit;
}
$password = $_GET['password'];
if ($password == "1314520") {
echo $flag;
} else {
echo 'WRONG PASSWORD';
}
} else {
highlight_file(__FILE__);
}
?>
解决方法:
这个问题的关键在于绕过三层过滤。第一层是eregi函数,它检查$\_GET['password']是否包含"iloveyou"字符串。第二层过滤检查是否只包含字母和数字。最后一层是检查密码是否等于1314520。
- 绕过eregi函数的"iloveyou"检查,可以使用unicode字符集,例如
I\u006Cove\u006Fyou
。 - 绕过只包含字母和数字的检查,可以使用特殊字符,例如
1314520a
。
因此,构造的payload为:
password=I\u006Cove\u006Fyou1314520a
将此payload作为URL参数传递,即可得到flag。
注意:eregi
函数在PHP 7.0.0版本后已被废弃,并在PHP 7.3.0中完全移除。在实际应用中,应该使用preg_match
函数和i
修饰符来进行不区分大小写的正则表达式匹配。
评论已关闭