渗透第二次作业

SQL 注入总结

SQL 注入是攻击者利用 Web 应用对用户输入验证的疏忽,将恶意 SQL 命令注入后台数据库执行,进而窃取、篡改数据或控制服务器的漏洞攻击方式。

一、注入原理与条件

  1. 核心原理服务端未过滤用户输入的恶意数据,直接将其拼接进 SQL 语句执行,改变原语句语义,引发安全风险。
  2. 必要条件
    • 用户能够控制输入参数(如 URL、表单、Cookie 等)。
    • 程序将用户输入直接拼接进 SQL 语句,未做有效处理。

二、注入分类

1. 按注入点类型分

类型说明测试方法
数字型注入参数为整数(如 ID),SQL 语句无引号包裹id=1 and 1=1(正常)、id=1 and 1=2(异常)
字符型注入参数为字符串,SQL 语句有引号包裹user=admin' and '1'='1(正常)、user=admin' and '1'='2(异常)
搜索型注入注入点为搜索框,SQL 语句含 like '%关键字%'keyword=' and 条件 and '%'='

2. 按注入技术分

  • 基于报错的注入:利用extractvalue()updatexml()等函数,使数据库报错并回显敏感信息。
  • 基于布尔的盲注:根据页面返回的True/False判断条件真假,逐字符猜解数据。
  • 基于时间的盲注:利用sleep()等延时函数,通过页面响应时间判断条件是否成立。
  • 联合查询注入:使用UNION SELECT拼接查询语句,直接获取数据库数据。
  • 堆查询注入:同时执行多条 SQL 语句(如; INSERT/UPDATE/DELETE...)。
  • HTTP 头部注入:注入点为User-AgentCookieReferer等 HTTP 头字段。

三、预编译与 SQL 注入的关系

  1. 预编译的作用预编译(参数化查询)将 SQL 语句结构与参数分离,数据库先编译语句模板,再绑定参数执行,可消除 SQL 语句歧义,防御大部分注入
  2. 预编译的局限性
    • 仅能防御可参数化位置的注入,表名、列名、order by、group by等 SQL 结构位置无法参数化,仍存在注入风险。
    • 分为真预编译模拟预编译:模拟预编译仅做字符转义,存在宽字节注入风险;真预编译需关闭PDO::ATTR_EMULATE_PREPARES,安全性更高。
  3. 预编译下的注入场景
    • 宽字节注入:编码不一致(如 GBK)导致转义符\被吞,单引号逃逸。
    • 无参数绑定:预编译语句直接拼接用户输入,等同于未防护。
    • 协议层注入:利用数据库二进制协议的长度截断漏洞(如 CVE-2024-27304),绕过预编译逻辑。

四、注入过程(手工注入)

  1. 判断注入点:通过单引号、and 1=1/1=2测试页面响应。
  2. 判断字段长度:使用order by N确定查询结果的列数。
  3. 判断回显位置:使用union select 1,2,3...找到可显示数据的列。
  4. 获取数据库信息:通过database()version()user()等函数获取基础信息。
  5. 遍历数据库 / 表 / 字段:查询information_schema系统库,获取所有库名、表名、列名。
  6. 获取敏感数据:查询目标表的字段值(如用户名、密码)。
  7. 后续利用:登录后台、写入 webshell、执行系统命令等。

五、自动化注入工具(SQLMap)

  1. 核心功能:自动检测注入点、识别数据库类型、获取敏感数据。
  2. 常用命令
    • 检测注入点:sqlmap -u "http://test.com/index.php?id=1"
    • 列出所有数据库:sqlmap -u "URL" --dbs
    • 列出指定库的表:sqlmap -u "URL" -D 库名 --tables
    • 导出指定字段数据:sqlmap -u "URL" -D 库名 -T 表名 -C 字段1,字段2 --dump

六、防御措施

  1. 使用预编译语句:强制使用参数化查询,避免字符串拼接。
  2. 输入过滤与验证:过滤特殊字符(单引号、分号等),严格校验参数类型和长度。
  3. 处理字符编码:统一使用 UTF-8 编码,避免宽字节注入;设置character_set_client=binary
  4. 最小权限原则:数据库账户仅赋予必要权限,禁止使用 root 等高权限账户。
  5. 关闭错误回显:生产环境禁用数据库错误信息展示,避免泄露敏感信息。
  6. 部署 WAF:使用 Web 应用防火墙拦截恶意 SQL 注入请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值