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