Web安全渗透测试基础知识之SQL注入篇

一、SQL注入基础理论
 
1.1 什么是SQL注入
 
SQL注入是一种常见的Web安全问题,攻击者通过在Web应用程序的输入字段中插入恶意的SQL语句,改变原本SQL查询的逻辑,实现非法获取数据、篡改数据、执行系统命令等操作。这种情况产生的根本原因在于应用程序对用户输入数据的合法性没有进行严格的验证和过滤,导致用户输入的数据被当作SQL语句的一部分执行。
 
1.2 SQL注入的危害
 
数据泄露:攻击者可以通过SQL注入获取数据库中的敏感信息,如用户账号、密码、身份证号等。
数据篡改:修改数据库中的数据,如篡改用户的交易记录、修改网站内容等。
权限提升:在某些情况下,攻击者可以利用SQL注入获取数据库管理员权限,进一步控制整个服务器。
服务器被控制:通过SQL注入执行系统命令,控制服务器,如上传恶意文件、开启后门等。
 
1.3 SQL注入的类型
 
数字型注入:当输入的参数为数字类型时,SQL语句中没有使用引号包裹参数,如  SELECT * FROM users WHERE id = 1 。
字符型注入:输入的参数为字符类型,SQL语句中使用引号包裹参数,如  SELECT * FROM users WHERE username = 'admin' 。
宽字节注入:利用GBK等宽字节编码的特性,绕过对单引号等特殊字符的过滤。
盲注:在无法直接获取数据库返回结果的情况下,通过构造条件语句,根据页面返回的状态(如页面正常、页面错误、响应时间等)来推断数据库中的信息,包括布尔盲注和时间盲注。
二次注入:攻击者将恶意数据存储在数据库中,当应用程序再次调用该数据进行SQL操作时,触发SQL注入。
堆叠注入:在一条SQL语句中执行多条SQL语句,通过分号(;)分隔不同的SQL命令 。
 
二、SQL注入实战案例
 
2.1 搭建测试环境
 
我们可以使用PHP + MySQL搭建一个简单的Web应用来模拟相关场景。
 
数据库表结构:

CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50),password VARCHAR(50)
);
INSERT INTO users (username, password) VALUES ('admin', 'admin123'), ('user1', 'user123');

PHP代码(存在非安全设计):

 
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);// 检查连接
if ($conn->connect_error) {die("连接失败: ". $conn->connect_error);
}$user_input = $_GET["username"];
$sql = "SELECT * FROM users WHERE username = '$user_input'";
$result = $conn->query($sql);if ($result->num_rows > 0) {while($row = $result->fetch_assoc()) {echo "id: ". $row["id"]. " Name: ". $row["username"]. "<br>";}
} else {echo "没有找到匹配的用户";
}$conn->close();
?>

访问链接  http://localhost/test.php?username=admin  时,会正常查询并显示用户信息。

2.2 数字型SQL注入实战

假设SQL查询语句为  SELECT * FROM products WHERE id = 1 ,我们可以尝试以下操作:

输入  1 or 1=1 ,此时SQL语句变为  SELECT * FROM products WHERE id = 1 or 1=1 ,由于  1=1  恒成立,会返回所有产品信息。

2.3 字符型SQL注入实战

对于  SELECT * FROM users WHERE username = 'admin'  这样的查询语句:

输入  ' or '1'='1 ,SQL语句变为  SELECT * FROM users WHERE username = '' or '1'='1' ,同样因为  '1'='1'  恒成立,会返回所有用户信息。

输入  ' and 1=2 union select 1,2 -- - , ' and 1=2  使前面的查询条件不成立, union select 1,2  会将  1  和  2  作为查询结果返回, -- -  注释掉后面的单引号,防止语法错误。

2.4 盲注实战

布尔盲注

假设页面只有两种返回状态:有数据返回时显示 “查询成功”,无数据返回时显示 “查询失败”。我们可以通过构造条件语句来推断数据库中的信息。例如,判断数据库中是否存在  admin  用户:

输入  ' and exists(select * from users where username='admin') -- - ,如果页面显示 “查询成功”,则说明存在  admin  用户。

时间盲注

当页面没有明显的回显信息时,可以利用时间盲注。例如,判断数据库中  users  表的记录数是否大于10:

' and if((select count(*) from users)>10, sleep(5), 1) -- -

如果页面响应时间超过5秒,说明  users  表的记录数大于10。

三、SQL注入遇到的问题及解决方案

3.1 特殊字符过滤

很多应用程序会对单引号、分号等特殊字符进行过滤,导致相关操作失败。

解决方案:

使用编码绕过,如将单引号  '  编码为  %27 (URL编码)。

利用宽字节注入,在单引号前添加  %df (GBK编码下, %df'  会组成一个合法的汉字,从而绕过单引号过滤)。

3.2 预编译语句的使用

预编译语句可以有效防范相关风险,因为它将用户输入的数据和SQL语句进行了分离。

示例代码(PHP PDO预编译):

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";try {$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);// 设置 PDO 错误模式为异常$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$user_input = $_GET["username"];$sql = "SELECT * FROM users WHERE username = :username";$stmt = $conn->prepare($sql);$stmt->bindParam(':username', $user_input);$stmt->execute();$result = $stmt->fetchAll(PDO::FETCH_ASSOC);if (count($result) > 0) {foreach ($result as $row) {echo "id: ". $row["id"]. " Name: ". $row["username"]. "<br>";}} else {echo "没有找到匹配的用户";}
} catch(PDOException $e) {echo "Error: ". $e->getMessage();
}
$conn = null;
?>

在上述代码中, bindParam  方法会自动对用户输入进行转义,确保数据的安全性。

四、绕过WAF(Web应用防火墙)

4.1 WAF的工作原理

WAF通过检测HTTP请求中的数据,与预设的规则库进行匹配,一旦发现请求中包含可疑的特征,就会拦截该请求。

4.2 绕过WAF的方法

大小写混合:将SQL关键字进行大小写混合,如  SeLeCt ,可能绕过部分基于规则的WAF。

内联注释:使用MySQL的内联注释,如  /*!SELECT*/ ,部分WAF可能无法识别这种形式的SQL关键字。

双写绕过:将关键字拆分后双写,例如  selseselectct ,当WAF过滤掉第一个  select  后,仍能组成完整的  select  关键字。

编码绕过:对相关语句进行URL编码、Unicode编码等,如将  select  编码为  %73%65%6C%65%63%74 ,绕过基于明文匹配的WAF。

利用WAF的逻辑漏洞:某些WAF在处理长请求、多参数请求时可能存在逻辑问题,可以构造特殊的请求格式来绕过检测。

五、总结

SQL注入是Web应用中非常危险的安全问题,掌握SQL注入的原理、实战技巧以及绕过方法,对于渗透测试人员来说至关重要。同时,开发人员也应该重视输入验证和使用安全的数据库操作方式(如预编译语句),从根源上避免出现相关安全隐患。在实际的渗透测试和安全防护过程中,需要不断学习和实践,以应对不断变化的攻击和防御技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM方法区核心技术解析:从方法区到执行引擎

方法区 方法区的内部结构 在经典方法区设计中&#xff0c;主要存储以下核心数据内容&#xff1a; 一、类型信息 方法区维护的类型信息包含以下要素&#xff1a; 类全称标识 类名称&#xff08;含完整包路径&#xff09;直接父类的完全限定名&#xff08;包含完整包路径&am…

【MyBatis插件】PageHelper 分页

前言 在开发 Web 应用时&#xff0c;我们经常需要处理海量数据的展示问题。例如&#xff0c;在一个电商平台上&#xff0c;商品列表可能有成千上万条数据。如果我们一次性将所有数据返回给前端&#xff0c;不仅会导致页面加载缓慢&#xff0c;还会对数据库造成巨大压力。为了解…

springboot+vue实现在线书店(图书商城)系统

今天教大家如何设计一个图书商城 , 基于目前主流的技术&#xff1a;前端vue&#xff0c;后端springboot。 同时还带来的项目的部署教程。 视频演示 在线书城 图片演示 一. 系统概述 商城是一款比较庞大的系统&#xff0c;需要有商品中心&#xff0c;库存中心&#xff0c;订单…

OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南

&#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680; &#x1f4d1; 目录 &#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680;一、前言 &#x1f3af;二、系统…

Oracle统计信息收集时的锁持有阶段

Oracle统计信息收集时的锁持有阶段 1 准备阶段&#xff08;共享模式锁&#xff09; 锁类型&#xff1a;对象级共享锁&#xff08;S锁&#xff09; 持续时间&#xff1a;通常1-5秒 主要操作&#xff1a; 验证对象存在性和权限检查统计信息首选项设置确定采样方法和并行度 监…

shell常用语法

一、shell变量 定义变量语法&#xff1a; 变量名值 # 等号两边不能有空格 示例&#xff1a; #!/bin/bash name"Alice" echo "Hello, $name!" # 使用变量使用变量-语法&#xff1a; 两种方式&#xff1a; 第一种&#xff1a;${变量名} 第二种&#x…

《教育退费那些事儿:从困境到破局》

《教育退费那些事儿&#xff1a;从困境到破局》 教育退费&#xff1a;不容忽视的热点问题 在当今社会&#xff0c;教育消费已成为家庭支出的重要组成部分。无论是 K12 阶段的学科辅导、艺术特长培训&#xff0c;还是成人的职业技能提升、学历继续教育&#xff0c;家长和学生们…

老字号焕新案例:天猫代运营如何让传统品牌年轻化破圈

老字号焕新案例&#xff1a;天猫代运营如何让传统品牌年轻化破圈 在消费升级与年轻化浪潮的冲击下&#xff0c;传统老字号品牌常面临“有历史无活力、有产品无流量”的困境。如何借助电商平台实现品牌焕新&#xff0c;成为其破局的关键。品融&#xff08;PINKROON&#xff09…

高可靠低纹波国产4644电源芯片在工业设备的应用

摘要 随着工业自动化和智能化的飞速发展&#xff0c;工业设备对于电源芯片的性能和可靠性提出了前所未有的严格要求。电源芯片作为工业设备的核心供电组件&#xff0c;其性能直接影响到整个设备的运行效率和稳定性。本文以国科安芯的ASP4644四通道降压稳压器为例&#xff0c;通…

Vue组件-霓虹灯:技术解析与实现

Vue组件-霓虹灯&#xff1a;技术解析与实现 本文将详细解析如何使用Vue 3实现一个动态炫彩霓虹灯效果。 预览 概述 此Vue组件创建了一个由7个同心圆环组成的霓虹灯效果&#xff0c;每个圆环具有彩虹中的一种颜色&#xff08;红、橙、黄、绿、蓝、靛、紫&#xff09;。这些圆…

【实战教程】从零实现DeepSeek AI多专家协作系统 - Spring Boot+React打造AI专家团队协作平台

&#x1f680; 本项目是DeepSeek大模型应用系列的V3版本&#xff0c;基于V1和V2版本的功能进行全面升级&#xff0c;引入了多智能体协作机制&#xff01; 系列教程推荐阅读顺序&#xff1a; 【V1版本】零基础搭建DeepSeek大模型聊天系统 - Spring BootReact完整开发指南【V2版本…

第8章-5 sql的执行顺序

上一篇&#xff1a;《第8章-4 查询性能优化2》&#xff0c;接着来了解查询的执行顺序&#xff0c;了解顺序对于优化会有帮助。 1&#xff0c;sql编写顺序 select distinct 查询字段 from 表名 JOIN 表名 ON 连接条件 where 查询条件 group by 分组字段 having 分组后…

设计模式学习整理

目录 UML类图 设计模式六大原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则(最少知道原则) 6.开(放封)闭原则 设计模式分类 1.创建型模式 2.结构型模式 4.行为型模式 一、工厂模式(factory——简单工厂模式和抽象工厂模式) 1.1、…

Linux干货(二)

前言 从B站黑马程序员Linux课程摘选的学习干货&#xff0c;新手友好&#xff01;若有侵权&#xff0c;会第一时间处理。 目录 前言 1.cd pwd命令 1.cd命令的作用 2.pwd命令的作用 2.相对路径绝对路径和特殊路径符 1.相对路径和绝对路径 1.绝对路径 2.相对路径 2.特殊…

ngx_http_keyval_module动态键值管理

一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module&#xff0c;说明模块已编译进 NGINX。 若未找到&#xff0c;请联系你的 NGINX 供应商&#xff0c;获取商业版或重新编译并启用该模块&am…

upload-labs通关笔记-第4关 文件上传之.htacess绕过

目录 一、.htacess 二、代码审计 三、php ts版本安装 1、下载ts版本php 2、放入到phpstudy指定文件夹中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 &#xff08;1&#xff09;定位文件 &#xff08;2&#xff09;修改文件 6、重启小皮 7、切换…

LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释

在日常刷题和面试中,「合并两个有序数组」是一个经典基础题。虽然属于简单难度,但它非常考察你的数组操作技巧和代码优化能力。本篇文章将带你从基础解法入手,进阶到最简洁的三元表达式写法,理解每一行代码背后的逻辑。 📌 题目描述 给你两个按 非递减顺序 排列的整数数组…

Kafka进阶指南:从原理到实战

目录 一、Kafka 基础回顾 二、生产者进阶 2.1 数据生产流程深度解析 2.2 关键配置参数详解 2.3 序列化与自定义序列化器 三、消费者进阶 3.1 消费方式与原理 3.2 分区分配策略 3.2.1 Range&#xff08;范围&#xff09;策略 3.2.2 Round - Robin&#xff08;轮询&…

Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器

​一、软件介绍 文末提供程序和源码下载 Lightpanda开源浏览器&#xff1a;专为 AI 和自动化而设计的无界面浏览器&#xff1b; Javascript execution Javascript 执行Support of Web APIs (partial, WIP)支持 Web API&#xff08;部分、WIP&#xff09;Compatible with Pla…

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制&#xff0c;通常意味着复杂的技术挑战&#xff0c;但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中)&#xff0c;这一切都变得简单易用。通过最新团结引擎官方车模 Sample&#xff0c;开发者能切身感受到全新光照优化与编辑功能…