WEB安全--SQL注入--PDO与绕过
一、PDO介绍:
1.1、原理:
PDO支持使用预处理语句(Prepared Statements),这可以有效防止SQL注入攻击。预处理语句将SQL语句与数据分开处理,使得用户输入的数据始终作为参数传递给数据库,而不会直接拼接进SQL语句中,从而防止了SQL注入
1.2、预编译的区分:
1.2.1、真实预编译:
把ATTR_EMULATE_PREPARES设为false:
<?php
$username = $_POST['username'];$db = new PDO("mysql:host=localhost;dbname=test", "root", "root123");
$db -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false);$stmt = $db->prepare("SELECT password FROM test where username= :username");$stmt->bindParam(':username', $username);$stmt->execute();$result = $stmt->fetchAll(PDO::FETCH_ASSOC);var_dump($result);$db = null;?>
#首先定义模版,以'?’作为占位符:
prepare SELECT password FROM users where username= ?#然后插入用户输入的值,转译其中的特殊字符再将其放在''中执行:
execute SELECT password FROM users where username=
'admin\' union select database()#'#可以看到,我们的payload中的字符被转译了,而且还被放在引号中整个被当做字符串处理了,
不同于设置waf,这种情况下任何奇技淫巧都是徒劳的,我们无法逃逸出来
1.2.2、模拟预编译:
没有取消ATTR_EMULATE_PREPARES,默认为模拟预编译:
<?php
$username = $_POST['username'];$db = new PDO("mysql:host=localhost;dbname=test", "root", "root123");$stmt = $db->prepare("SELECT password FROM test where username= :username");$stmt->bindParam(':username', $username);$stmt->execute();$result = $stmt->fetchAll(PDO::FETCH_ASSOC);var_dump($result);$db = null;?>
#没有定义模版,后端只是对我们的输入做了一个字符转译:
query SELECT password FROM users where username=
admin\' union select database()#'#可以看到这个模拟预编译的防御就不如真实预编译密不透风了
二、基于模拟预编译的绕过:
2.1、宽字节注入:
#宽字节注入出现的本质就是因为数据库的编码与代码的编码不同,导致用户可以通过
输入精心构造的数据通过编码转换吞掉转义字符。在对于我们输入的payload的处理上,模拟预编译只是使用了\来进行转义,如果我们
能有什么办法吞掉这个\,那是不是我们就可以执行恶意的sql语句了呢?#接下来就到宽字注入登场了:
#宽字节注入的原理:编码方式:
--UTF-8:
可变长度编码:每个字符占用 1 到 4 个字节。
ASCII 字符(如英文字母)占 1 字节。
中文字符(如汉字)占 3 字节。
特殊字符或罕见字符可能占 4 字节。
向下兼容 ASCII。--GBK:
可变长度编码:每个字符占用 1 或 2 个字节。
ASCII 字符占 1 字节。
中文字符占 2 字节。#可以看到这些编码方式英文字母都只占1个字节以less-32为例第三十二关使用preg_replace函数将 斜杠,单引号和双引号过滤了,
如果输入id=1'会变成id=1\',使得引号不起作用。
但是可以注意到数据库使用了gbk编码。
这里我们可以采用宽字节注入。当某字符的大小为一个字节时,
称其字符为窄字节当某字符的大小为两个字节时,称其字符为宽字节。
所有英文默认占一个字节,汉字占两个字节。#假如我们输入:
?id=1'
#那被模拟预编译处理后就是:
?id=1\'
hex: 315c27
#那当我们插入:
?id=1%df'
#被处理后的就是:
?id=1%df\'
hex: 31df5c27 (发生了报错,说明我们的'起作用了)#原因如下:
1 %df \ '
31 df 5c 27在GBK编码中,%df和\组成了一个中文字符,占2个字节,
也就是这个中文字符的十六进制编码为:df5c,所以我们输入的payload被处理后变成了 1�',
这样我们的单引号就逃逸出来了,后面的问题也就迎刃而解了。#payload
?id=-1%df' union select 1,2,database()--+
2.2、堆叠注入:
PDO默认支持多行查询,但是其只能显示第一行查询的结果
#没有参数绑定的预编译等于没有预编译,无论是真编译还是模拟预编译,
没有参数绑定等于没编译,并且由于pdo默认支持堆叠注入,
我们可以通过堆叠注入先插入值然后查询插入的值获取输出结果。--我们可以post一个id=1;
insert into test(id,username,password) values(520,database(),user())--然后传递id=520--我们就能得到database()和user()的输出值了
三、基于真实预编译的绕过:
3.1、思考:
按正常思路来说,我们是无法在注入语句上下功夫去绕过真实预编译的,因为我们的payload无论怎样写都只会被当做字符串处理;那有没有什么语句接收的参数不能被加引号呢?
实际上在mysql中order by、group by、limit、表名、列名、join这些都是不能在其后面接收的参数左右加引号的,因为一旦在其后面的参数上加了引号就会被当做字符串处理,查询时就会造成语法错误,并且pdo的设计目的也不是为了防止SQL注入的,是用来在大批量查询时减少语法树构造的,因此官方自然也不会让pdo在这些方法后加引号
并且在这些方法中只有order by和group by能够加以利用,就算pdo不在表名、列名上加引号也没有利用的价值
3.2、order by绕过:
#假如我们通过下面两条语句查表:select username from users order by rand(true)admin
lili
xiaomingselect username from users order by rand(false)lili
xiaoming
admin#可以看到如果页面有查询后的信息回显,布尔值的不同回显的数据也不同,
那直接用布尔盲注的手段结合脚本就能遍历出我们想要的信息#示例payload:rand(ascii(substr((select database()),1,1))>115)
#那如果页面回显数据是相同的或者页面没有回显呢?#我们就可以使用时间盲注的手段了#示例payload:rand(if(ascii(substr(select user(),1,1)),sleep(3),0))
3.3、group by绕过:
与order by原理相似,如法炮制即可,如果网页有group by的功能使用相同的方式也是有相同效果的。
相关文章:
WEB安全--SQL注入--PDO与绕过
一、PDO介绍: 1.1、原理: PDO支持使用预处理语句(Prepared Statements),这可以有效防止SQL注入攻击。预处理语句将SQL语句与数据分开处理,使得用户输入的数据始终作为参数传递给数据库,而不会直…...
SQL与数据库程序设计
1.1986年,10月美国国家标准局颁布了SQL语言的美国标准,称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…...
软考高级《系统架构设计师》知识点(五)
计算机网络 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。 计算机网络的功能:数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标:速率、带宽(频带宽度或…...
DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
Ubuntu 系统 LVM 逻辑卷扩容教程
Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中,LVM(Logical Volume Manager)是一种逻辑卷管理工具,允许管理员动态调整磁盘空间,而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷,以实现…...
美团一面,有点难度。
一位粉丝朋友分享了最近参与美团民宿旅游业务线的一面的经历,全程约1小时,面试官围绕高并发、分布式事务、性能优化等高频考点展开追问,问题密集且注重落地细节。以下是完整问题整理回答思路扩展解析,助你避坑! 一、项…...
7-Zip Final绿色版:高效压缩解压缩工具
在工作与学习旅程中,我们时常需要与各式各样的文件和文件夹打交道。为了更有效地利用存储空间或促进文件的便捷传输,压缩与解压工具自然而然地成为了我们不可或缺的助手。在众多同类工具中,7-Zip凭借其高效能、免费及开源的特性,深…...
详解如何使用Pytest内置Fixture tmp_path 管理临时文件
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 临时目录在测试中起着至关重要的作用,它为执行和验证代码提供了一个可控…...
QML使用ChartView绘制饼状图
一、工程配置 首先修改CMakeLists.txt,按下图修改: find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp,按下图修改ÿ…...
用大模型学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)
https://metaso.cn/s/r4kq4Ni 什么是最大似然估计(MLE)最大后验估计(MAP)?深度学习中如何应用,举例说明。 好的,我现在需要回答关于最大似然估计(MLE)和最大后验估计&…...
Rust学习总结之结构体(一)
一:结构体定义 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field…...
【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决
问题描述 我们将Debug版本的安装包发送到手机上安装,会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码: android.injected.testOnlyfalse 最后点击“Sync now”,等待重新加载gradle资源即可 后面我们重新编译Debug安装…...
Ubuntu添加桌面快捷方式
以idea为例 一. 背景 在ubuntu中,很多时候是自己解压的文件并没有桌面快捷方式,需要自己找到对应的目录的执行文件手动打开,很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…...
day09_实时类标签/指标
文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…...
排序算法的魔法世界:用C语言揭开数据排列的奥秘
当数据开始跳集体舞:排序的意义 想象你面前有一群调皮的数字精灵在开派对,7和3在跳探戈,9和1在玩捉迷藏,5和2在抢蛋糕。这时候就需要排序算法这位神奇的派对管家出场了!它像音乐指挥家一样挥动魔棒,让所有数字精灵乖乖排成整齐的队伍。在计算机的世界里,排序算法就是处…...
网页模板免费HTML源码 HTML网页设计模板
在现代网站开发中,拥有一个美观且功能齐全的网页模板是至关重要的。对于许多开发者和设计师来说,获取高质量的免费HTML源码和网页设计模板可以大大简化开发流程。本文将探讨网页模板免费HTML源码的资源、优势以及如何有效利用这些模板。 什么是网页模板…...
Python实现语音识别详细教程【2025】最新教程
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程,涵盖环境搭建、使…...
与传统光伏相比 城电科技的光伏太阳花有什么优势?
相比于传统光伏,城电科技的光伏太阳花有以下优势: 一、发电效率方面 智能追踪技术:光伏太阳花通过内置的智能追踪系统,采用全球定位跟踪算法,能够实时调整花瓣(即光伏板)的角度,确…...
Qt——连接MySQL数据库之ODBC的方法详细总结(各版本大同小异,看这一篇就够了)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...
Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究
基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…...
pytest测试专题 - 1.3 测试用例发现规则
<< 返回目录 1 pytest测试专题 - 1.3 测试用例发现规则 执行pytest命令时,可以不输入参数,或者只输入文件名或者目录名,pytest会自己扫描测试用例。那pytest基于什么规则找到用例呢? 文件名:满足文件名称为tes…...
【Bluedroid】 BLE连接源码分析(一)
BLE链接过程分析见【Bluedroid】BLE连接过程详解-CSDN博客,本篇主要围绕HCI_LE_Create_Connection展开。基于Android14源码进行分析。在蓝牙低功耗技术中,设备之间建立连接是进行数据传输等操作的前提。HCI LE Extended Create Connection Command 提供了一种更灵活、功能更丰…...
Unity DeepSeek API 聊天接入教程(0基础教学)
Unity DeepSeek API 聊天接入教程(0基础教学) 1.DeepSeek 介绍 DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025年1月20日,DeepSeek-R1正式上线,和当前市面上的主流AI相比,它在仅有极少标注数据的情况下&am…...
【16届蓝桥杯寒假刷题营】第1期DAY4
4.可达岛屿的个数 - 蓝桥云课 题目背景 在一个神奇的魔法世界中,有一座古老的迷幻之城。迷幻之城被分成 n 个鸟屿,编号从 1 到 n,共有 m 座桥。迷幻之城的居民们希望能够建立起紧密的联系,每个岛屿上的居民都想知道自己最多能到…...
Flink提交pyflink任务
1.官方文档: flink1.14:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/cli/#submitting-pyflink-jobs flink1.18:https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/cli/#submitting-pyflink-jobs 2.提…...
大语言模型中one-hot编码和embedding之间的区别?
1. 维度与稀疏性 One-Hot编码 定义:每个词被表示为一个高维稀疏向量,维度等于词汇表大小。例如,词汇表有10,000个词,每个词对应一个10,000维的向量,其中仅有一个位置为1(表示当前词)࿰…...
CAN学习记录
CAN(Controller Area Network),是ISO国际标准化的串行通信协议,为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需求 低速CAN(ISO11519)通信速率10~125kbps,总线长度可达1000米 高速CAN&#…...
滑动窗口算法篇:连续子区间与子串问题
1.滑动窗口原理 那么一谈到子区间的问题,我们可能会想到我们可以用我们的前缀和来应用子区间问题,但是这里对于子区间乃至子串问题,我们也可以尝试往滑动窗口的思路方向去进行一个尝试,那么说那么半天,滑动窗口是什么…...
机器翻译同样的文本,是从英语翻译成日语更准确还是中文翻译成日语更准确
在大多数情况下,从英语翻译成日语会比从中文翻译成日语更准确,原因如下: 1. 语言结构的相似性 英语和日语的句子结构更接近,特别是在语法、从句使用、定语位置等方面。例如,日语和英语都使用 SVO 结构(主…...
MybatisMybatisPllus公共字段填充与配置逻辑删除
Mybatis/MybatisPllus公共字段填充与配置逻辑删除 在开发过程中,很多时候需要处理一些公共字段,例如:创建时间、修改时间、状态字段等。这些字段通常会在插入或更新数据时进行填充,以便记录数据的变化和状态。同时,逻…...
