SQL注入绕过PHP过滤器

时间:2018-07-23 03:42:29

标签: php mysqli filter sql-injection

试图了解各种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'";

2 个答案:

答案 0 :(得分:1)

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

下面是一个可以插入过滤器的字符串示例:

'   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(假设存在列)。

使用参数化查询和准备好的语句。它将处理您需要做的所有事情。

其他阅读:How can I prevent SQL injection in PHP?
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

答案 1 :(得分:-1)

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

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

有关更多信息,请选中此link