打开靶机界面,根据提示可以看出是一个有关SQL注入的题目
在随意输入几次用户名密码后发现会跳转到提示错误界面
我们使用经典的 SQL注入 攻击——万能密码
' OR 1=1#
使用和原理:
假设原始的查询语句是类似这样的:
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
若在用户名或者密码上输入万能密码后后 查询会被替换为:
SELECT * FROM users WHERE username = '' OR 1=1#' AND password = '输入的密码';
或者
SELECT * FROM users WHERE username = '输入的用户名' AND password = '' OR 1=1 #';
AND 运算符的优先级高于 OR 运算符,所以按照标准的 SQL 语法,查询会先处理 AND 后处理 OR。
因此,SQL 查询首先会像这样被理解:
SELECT * FROM users WHERE username = '' OR 1=1#' AND password = '输入的密码';
或
SELECT * FROM users WHERE (username = '输入的用户名' AND password = '') OR 1=1 #';
#:这是一个注释符号。在SQL语句中,# 会注释掉它后面的部分。
所以sql语句始终为真
为了防止SQL注入,开发人员可以采取以下措施:
- 使用参数化查询(Prepared Statements):避免直接拼接用户输入到SQL查询语句中,使用占位符代替输入内容。这样可以有效防止恶意输入被当作SQL代码执行。
示例(使用参数化查询):
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))