我正在对网站进行代码审查,发现可能存在 SQL 注入(inject)漏洞。我应该指出,这是一个 CTF 练习,所以这可能是一个菜鸟问题。下面的代码在数据库中查询用户名和密码,如果发现两者匹配,则允许您登录。</p>
$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>";
}
我发现如果将以下代码直接注入(inject)数据库,则可以以任何用户身份登录:
SELECT * FROM user WHERE username='admin' OR 1=1 '' AND pwd='anyrandomtext'
这里的挑战是突破 mysql_real_escape_string() 语句,为此,我想确切地了解一旦此函数修改了输入,到底传递给服务器的内容是什么。有没有办法做到这一点?该网站在 Apache 上运行。
最佳答案
不知道您“发现”了什么,但在您在此发布的代码片段中没有漏洞。
The challenge here is breaking out of the mysql_real_escape_string() statement
不可能完成的任务。
没有任何突破,也没有什么可以破坏的。继续下一个练习。
关于php - 显示 mysql_real_escape_string() 之后实际传递到服务器的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42809537/