SQL盲注攻击详解及防御措施

ops/2024/11/28 23:20:59/

文章目录

      • 基于布尔的盲注
        • 工作原理
        • 示例代码
        • 防御措施
      • 基于时间的盲注
        • 工作原理
        • 示例代码
        • 防御措施
      • 其他防御措施
        • 输入验证
        • 错误处理
        • 使用WAF(Web应用防火墙)

基于布尔的盲注

工作原理

基于布尔的盲注通过构造SQL查询来判断数据库的响应是否满足某个条件。攻击者通过观察应用程序的响应来推断数据库的信息。

示例代码

假设有一个搜索功能,允许用户通过ID查找用户信息:

from flask import Flask, request, render_template_string
import sqlite3app = Flask(__name__)@app.route('/search')
def search():user_id = request.args.get('id')conn = sqlite3.connect('example.db')cursor = conn.cursor()# 不安全的查询query = f"SELECT * FROM users WHERE id = {user_id}"cursor.execute(query)results = cursor.fetchall()return render_template_string('<pre>{{ results }}</pre>', results=results)if __name__ == '__main__':app.run(debug=True)

攻击者可以通过以下方式尝试注入:

  1. 探测可注入点

    • 请求:/search?id=1 AND 1=1
    • 请求:/search?id=1 AND 1=2
  2. 逐步猜测

    • 请求:/search?id=1 AND (SELECT substr(password, 1, 1) FROM users WHERE id = 1) = 'a'
    • 请求:/search?id=1 AND (SELECT substr(password, 1, 1) FROM users WHERE id = 1) = 'b'

通过观察应用程序的响应,攻击者可以逐步猜测出密码的第一个字符。

防御措施

使用参数化查询:

@app.route('/search')
def search():user_id = request.args.get('id')conn = sqlite3.connect('example.db')cursor = conn.cursor()# 安全的查询query = "SELECT * FROM users WHERE id = ?"cursor.execute(query, (user_id,))results = cursor.fetchall()return render_template_string('<pre>{{ results }}</pre>', results=results)

基于时间的盲注

工作原理

基于时间的盲注利用数据库的延时函数(如MySQL的SLEEP()函数),通过控制查询执行的时间来判断SQL语句是否被执行。

示例代码

假设有一个登录功能,允许用户通过用户名和密码登录:

from flask import Flask, request, render_template_string
import pymysqlapp = Flask(__name__)@app.route('/login')
def login():username = request.args.get('username')password = request.args.get('password')conn = pymysql.connect(host='localhost', user='root', password='password', db='example')cursor = conn.cursor()# 不安全的查询query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"cursor.execute(query)results = cursor.fetchall()if results:return "Login successful"else:return "Login failed"if __name__ == '__main__':app.run(debug=True)

攻击者可以通过以下方式尝试注入:

  1. 探测可注入点

    • 请求:/login?username=admin' AND SLEEP(5) AND '1'='1&password=anything
  2. 逐步猜测

    • 请求:/login?username=admin' AND IF((SELECT substr(password, 1, 1) FROM users WHERE username = 'admin') = 'a', SLEEP(5), 0) AND '1'='1&password=anything
    • 请求:/login?username=admin' AND IF((SELECT substr(password, 1, 1) FROM users WHERE username = 'admin') = 'b', SLEEP(5), 0) AND '1'='1&password=anything

通过测量响应时间,攻击者可以判断密码的第一个字符。

防御措施

使用参数化查询:

@app.route('/login')
def login():username = request.args.get('username')password = request.args.get('password')conn = pymysql.connect(host='localhost', user='root', password='password', db='example')cursor = conn.cursor()# 安全的查询query = "SELECT * FROM users WHERE username = %s AND password = %s"cursor.execute(query, (username, password))results = cursor.fetchall()if results:return "Login successful"else:return "Login failed"

其他防御措施

输入验证

对所有用户输入进行严格的验证,确保只接受合法的数据。

def validate_input(input_str):# 假设只允许字母和数字if not input_str.isalnum():raise ValueError("Invalid input")return input_str@app.route('/search')
def search():user_id = validate_input(request.args.get('id'))conn = sqlite3.connect('example.db')cursor = conn.cursor()query = "SELECT * FROM users WHERE id = ?"cursor.execute(query, (user_id,))results = cursor.fetchall()return render_template_string('<pre>{{ results }}</pre>', results=results)
错误处理

避免向用户暴露详细的错误信息。

@app.errorhandler(Exception)
def handle_exception(e):return "An error occurred", 500
使用WAF(Web应用防火墙)

部署Web应用防火墙可以自动检测并阻止许多已知的攻击模式。

通过以上措施,可以显著提高应用程序的安全性,防止SQL盲注攻击。希望这些示例和解释能帮助你更好地理解和防范SQL盲注。


http://www.ppmy.cn/ops/137499.html

相关文章

unity 使用UI上的数字按钮,给text添加数字,并且显示光标,删除光标前数字,

今天有个需求&#xff0c;输入身份证&#xff0c;但是不用键盘&#xff0c;要点击按钮输入数字&#xff0c;并且可以控制光标&#xff0c; 1、数字按钮&#xff1a;点击后text添加数字内容 2、删除按钮&#xff1a;删除光标前的一个字符 3、左箭头&#xff1a;移动光标向左移动…

centos和ubuntu有什么区别?

CentOS与Ubuntu的区别在于以下几个方面&#xff1a;1、源码基础不同&#xff1b;2、设计理念不同&#xff1b;3、使用场景不同&#xff1b;4、软件包管理不同&#xff1b;整体上看&#xff0c;CentOS更倾向于企业级服务器应用&#xff0c;稳定性较强&#xff1b;而Ubuntu更注重…

蓝桥杯每日真题 - 第21天

题目&#xff1a;(空间) 题目描述&#xff08;12届 C&C B组A题&#xff09; 解题思路&#xff1a; 转换单位&#xff1a; 内存总大小为 256MB&#xff0c;换算为字节&#xff1a; 25610241024268,435,456字节 计算每个整数占用空间&#xff1a; 每个 32 位整数占用…

物联网实验室建设方案

一、物联网实验室建设 (1) 基础理论教学云平台 唯众基础理论教学云平台是一个专为物联网相关专业教学打造的综合性在线教学平台。该平台凭借先进的技术架构和丰富的教学资源&#xff0c;为师生提供了一个高效、便捷、互动的学习环境。以下是该平台的主要特点和功能描述&#…

2023年十四届蓝桥杯Scratch01月stema选拔赛—鹦鹉学舌

第14届蓝桥杯Scratch01月stema选拔赛真题 点击下方链接&#xff0c;查看程序演示效果&#xff1a; https://www.hixinao.com/scratch/creation/show-331.html 如需查看选择题、编程题、全套真题可自行前往题库中心&#xff0c;按需查找&#xff5e; 题库中心支持在线刷题&…

Java图书管理系统(简易保姆级)

前面学习了这么多知识&#xff0c;为了巩固之前的知识&#xff0c;我们就要写一个图书管理系统来帮助大家复习&#xff0c;让大家的知识融会贯通~~~ 话不多说&#xff0c;直接开始今天的内容~ 首先呢&#xff0c;我们要有一个大体的思路&#xff1a; 实现效果思路有两种情况&a…

node.js中使用express.static()托管静态资源

express.static()定义 express.static(root, [options])是一个中间件函数&#xff0c;负责为Express应用提供静态资源服务。它允许你指定一个或多个目录作为静态资源的根目录&#xff0c;当客户端请求这些资源时&#xff0c;Express会查找并返回对应的文件。 安装express npm i…

Jmeter中的监听器

3&#xff09;监听器 1--查看结果树 用途 调试测试计划&#xff1a;查看每个请求的详细信息&#xff0c;帮助调试和修正测试计划。分析响应数据&#xff1a;查看服务器返回的响应数据&#xff0c;验证请求是否成功。检查错误&#xff1a;识别和分析请求失败的原因。 配置步骤…