绕过 PHP 过滤器的 SQL 注入

问题描述 投票:0回答:3

尝试了解工作中的各种 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'";
php mysqli filter sql-injection
3个回答
2
投票

请不要构建自己的过滤器。当你意识到自己忽略了某些事情时,你会后悔的。

这是注入过滤器的字符串示例:

'   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


0
投票

您是否设法找到该问题的有效解决方案?


-1
投票

改变处理 SQL 注入的方式。请改用参数。

$stmt = $this->db->prepare("SELECT salt FROM users WHERE eid= ?");
$stmt->bind_param("si", $username);

欲了解更多信息,请查看此链接

© www.soinside.com 2019 - 2024. All rights reserved.