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
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

