我正在对网站进行代码审查,并且发现了可能的SQL注入漏洞。我应该指出,这是针对CTF练习的,因此这可能是一个菜鸟问题。下面的代码在数据库中查询用户名和密码,如果在两者上都找到匹配项,则可以登录。
$username = mysql_real_escape_string((string) $_POST["username"]);
$password = md5($_POST["password"]);
$query = @mysql_query("SELECT * FROM user WHERE username='$username' AND pwd='$password'");
if (@mysql_num_rows($query) !== 1) {
$html = "Your username or password is wrong<br>".ShowLoginForm();
return;
} else {
$html = "Logged in. <a href='index.php'><font color=\"#9CCFEC\">continue</font></a>";
}
我发现,如果将以下代码直接注入数据库,则可以任何用户身份登录:
SELECT * FROM user WHERE username='admin' OR 1=1 '' AND pwd='anyrandomtext'
这里的挑战是突破mysql_real_escape_string()语句,为此,我想确切地查看一下输入是否已被此函数修改后正传递给服务器的内容。有没有办法做到这一点?该站点在Apache上运行。
最佳答案
Dunno您“发现”了什么,但是在此处发布的代码段中没有漏洞。
这里的挑战是摆脱mysql_real_escape_string()语句
不可能完成的任务。
没有突破,没有突破。继续进行下一个练习。
关于php - 在mysql_real_escape_string()之后显示实际传递给服务器的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42809537/