SQL注入看这篇就够

前言

SQL注入是一种非常出名的安全防范问题。原理很简单,但是问题是在客户端是怎么做到操作/修改后台SQL语句的呢?

快速理解SQL注入原理

我们以登录账号为起始点。

通常,登录账号要求我们输入的是账号(userName)、密码(passWord)

输入完点击确定后后台这里用的java将产生一条sql语句。

假如我们用Java原声的产生sql语句方式,而不是用 PreparedStatement,代码是这样写的:

String sql = "select * from table where user_name='" + userName +"' and pass_word='" + passWord + "'";

将会生成一条语句(这里加入我输入账号:zhanghao 密码:123)

select * from table where user_name ='zhanghao' and 'pass_word=123'

这样看起来一切很ok。

但是如果用户输入的不是zhanghao,而是这样的’ or 1=1 –呢?

这样产生的sql语句就应该是这样的

select * from table where user_name ='' or 1=1 -- 'and pass_word='123'

这样前面的user_name判断条件无效。 并且加入– 注释后面的所有语句!攻击者堂皇的进入系统。

可能此人更心怀不轨,不是要进入系统而是破坏。所以他可能会写:’;DROP DATABASE (DB NAME) —

这样翻译的sql语句就是:

select * from table where user_name='';DROP DATABASE (DB NAME) --  'and pass_word='123'

一条语句被拆解为两条数据库瞬间爆炸。


防止SQl注入手段

很多语言已经帮我们做好了对应的API。比如Java我们用PreparedStatement

   String sql= "select * from users where username=? and password=?;
   PreparedStatement preState = conn.prepareStatement(sql);
   preState.setString(1, userName);
   preState.setString(2, password);
   ResultSet rs = preState.executeQuery();

或者,我们可以用正则,把 有 单引号(‘),分号(;) 和 注释符号(–)的语句给替换掉来防止SQL注入

Java

   return str.replaceAll(".*([';]+|(--)+).*", " ");

原文链接:

https://iamjohnnyzhuang.github.io/database/2016/07/16/SQL%E6%B3%A8%E5%85%A5%E7%9C%8B%E8%BF%99%E7%AF%87%E5%B0%B1%E5%A4%9F.html

<think> 嗯,用户现在明确表示想获取SQL注入漏洞的入门知识,还提供了三参考引用。看来ta是个刚入门网络安全的新手,需要基础但系统的知识框架。之前我回复过web漏洞挖掘的通用手段,这次要聚焦SQL注入这个具体方向。 用户引用的三文章都很有针对性:第一讲延时盲注技术,第二是漏洞思路总结,第三涉及检测防御。需要把这些内容整合成循序渐进的入门指南。特别要注意引用[1]提到的"延时盲注"属于高阶技术,对新手可能太难,应该放在进阶部分。 考虑到用户是零基础,要从最核心的概念讲起。先定义SQL注入是什么——本质是把用户输入拼接为SQL指令执行。必须强调危害性:数据泄露、篡改甚至服务器沦陷[^3]。接着分四个层次展开:基础原理、检测方法、漏洞利用演示、防御策略。 检测方法部分要突出实操性。引用[1]的延时盲注脚本虽然专业,但新手更适合先学布尔盲注这类基础手法。可以设计一个经典案例:用户登录框输入`admin' -- `绕过密码验证[^2]。防御措施要呼应引用[3]的参数化查询方案,这是最根本的解决方法。 最后生成的拓展问题很重要。用户明显有继续深造的意向,所以问题要覆盖漏洞挖掘(如时间盲注)、绕过技巧(WAF过滤)、防御深度等方向。特别是引用[2]提到的"知识体系",可以用树状图辅助说明。 特别注意数学公式的LaTeX规范。比如解释布尔盲注原理时,用$1=1$和$1=2$这类简单表达式就了,避免使用积分等复杂符号。所有代码示例必须用反引号标注语言类型,像`?id=1' AND 1=1--`这样的payload要显眼。 </think> 以下是SQL注入漏洞的入门指南,结合引用内容分步骤详解: --- ### 一、SQL注入核心原理 **本质**:攻击者通过构造特殊输入,篡改原始SQL语句逻辑 **触发条件**: 1. 用户输入直接拼接进SQL语句(如 `"SELECT * FROM users WHERE id='" + input + "'"`) 2. 输入未经过滤或过滤不严谨 **危害示例**: - 绕过登录:输入 `admin' -- ` 使SQL变为 ```sql SELECT * FROM users WHERE username='admin' -- ' AND password='xxx' ``` 注释符 `--` 使密码验证失效[^2] - 数据泄露:通过 `UNION SELECT` 提取数据库敏感信息[^1] --- ### 二、基础检测方法(手动) #### 步骤1:识别注入点 ```http GET /product?id=1' HTTP/1.1 --> 观察是否返回数据库错误(如MySQL语法错误) ``` #### 步骤2:验证漏洞存在性 | 测试类型 | 输入样例 | 预期响应特征 | |----------------|----------------------|----------------------| | **布尔测试** | `id=1' AND 1=1 -- ` | 页面正常加载 | | | `id=1' AND 1=2 -- ` | 页面内容异常/为空 | | **联合查询** | `id=-1' UNION SELECT 1,2,3 -- ` | 页面显示数字2或3(字段回显位)[^2] | #### 步骤3:信息提取(示例) ```http GET /product?id=-1' UNION SELECT @@version, database(), user() -- ``` > 返回结果可能包含:MySQL版本、当前数据库名、数据库用户[^1] --- ### 三、自动化工具使用(sqlmap演示) **基本命令**: ```bash sqlmap -u "http://example.com/product?id=1" --batch ``` **进阶操作**: ```bash # 获取所有数据库名 sqlmap -u [URL] --dbs # 提取指定表数据 sqlmap -u [URL] -D db_name -T users --dump ``` > 工具原理:自动构造布尔表达式、时间延迟语句检测响应差异[^1] --- ### 四、防御措施(关键点) 1. **参数化查询(根本解决方案)** ```python # 错误方式(拼接字符串) cursor.execute("SELECT * FROM users WHERE email = '%s'" % email) # 正确方式(参数化) cursor.execute("SELECT * FROM users WHERE email = %s", (email,)) # [^3] ``` 2. **防御层补充** - 输入过滤:过滤 `'`、`"`、`--` 等特殊字符 - 最小权限原则:数据库账户禁用DROP/ALTER等高危权限 - WAF防护:部署ModSecurity等Web应用防火墙 --- ```mermaid graph TB A[用户输入] --> B{是否拼接SQL?} B -->|是| C[存在注入风险] B -->|否| D[相对安全] C --> E[参数化查询改造] C --> F[增加输入过滤] C --> G[降低数据库权限] ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值