sql注入基础

注入漏洞作为登顶过web十大漏洞多次的漏洞,危害性不言而喻,其中sql注入就是注入漏洞常用的手段。其形成的原因是由于web在接收传参数据时,对数据的过滤不够严格,将其带入到数据库查询中,导致用户可以通过传参一些sql语句来对数据库进行查询,修改等操作。传参的sql语句通过拼接后执行。

这边看了一个博客,结合他的办法实际验证一下拼接的方式,我们用sqli—labs来实验,先修改一下第一关的源码,显示出执行的sql语句

我们输入id=1看看执行的sql语句是什么

可以看到一个sql语句被执行了,尝试一下id=2

可以看到爆出来了一个账号密码,可以继续去尝试id=3、4、5....会发现由不同的账号密码,现在我们尝试单引号闭合

可以看到报错了,去看sql语句可以看到1后面有一个单引号落空了,在sql语句中单双引号都是要成对出现的,所以这边报错了,验证一下我们传参id=1''

没有报错,为了方便理解我们再加上一组对比,传参id

那么现在可以清楚的知道了他的拼接情况。

最后是注释和恒真假效果

?id=1' and 1=1--+

1=1恒真也可以写成2=2或a=a等类似格式,其作用是确保注入后的 SQL 语句逻辑成立,从而验证注入点或绕过某些防护规则,可测试注入是否成功(若页面正常显示,则存在注入漏洞)。也有1=2恒假条件,可以通过这个判断是否有注入漏洞,但不能直接获取数据,需要加上其他的回显手段来获取数据。

--+这是一种闭合手段,也有其他的闭合手段例如#等等可以用于其他的注入情境,这边就不多说了,--+中--是注释符号,+在url是空格的编码被编译成空格,确保注释符号生效。添加注释符号的目的是将后面自带的语句注释掉,确保我们传参的语句语法格式正确。

整个sql语句SELECT * FROM users WHERE id='2' -- ' LIMIT 0,1如果没有加注释的话是users表中选取id2的记录,不过只返回符合条件的第一条记录,所以我们加上注释符可以显示users表中所有id为2的记录,limit 0,1的作用是从行号0开始往下面搜索,只返还一条id=2的数据。

总之sql注入的目的是为了获取一些数据或者修改数据库的一些数据等等,是针对数据库的一种攻击手段,我们通过传参sql语句确保它绕过验证,执行成功。

SQL 注入是一种常见的安全漏洞,攻击者通过在输入字段中插入恶意 SQL 代码来操纵数据库查询,从而获取、篡改或删除敏感数据。以下是 SQL 注入基础知识和练习示例。 ### SQL 注入基础知识 1. **注入点识别** 在发现可控参数的地方(如 URL 参数、POST 数据、HTTP 头等),尝试使用单引号 `'` 来测试是否触发 SQL 错误。如果页面出现 SQL 语法错误,则可能存在注入点 [^1]。 2. **判断注入类型** - **数字型注入**:直接输入数值,例如 `id=1`,可以尝试 `id=1 and 1=1` 和 `id=1 and 1=2` 来判断是否有逻辑变化。 - **字符型注入**:通常出现在字符串上下文中,例如 `id='1'`,需要闭合引号并附加条件,例如 `id='1' and '1'='1`。 3. **联合查询注入 (UNION-based Injection)** 利用 `UNION SELECT` 语句将额外的查询结果合并到原始查询中,从而提取数据库信息。首先确定显示位数,例如 `?id=1' ORDER BY 3--+`,然后使用 `UNION` 提取数据 [^4]。 4. **盲注 (Blind SQL Injection)** 当没有直接错误信息返回时,可以通过布尔值判断或时间延迟方式探测数据库结构。例如使用 `AND IF(1=1, SLEEP(5), 0)--+` 来测试响应时间差异 。 5. **利用工具辅助检测与攻击** 推荐使用 **sqlmap** 进行自动化检测与利用,也可以结合 **Burp Suite** 的 sqlmap 插件,方便地将请求包发送至 sqlmap 进行分析 [^1]。 ### SQL 注入练习示例 #### 使用 Mutillidae 进行 SQL 注入练习 进入 Mutillidae 的 "OWASP Top 10 / A1 — 注入 / SQLi — 提取数据 / 用户信息" 页面,尝试使用登录绕过技术访问系统,并通过联合查询提取用户信息 [^2]。 #### SQLI-LABS 练习关卡 以下是一些常见 Payload 示例: - **测试注入点** ```text ?id=1' and 1=2 union select 1,2,3 --+ ``` - **获取当前数据库名** ```text ?id=1' and 1=2 union select 1,2,database()--+ ``` - **列出当前数据库的所有表** ```text ?id=1' and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+ ``` - **查看 users 表中的字段** ```text ?id=1' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+ ``` - **获取用户名和密码** ```text ?id=1' and 1=2 union select 1,2,group_concat(username,0x7e,password) from security.users --+ ``` 以上练习建议在本地搭建的靶场环境中进行,例如 PHPStudy + SQLI-LABS 环境 [^4]。 ### 常见防御措施 - 使用预编译语句(Prepared Statements)防止恶意 SQL 拼接。 - 对输入进行过滤与验证,避免直接拼接 SQL 查询。 - 最小权限原则,限制数据库用户的权限。 - 启用 Web 应用防火墙(WAF)拦截异常请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值