尝试了解工作中的各种 SQL 注入技术,但我陷入了以下困境。我正在尝试为以下代码编写 SQL 注入。我的目标是仅输入已知注册用户的用户名(例如:test),并附加额外的输入,绕过以下过滤器,并最终注入到最后一行的 SQL 语句中,使其为真并记录我的日志作为注册用户。我对如何绕过一系列过滤器有点迷失(尽管我猜测我可以使用空白字符的替代品来通过其中一个检查?)什么样的输入可以绕过这个?谢谢!
function sqli_filter($string) {
$filtered_string = $string;
$filtered_string = str_replace("--","",$filtered_string);
$filtered_string = str_replace(";","",$filtered_string);
$filtered_string = str_replace("/*","",$filtered_string);
$filtered_string = str_replace("*/","",$filtered_string);
$filtered_string = str_replace("//","",$filtered_string);
$filtered_string = str_replace(" ","",$filtered_string);
$filtered_string = str_replace("#","",$filtered_string);
$filtered_string = str_replace("||","",$filtered_string);
$filtered_string = str_replace("admin'","",$filtered_string);
$filtered_string = str_replace("UNION","",$filtered_string);
$filtered_string = str_replace("COLLATE","",$filtered_string);
$filtered_string = str_replace("DROP","",$filtered_string);
return $filtered_string;
}
function login($username, $password) {
$escaped_username = $this->sqli_filter($username);
// get the user's salt
$sql = "SELECT salt FROM users WHERE eid='$escaped_username'";
$result = $this->db->query($sql);
$user = $result->next();
// make sure the user exists
if (!$user) {
notify('User does not exist', -1);
return false;
}
// verify the password hash
$salt = $user['salt'];
$hash = md5($salt.$password);
error_log(print_r($escaped_username));
$sql = "SELECT user_id, name, eid FROM users WHERE eid='$escaped_username' AND password='$hash'";
请不要构建自己的过滤器。当你意识到自己忽略了某些事情时,你会后悔的。
这是注入过滤器的字符串示例:
' union all select password from users where type = 'Admin
(注意这些是制表符,而不是单引号后面的空格)
这是一个演示 https://3v4l.org/o8ClJ。你的字符串输出为:
SELECT salt FROM users WHERE eid='' union all select password from users where type = 'Admin'
这将是可执行的 SQL(假设列存在)。
使用参数化查询和准备好的语句。它将处理您需要做的一切。
补充阅读:如何防止 PHP 中的 SQL 注入?
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
您是否设法找到该问题的有效解决方案?
改变处理 SQL 注入的方式。请改用参数。
$stmt = $this->db->prepare("SELECT salt FROM users WHERE eid= ?");
$stmt->bind_param("si", $username);
欲了解更多信息,请查看此链接。