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 bygroup 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的功能使用相同的方式也是有相同效果的。

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

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

相关文章

ES12 weakRefs的用法和使用场景

ES12 (ECMAScript 2021) 特性总结&#xff1a;WeakRef 1. WeakRef 概述 描述 WeakRef 是 ES12 引入的一个新特性&#xff0c;用于创建对对象的弱引用。弱引用不会阻止垃圾回收器回收对象&#xff0c;即使该对象仍然被弱引用持有。WeakRef 通常与 FinalizationRegistry 结合使…

50页精品PPT | 某大数据资产平台建设项目启动会材料

该PPT主要介绍了某集团大数据资产平台建设项目的启动会材料&#xff0c;围绕数据作为数字经济时代核心生产要素的背景&#xff0c;结合国家战略和集团数字化转型需求&#xff0c;分析了当前数据资源整合不足、孤岛现象严重、质量管控薄弱及共享机制不完善等问题&#xff0c;提出…

8.【线性代数】——求解Ax=b

八 求解Axb 1. 解Axb求特解 x p x_p xp​求特解 x n x_n xn​所有解 2. Axb什么时候有解3. A m ∗ n A_{m * n} Am∗n​不同秩的Axb解分析3.1 列满秩 rn<m3.2 行满秩 rm<n3.3 rmn3.4 r<m 且 r < n3.5 综述 1. 解Axb 求解 { x 1 2 x 2 2 x 3 2 x 4 b 1 2 x 1…

动静态链接与加载

目录 静态链接 ELF加载与进程地址空间&#xff08;静态链接&#xff09; 动态链接与动态库加载 GOT表 静态链接 对于多个.o文件在没有链接之前互相是不知到对方存在的&#xff0c;也就是说这个.o文件中调用函数的的跳转地址都会被设定为0&#xff08;当然这个函数是在其他.…

Web 后端 请求与响应

一 请求响应 1. 请求&#xff08;Request&#xff09; 客户端向服务器发送的HTTP请求&#xff0c;通常包含以下内容&#xff1a; 请求行&#xff1a;HTTP方法&#xff08;GET/POST等&#xff09;、请求的URL、协议版本。 请求头&#xff08;Headers&#xff09;&#xff1a;…

【Excel笔记_6】条件格式和自定义格式设置表中数值超过100保留1位,超过1000保留0位,低于100为默认

方法一&#xff1a;自定义格式 选中需要设置格式的单元格区域。右键选择设置单元格格式&#xff0c;或者在工具栏中选择开始 -> 数字 -> 自定义格式。在类型框中输入以下自定义格式&#xff1a; [>1000]0;[>100]0.0;G/通用格式解释&#xff1a; [>1000]0&…

排序与算法:希尔排序

执行效果 希尔排序的执行效果是这样的&#xff1a; 呃……看不懂吗&#xff1f;没关系&#xff0c;接着往下看介绍 算法介绍 希尔排序算法&#xff08;Shell Sort&#xff09;是按其设计者希尔&#xff08;Donald Shell&#xff09;的名字命名&#xff0c;该算法由 1959 年公布…

Python HTTP 请求工具类 HttpUtils:简化 HTTP 请求的高效工具

在现代的 Web 开发和 API 集成中,HTTP 请求是最常见的操作之一。无论是获取数据、提交表单,还是与 RESTful API 交互,我们都需要频繁地发送 HTTP 请求。为了简化这些操作,提升代码的可读性和可维护性,我们可以使用一个高效的工具类——HttpUtils。本文将详细介绍 HttpUtil…

亲测Windows部署Ollama+WebUI可视化

一. Ollama下载 登录Ollama官网(Ollama)点击Download进行下载 如果下载很慢可用以下地址下载&#xff1a; https://github.com/ollama/ollama/releases/download/v0.5.7/OllamaSetup.exe 在DeepSeek官网上&#xff0c;你可以直接点击【model】 到达这个界面之后&#xff0c;…

用xml配置spring, bean标签有哪些属性?

用xml配置spring, bean标签有哪些属性? 在Spring框架中&#xff0c;使用XML配置文件时&#xff0c;<bean>标签用于定义一个Bean。以下是一些常用的<bean>标签属性&#xff1a; 1. class 描述&#xff1a;指定Bean的类名。示例&#xff1a;<bean id"myBe…

50页PDF|数字化转型成熟度模型与评估(附下载)

一、前言 这份报告依据GBT 43439-2023标准&#xff0c;详细介绍了数字化转型的成熟度模型和评估方法。报告将成熟度分为五个等级&#xff0c;从一级的基础转型意识&#xff0c;到五级的基于数据的生态价值构建与创新&#xff0c;涵盖了组织、技术、数据、资源、数字化运营等多…

golang panic信息捕获

背景 我们的日志接入阿里云sls平台&#xff0c;但是&#xff0c;日志是以json的格式存储在阿里云sls平台上&#xff0c;程序中产生的error,info等日志都可以实现以json的格式打印。但是&#xff0c;golang程序中产生的panic信息本身不是以json的格式输出&#xff0c;这就导致p…

拦截器VS过滤器:Spring Boot中请求处理的艺术!

目录 一、拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;&#xff1a;都是“守门员”&#xff01;二、如何实现拦截器和过滤器&#xff1f;三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 &#x1f31f;如果喜欢作者的讲…

FastGPT及大模型API(Docker)私有化部署指南

​​欢迎关注【AI技术开发者】 ​ 经过优化&#xff0c;在不影响FastGPT功能的情况下&#xff0c;大幅降低了部署的设备配置要求&#xff0c;仅需1c1h即可正常部署使用。 官方要求配置&#xff1a; ​ ​ 优化后的实际占用情况&#xff1a; 运行内存仅需370M&#xff08…

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题 前言问题描述问题原因尝试过的命令及分析解决方案&#xff1a;修改 wsl.conf 禁用自动生成总结 前言 在使用 Windows Subsystem for Linux (WSL) 的 Ubuntu 子系统时&#xff0c;你可能会遇到 /etc/resolv.conf 文件被自动重…

【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】

一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…

企业软件合规性管理:构建高效、安全的软件资产生态

引言 在数字化转型的浪潮下&#xff0c;企业的软件使用方式日益多元化&#xff0c;涉及云端、订阅制、永久授权及浮动许可等多种模式。然而&#xff0c;随着软件资产的增多&#xff0c;企业面临着合规性管理的严峻挑战&#xff1a;非法软件使用、许可证管理不当、软件资产闲置…

python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公

文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python 二、处理 Excel 文件&#xff08;openpyxl库&#xff09;三、 处理 Word 文件&#xff08;python-docx库&#xff09;四、 处理 PPT 文件&#xff08;python-pptx库&#xff09;五、 自动发送邮件&#xff08;smtplib和…

Python 基础-循环

目录 简介 break continue 小结 简介 要计算123&#xff0c;我们可以直接写表达式&#xff1a; >>> 1 2 3 6要计算123...10&#xff0c;勉强也能写出来。 但是&#xff0c;要计算123...10000&#xff0c;直接写表达式就不可能了。 为了让计算机能计算成千上…

简单易懂,解析Go语言中的Channel管道

Channel 管道 1 初始化 可用var声明nil管道&#xff1b;用make初始化管道&#xff1b; len()&#xff1a; 缓冲区中元素个数&#xff0c; cap()&#xff1a; 缓冲区大小 //变量声明 var a chan int //使用make初始化 b : make(chan int) //不带缓冲区 c : make(chan stri…