SQL 注入之堆叠查询与 WAF 绕过注入

SQL 注入之堆叠查询与 WAF 绕过注入

目录

一、引言

在 WEB 安全领域,SQL 注入一直是重点关注内容。今天我们来深入探讨 SQL 注入中的堆叠查询以及 WAF(Web 应用防火墙)绕过注入相关知识,这对理解和应对复杂的网络安全形势有着重要意义。

二、堆叠查询 (一)原理

堆叠查询的英文是 “”,从名词含义来看,它是指多条 SQL 注入语句同时执行。在实际应用中,在支持堆叠查询的数据库环境下,可以实现这种操作。

(二)示例与步骤 数据库支持性

需要注意的是,堆叠查询是分数据库的sql注入绕过waf,不是所有数据库都支持。例如,MySQL 支持堆叠查询,而 SQL 、 等部分数据库可能不支持。简单演示(以 MySQL 为例)

假设我们已经连接到自己的数据库,可以通过以下步骤理解堆叠查询。首先查询一张表SQL 注入之堆叠查询与 WAF 绕过注入,比如:

SELECT * FROM users;

然后,可以使用分号(在 SQL 中,分号代表一个语句的结束)在后面添加另一条语句,如:

SELECT * FROM users; SELECT * FROM orders;

这样就实现了两条语句的堆叠执行,会同时查询users表和表。

以下是一个使用 连接 MySQL 数据库并执行堆叠查询的示例代码:

import mysql.connector
# 连接数据库
mydb = mysql.connector.connect(
    host="localhost",
    user="your_user",
    password="your_password",
    database="your_database"
)
mycursor = mydb.cursor()
# 执行堆叠查询
query = "SELECT * FROM users; SELECT * FROM orders"
mycursor.execute(query)
results = mycursor.fetchall()
for row in results:
    print(row)
mycursor.close()
mydb.close()

实际应用场景与案例(以获取管理员账号密码为例)

假设在一个存在 SQL 注入漏洞的系统中,我们需要获取管理员的账号密码,但密码是加密的无法解密。这时可以利用堆叠注入来插入数据。比如:

# 假设原查询语句(存在注入点)
original_query = "SELECT * FROM users WHERE id = [user_input]"
# 构造堆叠注入语句
injection_query = original_query + "; INSERT INTO users (username, password, role) VALUES ('admin_injected', 'injected_password', 'admin')"
# 这里只是示例,在实际中可以通过修改请求参数等方式将injection_query发送到服务器执行

通过这种方式,插入了一个自定义的管理员账号和密码,然后可以使用这个账号密码登录后台,绕开了无法解密原始管理员密码的问题。

三、WAF 绕过注入 (一)WAF 简介与绕过的意义

WAF 是用于保护 Web 应用免受攻击的重要防线,它会对传入的请求数据进行检测和过滤,防止 SQL 注入等攻击。但攻击者会尝试寻找方法绕过 WAF 来实施攻击。我们主要围绕宝塔、安全狗、阿里云的安骑士(阿里云服务器自带防护)这三款 WAF 进行讲解,因为它们在市场上比较常见或具有代表性。

(二)绕过方法分类 数据层面操作:大部分 WAF 是根据提交的数据进行检测的,所以可以对网站的参数数据进行编辑来绕过。例如,对注入语句进行变形,使其看起来不像恶意代码。提交方式层面:不同的请求方式(如 GET、POST、 等)可能会被 WAF 区别对待。有些 WAF 可能只检测 GET 请求中的 SQL 注入,而对 POST 请求检测不足。我们可以利用这一点,通过改变提交方式来绕过 WAF。例如,如果 WAF 只检测 GET 方式的注入,我们可以尝试将数据通过 POST 方式提交。其他方法:利用不同数据库的特性、垃圾数据、参数污染等方法来辅助绕过。每个数据库在处理 SQL 语句时有其独特的特性,攻击者可以利用这些特性来构造特殊的注入语句以绕过 WAF。 (三)以安全狗为例的分析(部分代码示例) 安全狗的设置与检测规则

安全狗在安装后有一些默认设置,在漏洞防护方面,它有各种检测规则。比如在 SQL 注入防护中,有不同的检测项目,包括对 GET(ur)、POST、、头部等类型数据的检测,并且可以勾选是否检测。从这些规则可以看出,它的检测可能存在不全面的情况,这就为绕过提供了机会。

以下是一个简单的前端(Vue3 和 )和后端(Java)交互的示例,模拟一个可能存在 WAF 绕过情况的登录功能(这里只是示例,实际情况更复杂):

前端代码(Vue3 和 ):


  
import { defineComponent } from 'vue'; import axios from 'axios'; export default defineComponent({ name: 'LoginComponent', data() { return { username: '', password: '' }; }, methods: { async login() { try { // 这里假设后端登录接口是/login,实际需要根据情况修改 const response = await axios.post('/login', { username: this.username, password: this.password }); if (response.data.success) { console.log('登录成功'); } else { console.log('登录失败'); } } catch (error) { console.error('登录出错', error); } } } });

后端代码(Java):

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        try {
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database", "your_user", "your_password");
            String sql = "SELECT * FROM users WHERE username =? AND password =?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, username);
            preparedStatement.setString(2, password);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                response.getWriter().write("{"success": true}");
            } else {
                response.getWriter().write("{"success": false}");
            }
            resultSet.close();
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
            response.getWriter().write("{"success": false}");
        }
    }
}

在上述示例中sql注入绕过waf,如果安全狗只检测 GET 请求中的 SQL 注入,而攻击者在用户名或密码输入框中输入恶意的 SQL 语句sql注入绕过waf,并通过 POST 方式提交SQL 注入之堆叠查询与 WAF 绕过注入,就可能绕过安全狗的检测。但这只是一个简单的示例,实际的 WAF 绕过需要更深入的分析和复杂的技术。

资源防护与其他相关功能

安全狗除了 SQL 注入防护,还有资源防护功能,比如后台地址防护、CC 流量攻击防护、特定资源(如某些文件类型)防护等。当大量请求或者异常请求访问时,它可能会根据 IP 地址请求次数和速度等因素判断是否为攻击,并进行拦截。这也提醒我们在研究 WAF 绕过的时候,需要综合考虑这些因素,因为不同的防护功能可能会相互影响或者存在新的绕过机会。 四、总结

堆叠查询和 WAF 绕过注入是 SQL 注入领域中比较复杂和具有挑战性的内容。在实际的网络安全防护中,开发人员需要充分了解这些攻击方式,从而更好地编写安全的代码和配置有效的防护机制。同时,在进行安全测试等操作时,也要注意在合法授权的环境下进行,避免对他人系统造成损害。对于防御措施,要从输入验证、参数化查询、安全配置等多方面入手,保障系统的安全性。

请注意,以上代码只是示例,实际情况需要根据具体的应用环境和安全策略进行调整和完善。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » SQL 注入之堆叠查询与 WAF 绕过注入

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们