SQL注入的危害:
- 盗取数据库中的信息
- 绕过登录认证(万能密码)
二、SQL注入的流程
2.1、寻找注入点
寻找和数据库有交互的地方(例:注册、登录、搜索)
例:
https://www.xxxx.com/search.php?wk=xxx
?wk=xxx中xxx就是web服务器带入数据库中查询的字符串,这种情况就是和数据库交互的地方。
通过这种特征可以在谷歌搜索目标:
谷歌搜索语法:inurl:php?id=
2.2、判断闭合方式:
- 先判断是数字型还是字符串型
查看提交的参数例如?wk=11在11当中加入字符?wk=11x看有没有报错,如果报错说明是字符型。
- 再判断闭合方式:
在提交的参数后面加上一个引号(单/双引号都有可能)例如:?wk=11' ,看是否有报错,如果都没有报错,说明大概率不存在SQL注入
三、 SQL注入的分类
3.1 、盲注
盲注就是在SQL注入过程中,找到注入点,执行SQL语句后,查询到的数据或者错误信息不能回显到前端页面,此时,我们需要利用一些方法进行判断或者猜测,这个过程称为盲注。
3.1.1、布尔盲注
“基于布尔判断的盲注”指的是利用SQL语句逻辑与(and)操作,判断and两边的条件是否成立,SQL语句带入数据库查询后判断返回内容(通常返回值仅有空和非空两种状态),类似布尔型的true和false的两种状态;类似于无法开口说话的人,只能通过点头和摇头来告诉你答案正确与否。
布尔盲注的特性:
构造条件判断式 SQL 语句,利用页面不同响应(条件为真时页面正常,为假时页面异常)来获取数据库信息。
布尔注入的流程:
四、其它知识点
注释符
1、注释符的作用:
- 终止当前 SQL 语句,执行额外代码或绕过验证。
- 隐藏恶意语句,避免语法错误。
2. 常见数据库注释符:
| 数据库 | 单行注释符 | 多行注释符 |
|---|---|---|
| MySQL | # 或 -- |
/* ... */ |
| Oracle | -- |
/* ... */ |
| SQL Server | -- |
/* ... */ |
| PostgreSQL | -- |
/* ... */ |
| 注意: |
--后需加空格(MySQL/SQL Server),#后无需空格。- 在url中的时候不能用
#,需要用--+,#号会被当做特殊字符处理,–代表注释,+代表空格。
3. 典型注入场景
(1)登录绕过
SELECT * FROM users WHERE username = 'admin' -- ' AND password = '任意值';
- 注入点:用户名输入
admin' --,密码任意。 - 效果:注释掉密码验证部分,直接返回用户
admin的记录。
(2)联合查询注入
SELECT id, name FROM products WHERE id = 1 UNION SELECT version(), null --
- 作用:隐藏原查询的后续条件,返回数据库版本号。
4. 特殊技巧
- 绕过WAF:使用
--%0A(换行符)或#绕过部分过滤规则。 - 闭合引号:在字符型注入中,先闭合原引号再添加注释符:
' UNION SELECT 1,2,3#
万能密码
“万能密码” 是攻击者利用 SQL 语句拼接漏洞,绕过正常的身份验证机制进入系统的方式。
形式1:' or 1=1#
形式2:' or '1'='1'#
形式3:admin' or 1=1#
举例登录验证场景:
假设登录验证的 SQL 语句如下:
SELECT * FROM users WHERE username = '$username' AND password = '$password';
用万能密码' or 1=1#组后:
SELECT * FROM users WHERE username = '' or 1=1#' AND password = '随意密码';
经过组合后用户名为空,但是经过or 1=1后sql语句永远为真,#后面的全部被注释,服务端返回真,攻击者就能绕过登录验证
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tanglx@aliyun.com