urldecode()解码引发注入其实也没那么可怕

简介: urldecode()解码引发注入其实也没那么可怕

引子

事情是这样的,这次小马写了一个关于判断前端传参是否有汉字并对汉字进行校验的功能,代码如下:

image.png

有听到很多同学说,要特别注意urldecode的二次解码注入问题。于是搜索了相关资料,大部分说的关于这个urldecode二次解码引发注入的问题是这样的:

因为对于编码的字符串 ,PHP本身在处理提交的数据之前会进行一次urldecode解码(大豆存在于PHP5.3以上),然后一般后端接收到参数,自然而然会再进行一次urldecode函数解码,因为和urlencode()成双成对的嘛。这原本看起来也没什么问题,因为两次urldecode并不会影响结果值。比如urldecode('你好'),得到的还是‘你好’,自然问题不在于这里。

urldecode二次解码有注入风险

问题在于:如果我们构造字符串/getUser.php?id=%2527520%2527,提交后PHP自行解码,%25解码成了%,得到url是/getUser.php?id=%27520%27;注意了,这个时候,我们的urldecode()函数登场了,正儿八经地进行了一次解码,将%27解码成了’,于是最终得到的url是 /test.php?id='520'。原理就是: echo urldecode(urldecode('%2527520%2527')); 得到 '520'。

在后端得到这个url是非常敏感的,因为这很容易让人想到单引号SQL注入。PHP中常用的过滤函数如addslashes()、mysql_real_escape_string()、mysql_escape_string()或者使用魔术引号GPC开关来防止注入,原理都是给单引号(’)、双引号(”)、反斜杠(\)和NULL等特殊字符前面加上反斜杠来进行转义。而这些都容易被urlencode后的字符串绕过。如%2527520%2527很容易被校验和过滤函数直接通过,但其实解码后是含有特殊字符的,这样就容易有SQL注入风险,只要构造playload让id二次解码后等于 '520' or 1=1 就可以注入了。让URL解码后得到?id='520' or 1=1将得到如下语句,获取得到所有用户数据:

select * form user where id='520' or 1=1;

image.png

其实没那么可怕

不要慌,其实没那么可怕。这个只是在于参数校验失守,底层DAO又没在最终入库的时候转义特殊字符才有可能发生的。但是这两道防线目前基本很少被攻破,因为主流的框架大多数接收处理后,在入库之前都会进行参数校验和过滤,一般都封装了底层的DAO,在入库之前还有最后一层mysql_real_escape_string()转义特殊字符,如果不去修改底层,一般问题不大。除非自己写的架子,多注意一下就好了。

总结

如何避免这个问题的总结:

从前端接收完提交参数,urldecode完尽量先做参数处理,在参数进入逻辑之前最后进行参数校验和过滤,如开头的代码图,再次校验参数中含有的字符是否符合规范;

前面不管如何处理,如何转码,入库之前一定要做最后的转义(转义在最后,不要先转义再urldecode再入库,这样就很危险了)。

顺带一提:rawurldecode()也会产生同样的问题,因此在使用这两个函数都需要多注意一下就可以了。

相关文章
|
3月前
|
机器学习/深度学习 存储 供应链
SmoothQuant: 大型语言模型的精确高效后训练量化——论文阅读
SmoothQuant是一种高效的大型语言模型后训练量化方法,通过平滑激活值中的异常值,有效降低量化误差。该方法在保持模型精度的同时,显著减少内存占用并加速推理过程,适用于从数十亿到数千亿参数的模型,已在OPT-175B和MT-NLG 530B等超大规模模型上验证其有效性。
228 1
|
9月前
|
SQL 安全 关系型数据库
mysql注入-字符编码技巧
通过字符编码技巧,攻击者可以在SQL注入中绕过常见的输入验证机制,成功攻击数据库。因此,理解这些技巧及其可能的攻击路径,对防御SQL注入至关重要。开发者应采取多层次的安全措施,确保应用程序在不同字符集和编码环境下都能有效防御注入攻击。通过强制使用统一编码、严格的输入验证、预编译语句以及多层次的编码检查,可以有效地提高系统的安全性,防止SQL注入攻击带来的风险。
337 72
|
7月前
|
机器学习/深度学习 网络架构
PINN应用案例:神经网络求解热扩散方程高质量近似解
本文探讨了物理信息神经网络(PINN)在求解一维热扩散方程中的应用,对比分析了多层感知器(MLP)、残差网络(ResNet)和Wang2020架构的性能。PINN通过构建损失函数整合偏微分方程残差、边界条件和初始条件,实现对物理系统的近似求解。实验结果表明,传统架构如MLP和ResNet虽能大致还原解析解,但在部分区域存在显著偏差;而Wang2020架构因专门设计以应对PINN训练挑战,表现更为优越,与解析解高度一致。研究还揭示了PINN训练中“平台期后突变”的优化特性,并提出通过构造满足约束条件的网络架构以简化多目标优化问题,为未来研究提供了新方向。
608 3
PINN应用案例:神经网络求解热扩散方程高质量近似解
|
存储 PyTorch 算法框架/工具
Pytorch学习笔记(4):模型创建(Module)、模型容器(Containers)、AlexNet构建
Pytorch学习笔记(4):模型创建(Module)、模型容器(Containers)、AlexNet构建
436 0
Pytorch学习笔记(4):模型创建(Module)、模型容器(Containers)、AlexNet构建
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
网络协议 对象存储
阿里云oss配置自有域名
阿里云oss配置自有域名
445 1
|
安全 Java 大数据
SpringBoot+Mybatis 实现动态数据源切换方案
SpringBoot+Mybatis 实现动态数据源切换方案
1434 1
|
Ubuntu Linux 网络安全
Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案
Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案
1462 0
|
JavaScript 前端开发
css:隐藏input file标签并触发点击上传文件事件
css:隐藏input file标签并触发点击上传文件事件
878 0
css:隐藏input file标签并触发点击上传文件事件

热门文章

最新文章