声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。
一、开篇:一个“万能密码”引发的思考
你有没有想过——如果在一个登录框里输入 ' or 1=1--,不用密码就能直接进入后台?这不是电影情节,而是SQL注入(SQLi)的经典利用方式。作为Web安全中最常见的漏洞之一,SQL注入的本质是:攻击者通过构造恶意输入,篡改应用程序的SQL查询逻辑,从而 unauthorized 访问或篡改数据库。二、SQL注入到底是什么?
SELECT * FROM users WHERE username = '$username' AND password = '$password';
当用户输入 admin(用户名)和 123456(密码)时,SQL会变成:SELECT * FROM users WHERE username = 'admin' AND password = '123456';
但如果攻击者输入admin'--作为用户名(密码随便填),SQL会变成:SELECT * FROM users WHERE username = 'admin'--' AND password = 'xxx';
这里的 --是SQL的注释符,它会把后面的 AND password = 'xxx'直接注释掉!最终查询等价于:SELECT * FROM users WHERE username = 'admin';
应用程序会误以为“用户名存在”,直接放行——这就是绕过登录验证的原理。三、如何检测SQL注入漏洞?
PortSwigger原路径中提到“检测SQL注入的核心是观察应用对特殊字符的反应”,具体可以用这3步:1. 注入特殊字符测试:在输入框(如搜索框、登录框)中输入 '、"、;等SQL特殊字符,看应用是否返回数据库错误(如“MySQL syntax error”)或异常页面。2. 布尔逻辑验证:输入 ' AND 1=1--(正常逻辑)和 ' AND 1=2--(错误逻辑),对比两次响应:3. 错误回显分析:如果应用返回详细的数据库错误(如“Unknown column 'xxx' in 'where clause'”),直接暴露了数据库类型(如MySQL)和表结构——这是最有价值的检测信号。四、基础利用:从“获取数据”到“绕过登录”
掌握了检测方法,我们直接用PortSwigger靶场的两个经典实验练手:实验1:检索隐藏数据(Retrieving hidden data)
https://example.com/products?category=Electronics
目标:通过SQL注入,获取“未公开”的电子产品(比如管理员隐藏的折扣商品)。步骤:在 category参数后注入 ' OR 1=1--:https://example.com/products?category=Electronics' OR 1=1--
SELECT * FROM products WHERE category = 'Electronics' OR 1=1--' AND released = 1;
注释符 --会把 AND released = 1(仅显示已发布商品)去掉,OR 1=1则会让查询返回所有商品——包括隐藏的那些!实验2:绕过登录验证(Subverting application logic)
场景:某后台登录框,用户名输入框是 username,密码输入框是 password。步骤:在用户名输入框输入 ' OR 'a'='a,密码随便填(比如 123):SELECT * FROM users WHERE username = '' OR 'a'='a' AND password = '123';
'a'='a永远为真,所以整个条件等价于 TRUE,应用会返回所有用户——如果应用程序默认取第一条结果(通常是管理员),你就直接登录成功了!五、如何防御?
SQL注入的根源是“用户输入未过滤,直接拼接到SQL语句中”。PortSwigger原路径强调,最有效的防御方法是:1. 参数化查询(Prepared Statements):不要直接拼接用户输入,而是用“占位符”代替,让数据库区分“代码”和“数据”。2. 输入验证:对用户输入的特殊字符(如 '、;)进行过滤或转义(比如用 mysql_real_escape_string())。3. 最小权限原则:数据库账号不要给“root”权限,仅授予“查询/插入”等必要权限——即使被注入,也无法删除表或修改数据。六、互动与预告
小问题:你在测试中有没有遇到过“输入 '直接报错”的情况?是怎么绕过的?欢迎在评论区分享!下期预告:我们将深入讲解SQL注入UNION攻击——如何用 UNION SELECT把其他表的数据“合并”到当前查询结果中,直接窃取用户密码!(注:文中实验均基于PortSwigger Web Security Academy靶场,原文链接:https://portswigger.net/web-security/sql-injection 对应原路径章节:What is SQL injection?、How to detect SQL injection vulnerabilities、Retrieving hidden data、Subverting application logic)