|
WEB渗透测试工程师系统班250303期 第13节课作业 1. SQL注入漏洞的原理是什么? 核心原理:攻击者通过构造恶意输入,使应用程序将用户输入的数据未经充分过滤或转义直接拼接到SQL语句中,从而篡改原始SQL逻辑,执行非预期的数据库操作。 技术细节: 当用户输入(如URL参数、表单字段)直接拼接进SQL查询语句时,攻击者可通过注入特殊字符(如' " ; --)或SQL关键字(如 `UNION`、`SELECT`、`DROP`)改变原语句的语义。 例如:原始SQL为 `SELECT * FROM users WHERE id='用户输入'`,若用户输入 `1' OR '1'='1`,则语句变为 `SELECT * FROM users WHERE id='1' OR '1'='1'`,导致查询所有用户数据。 2. SQL注入漏洞的危害是什么? 数据泄露 :窃取敏感数据(如用户密码、个人信息)。 数据篡改 :修改或删除数据库内容(如篡改订单金额、删除日志)。 权限提升 :通过执行系统命令获取服务器控制权(如MySQL的 `INTO OUTFILE` 写Webshell)。 绕过认证 :例如 ' OR 1=1-- 绕过登录验证。 业务瘫痪 :通过 DROP TABLE 或死循环查询导致服务不可用。 3. SQL注入漏洞的利用思路? 步骤示例 : 1.探测注入点: 在参数中提交 `'`、`"`、`\` 等字符,观察是否报错(如数据库错误页面)。 2.判断数据库类型: 通过报错信息或函数差异(如MySQL的 `@@version`、SQL Server的 `@@version`)。 3.确定注入类型: 联合查询注入 :利用 `UNION SELECT` 提取数据(需列数一致)。 布尔盲注 :通过页面返回真假状态推断数据(如 `AND 1=1` 与 `AND 1=2` 的差异)。 时间盲注 :通过延时函数(如 `SLEEP(5)`)判断条件是否成立。 4.提取数据: 获取表名、列名(如MySQL的 `information_schema` 数据库)。 导出敏感数据(如 `UNION SELECT username, password FROM users`)。 4. 在一个真实站点,哪些功能点会存在SQL注入漏洞? 登录功能 :用户名或密码字段未过滤(如 ' OR 1=1 -- )。 搜索功能 :搜索关键词拼接进SQL(如 ?keyword=test' UNION SELECT ...)。 URL参数 :动态参数如 ?id=1(如数字型注入 id=1 AND 1=1)。 订单/支付功能 :订单ID、用户ID等参数未过滤。 用户资料修改 :更新语句中的字段(如 UPDATE users SET email='注入点')。 分页参数 :`page`、`limit` 参数未处理(如 `LIMIT 0,10` 注入)。 HTTP头注入 :`User Agent`、`Cookie` 等头部字段被记录到数据库。 5. 实际操作课堂讲解的yakit sql注入靶场 第一关:不存在SQL注入的情况(数字严格校验) 原码及解析
1.这个示例接收一个名为 id 的查询参数,该参数预期是一个整数。 2.通过使用 strconv.ParseInt 函数,将用户提供的 id 参数解析为一个 64 位整数。如果解析失败,将返回一个错误。 3.使用解析后的整数值来执行数据库查询,这个值不包含恶意的 SQL 注入代码。 4.最后,将查询结果返回给客户端。
第二关:ID 为数字型的简单边界 SQL注入 url:http://127.0.0.1:8787/user/id?id=1
第一步:yakit抓包
第二步:尝试注入1 OR 1=1(注意,该位置的特殊符号要用url编码,该结论通过尝试获得)
第三关:参数是 JSON,JSON中字段存在SQL注入 如图
第一步:发送到fuzzer观察包
第二步:解码+payload id={"uid":1,"id":"1 OR 1=1"}+编码
第三步:后台成功反馈数据出来
第四关:GET参数是被编码的JSON,JSON中字段存在SQL注入 第一步:同上,抓包
第二步:解码+payload {"uid":1,"id":"1 OR 1=1"}+编码 (Base64)
第三步:成功反馈数据
一、笔记标题:WEB渗透系统班-SQL注入原理+SQL注入靶场(1-4)
二、文章内容:
1. 课程内容概要
:
主要知识点1:SQL注入原理
主要知识点2:SQL注入靶场
2.重点知识与细节(针对本节课的核心内容进行详细记录,包含公式、代码、重要原理等)
概念解析
概念1: yakit靶场第一关【不存在SQL注入的情况(数字严格校验)】
这个示例演示了如何通过对用户输入的参数进行数字严格校验,从而防止 SQL 注入攻击。数字严格校验确保只有有效的数字被用作 SQL 查询的参数,而不允许插入恶意的 SQL 代码。
概念2: yakit靶场第二关【ID 为数字型的简单边界 SQL注入】 ID 为数字型的简单边界 SQL 注入是一种常见的 SQL 注入漏洞,通常出现在 Web 应用程序中。这种漏洞的攻击目标是应用程序中处理 ID 参数的代码,由于没有对输入进行充分验证和过滤,导致攻击者可以在 ID 参数中注入 恶意的 SQL 代码。 在这种情况下,攻击者通常会尝试构造特定的输入,以绕过应用程序的验证和过滤机制,注入恶意的 SQL 语句。 攻击示例:# 1 OR 1=1 这样构造的 SQL 语句变成: /*构造后的SQL*/
SELECT * FROM users WHERE id = 1 OR 1=1 由于 1=1 这个条件始终为真,整个查询语句将返回所有用户的数据,而不仅仅是匹配到的特定 ID 的用户数据。这就是 SQL 注入攻击的原理,攻击者可以通过注入恶意的 SQL 代码来绕过应用程序的身份验证,获取未授权的数据或执行恶意操作。 防御措施:#
使用参数化查询或预编译语句,确保用户输入的 ID 值不直接拼接到 SQL 查询中。 对输入的 ID 值进行验证,确保它是合法的数字,并限制 ID 值的范围在合理的边界内。 对输入的 ID 值进行过滤,确保它不包含任何恶意代码或特殊字符。 最小化数据库的权限,确保应用程序只能访问必要的数据,并限制对数据库的敏感操作。 定期进行安全审计和渗透测试,以发现和修复潜在的 SQL 注入漏洞。 通过采取这些安全措施,可以有效地防止 ID 为数字型的简单边界 SQL 注入漏洞,并提高 Web 应用程序的安全性。 概念3:yakit靶场第三关【参数是 JSON,JSON中字段存在SQL注入】
有时,开发人员可能会使用 JSON 格式作为 GET 参数来传递更复杂的数据结构。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,因此在 Web 开发中广泛使用。JSON 由键值对组成,使用花括号{}表示,例如: http://example.com/api?data=``{``"name":"John","age":30}。 然而,如果在处理 GET 参数时,应用程序没有正确地验证和过滤输入的 JSON 数据,就可能导致 JSON 中的字段存在 SQL 注入漏洞。 防御措施:# 应该检查 JSON 对象中的每个字段和值,确保它们符合预期的数据类型和格式。 不应该直接将 JSON 数据作为 SQL 查询的一部分,而应该使用参数化查询或预编译语句,以确保输入数据不会被误解为可执行的 SQL 代码。 只有这样,才能有效地防止 JSON 中字段存在 SQL 注入的风险。 概念4:yakit靶场第四关【GET参数是被编码的JSON,JSON中字段存在SQL注入】
这种漏洞是由于在处理 GET 参数时,服务器端接收到经过 Base64 编码的 JSON 数据,但在解码 JSON 数据后未对其中的字段进行适当的输入验证和处理,直接将其用于构建 SQL 查询语句,导致 SQL 注入漏洞的产生。 攻击者可以通过恶意构造经过 Base64 编码的 JSON 数据,利用 JSON 中存在的 SQL 注入漏洞来修改查询语句,执行恶意的数据库操作,甚至获取、修改或删除数据库中的数据。这种漏洞可能导致严重的安全问题,泄露用户隐私信息、破坏数据完整性等。
防御措施:# 避免直接拼接 SQL 查询: 绝不要直接将用户提供的数据直接拼接到 SQL 查询中,无论数据是否经过 Base64 编码。直接拼接会导致 SQL 注入漏洞,攻击者可以通过恶意构造的数据修改查询语句,从而访问、修改或删除数据库中的数据。 解码 Base64 数据: 首先,在服务器端接收到 GET 参数后,先进行 Base64 解码得到原始的 JSON 数据。 使用参数化查询或 ORM: 使用参数化查询或对象关系映射(ORM)库来与数据库进行交互。参数化查询将参数与查询语句分开,从而防止 SQL 注入攻击。 关键步骤
步骤1:抓包
步骤2:看包
步骤3:尝试,对症下药
相关代码 无
3.实操练习 和 解析
观察url,看看存在哪些漏洞,然后注入payload
4.个人总结(写下自己对本节课的理解、收获、困惑和需要进一步学习的内容)
本节课最大的收获是:学会了简单的SQL注入,以及明白了SQL注入原理
仍然存在疑问的地方:SQL注入防御措施
需要课后深入学习的内容:SQL剩下的靶场学习
|