浅析PHP代码审计中的SQL注入漏洞

news2024/12/29 10:54:12

浅析PHP代码审计中的SQL注入漏洞

  • 1.概述
  • 2.普通注入
  • 3.编码注入
    • 宽字节注入
    • 二次urldecode注入
  • 4.漏洞防范
    • gpc/rutime魔术引号
    • 过滤函数和类
      • addslashes函数
      • mysql_[real_]escape_string函数
      • intval等字符转换
    • PDO prepare预编译

1.概述

SQL注入的攻击方式有下面几种:

  • 在权限较大的情况下,通过SQL注入可以直接写入webshell,或者直接执行系统命令等
  • 在权限较小的情况下,也可以通过注入来获得管理员的密码等信息,或者修改数据库内容进行一些钓鱼或者其他间接利用

登录页面的注入现在来说大多是发生在HTTP头里面的client-ipx-forward-for,一般用来记录登录的IP地址,另外在订单系统里面,由于订单涉及购物车等多个交互,所以经常会发生二次注入。我们在通读代码挖掘漏洞的时候可以着重关注这几个地方


2.普通注入

这里说的普通注入是指最容易利用的SQL注入漏洞,比如直接通过注入union查询就可以查询数据库,一般的SQL注入工具也能够非常好地利用。普通注入有int型和string型

数据库操作存在一些关键字,比如select from、mysql_connect、mysql_query、mysql_fetch_row等,数据库的查询方式还有update、insert、delete,我们在做白盒审计时,只需要查找这些关键字,即可定向挖掘SQL注入漏洞


3.编码注入

在SQL注入里,最常见的编码注入是MySQL宽字节以及urldecode/rawurldecode函数导致的

宽字节注入

在使用PHP连接MySQL的时候,当设置“set character_set_client=gbk”时会导致一个编码转换的注入问题,也就是我们所熟悉的宽字节注入

关于这个漏洞的解决方法推荐如下几种方法:

  1. 在执行查询之前先执行SET NAMES 'gbk',character_set_client=binary设置character_set_clientbinary
  2. 使用mysql_set_charset('gbk')设置编码,然后使用mysql_real_escape_string()函数被参数过滤
  3. 使用pdo方式,在PHP5.3.6及以下版本需要设setAttribute(PDO::ATTR_EMULATE_PREPARES,false);来禁用prepared statements的仿真效果

如上几种方法更推荐第一和第三种

对宽字节注入的挖掘方法也比较简单,只要搜索如下几个关键字即可:

SET NAMES
character_set_client=gbk
mysql_set_charset('gbk')

二次urldecode注入

如果某处使用了urldecode或者rawurldecode函数,则会导致二次解码生成单引号而引发注入。原理是我们提交参数到WebServer时,WebServer会自动解码一次,假设目标程序开启了GPC,我们提交/1.php?id=1%2527

因为我们提交的参数里面没有单引号,所以第一次解码后的结果是id=1%27(%25解码的结果是%)

如果程序里面使用了urldecode或者rawurldecode函数来解码id参数,则解码后的结果是id=1’成功出现引发注入

测试代码:

?php
$a=addslashes($_GET['p']);
$b=urldecode($a);
echo '$a='.$a;
echo '<br />';
echo '$b='.$b;

在这里插入图片描述


4.漏洞防范

gpc/rutime魔术引号

magic_quotes_gpc负责对GET、POST、COOKIE的值进行过滤,magic_quotes_runtime对从数据库或者文件中获取的数据进行过滤。通常在开启这两个选项之后能防住部分SQL注入漏洞被利用

为什么说是部分,因为我们之前也介绍了,它们只对单引号(')、双引号(")、反斜杠(\)及空字符NULL进行过滤,在int型的注入上是没有多大作用的

过滤函数和类

addslashes函数

addslashes函数过滤的值范围和GPC是一样的,即单引号(')、双引号(")、反斜杠(\)及空字符NULL,它只是一个简单的检查参数的函数,大多数程序使用它是在程序的入口,进行判断如果没有开启GPC,则使用它对$_POST/$_GET等变量进行过滤,不过它的参数必须是string类型

mysql_[real_]escape_string函数

mysql_escape_stringmysql_real_escape_string函数都是对字符串进行过滤,在PHP4.0.3以上版本才存在,如下字符受影响【\x00】【\n】【\r】【\】【'】【"】【\x1a】,两个函数唯一不一样的地方在于mysql_real_escape_string接受的是一个连接句柄并根据当前字符集转义字符串,所以推荐使用mysql_real_escape_string

使用举例:

?php
$con = mysql_connect("localhost", "root", "123456");
$id = mysql_real_escape_string($_GET['id'],$con);
$sql="select * from test where id='".$id."'";
echo $sql;

当请求该文件?id=1’时,上面代码输出:select*from test where id='1\''

intval等字符转换

intval的作用是将变量转换成int类型,这里举例intval是要表达一种方式,一种利用参数类型白名单的方式来防止漏洞,对应的还有很多如floatval

应用举例如下:

?php
$id=intval("1 union select ");
echo $id;

以上代码输出:1

PDO prepare预编译

我们先来看一段代码:

?php
dbh = new PDO("mysql:host=localhost; dbname=demo", "user", "pass");
$dbh-exec("set names 'gbk'");
$sql="select * from test where name = ? and password = ?";
$stmt = $dbh-prepare($sql);
$exeres = $stmt-execute(array($name, $pass));

上面这段代码虽然使用了pdo的prepare方式来处理sql查询,但是当PHP版本<5.3.6之前还是存在宽字节SQL注入漏洞,原因在于这样的查询方式是使用了PHP本地模拟prepare,再把完整的SQL语句发送给MySQL服务器,并且有使用set names 'gbk'语句,所以会有PHP和MySQL编码不一致的原因导致SQL注入,正确的写法应该是使用ATTR_EMULATE_PREPARES来禁用PHP本地模拟prepare,代码如下:

?php
dbh = new PDO("mysql:host=localhost; dbname=demo", "user", "pass");
$dbh-setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh-exec("set names 'utf8'");
$sql="select * from test where name = ? and password = ?";
$stmt = $dbh-prepare($sql);
$exeres = $stmt-execute(array($name, $pass));

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

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

相关文章

常用电阻的作用

1、限流: 根据公式:I U / R;可知,电压固定的情况下,电阻越大,电流越小 常用于保护器件, 例如:MCU的输入输出信号线串联电阻,以避免电流过大,损坏元器件 …

快鲸scrm助力眼科机构提效客户运营,提升转化率

眼科机构普遍面临着以下几方面的业务挑战 (1)存在信任危机,用户决策周期长 眼睛是心灵的窗户,患者在对眼部治疗机构的选择上格外慎重,因而决策周期较长,眼科机构需要通过品牌建设、 IP 的打造、优质的产品…

SDL(2)-加载图片

加载BMP 1.使用SDL_init初始化SDL库 2.使用SDL_CreateWindow创建一个窗口 3.使用SDL_GetWindowSurface获取创建窗口的surface 4.使用SDL_LoadBMP加载一张BMP图片 5.使用SDL_BlitSurface将加载的bmp surface拷贝到窗口的surface 6.使用SDL_UpdateWindowSurface更新到窗口 …

【严重】vm2 <3.9.15 沙箱逃逸漏洞(CVE-2023-29017)

漏洞描述 vm2 是一个沙箱,用于在 Node.js 环境中运行不受信任的代码。宿主对象(Host objects)是指由 Node.js 的宿主环境提供的对象,例如全局对象、文件系统或网络请求等。 vm2 3.9.15之前版本中,当处理异步错误时未正确处理 Error.prepare…

中国大学哪家强?Python爬取排名榜,太棒啦(31)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 如何用Python,抓取并分析2023中国大学排名数据。 用到的Python库有requests、bs4。 requests库 reque…

PixiJS 渲染优化

最近做在线CAD可视化与编辑,对前端的可视化渲染技术进行了选型,对于二维CAD来说一般用canvas就够了,但是canvas每一次平移,缩放,更新数据都需要重新计算渲染所有的图形数据,数据一多就显得非常卡。如果使用…

TCP和UDP在实际工作中的应用

前言 日常在网上浏览一些文章时都会看到一些介绍TCP和UDP的文章,每次都是草草浏览,而没有深入的去研究,这几天在做日志采集工具的时候恰好遇到一个问题,就是采集端将采集到的内容发送到服务端时这里采用的通信协议应该如何考量&a…

SpringBoot源码分析

SpringBoot源码分析1.启动类分析2.SpringBoot的项目启动流程1.SpringApplication构造函数1)deduceFromClasspath()2)getSpringFactoriesInstances2.1)loadFactoryNames加载类名称2.2)createSpringFactoriesInstances创建实例2.run…

gradle环境搭建

目录 gradle是什么 gradle环境搭建 IDEA 配置 Gradle 创建 Gradle 项目 gradle是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based …

Java基础总结(二)

文章目录一、ObjectObject中的成员方法(11个)toStringequalsclone二、Objects三、BigInteger和BigDecimaBigIntegerBigDecima四、正则表达式五、DateJDK7前时间相关类SimpleDateFormat类Calendar类JDK8新增时间相关类六、包装类一、Object 没有一个属性…

【密码算法 之十四】非对称算法,ECC椭圆曲线算法 之 ECDSA、ECDH、SM2、SM9等

文章目录1. ECC椭圆曲线1.1 曲线类型1.2 曲线标准1.3 表示方法1.4 曲线运算1.4.1 点加(Point Addition)1.4.2 点乘(Point Multiplication)1.4.3 倍点(Point Double)2. ECDSA2.1 私钥签名2.2 公钥验签3. ECD…

Java——旋转数组的最小数字

题目链接 牛客在线oj题——旋转数组的最小数字 题目描述 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2]&…

Stable Diffusion成为生产力工具(五):放大并修复老照片、马赛克照片、身份证件照

S:你安装stable diffusion就是为了看小姐姐么? I :当然不是,当然是为了公司的发展谋出路~~ 预先学习: 安装webui《Windows安装Stable Diffusion WebUI及问题解决记录》。运行使用时问题《Windows使用Stable Diffusion时…

Kubernetes 多集群管理工具Kuboard v3

目录 一、概述 二、安装和基本使用 2.1 添加k8s集群 2.2 信息查看 2.2.1概要信息查看 2.2.2导入集群的节点信息 2.2.3 存储 2.3创建工作负载 一、概述 Kuboard,是一款免费的 Kubernetes 图形化管理工具,Kuboard 力图帮助用户快速在 Kubernetes 上…

Tomcat8性能优化

文章目录授人以鱼不如授人以渔目的服务器资源Tomcat整体架构Tomcat配置优化Linux环境安装运行Tomcat8AJP连接什么是AJP执行器(线程池)3种运行模式bionioapr禁用DNS查询添加Listener版本号隐藏压缩传输部署测试用的web项目查看服务器信息查看Linux版本查看…

three.js学习 01-使用最基本的方法创建出来一个threejs立方体,three.js开发环境搭建

1.当前实现的最终效果: 我们将会在页面上使用threejs的渲染器创建场景和相机,并且将一个简单几何体结果的canvas嵌入到我们的网页中 2.环境以及工具介绍: three中文官方文档地址:https://www.three3d.cn/docs/index.html 使用的开…

制作两栏布局的 6+5 种方法:从相当合理到完全错误

一个挑战 假设您需要创建一个两列布局。是的,最简单的那种:左边一列,右边一列,中间有一些空隙。有一个明显的现代解决方案: .columns {display: grid;grid-template-columns: 1fr 1fr;gap: 20px; }完毕!当…

Go 语言高质量编程

编写高质量的 Go 代码~ 前言: 本次课程简要介绍了高质量编程的定义和原则,分享了代码格式、注释、命名规范、控制流程、错误和异常处理五方面的常见编码规范,帮助我们在今后的开发过程中写出更加优秀的代码 … 什么是高质量编程&#xff1f…

凌恩生物文献分享|微刊:三代全长16s扩增子——环境多样性研究的明星

在微生物研究领域,PacBio三代全长的时代已经来临,如果你还没用过那就太可惜了! 要问三代有什么好,那我可得说道说道。 相比于传统二代Illumina平台测序,PacBio Sequel lle 平台获得的序列更长,信息量更多…

Java Servlet Tomcat(HttpServlet)处理底层机制详解总括

以tomact服务器为例: 热知识:Servlet是java定义的处理动态资源(非静态资源)的java接口规范,HttpServlet是tomcat实现了servlet接口的类 一.当第一次发送请求时候: 1.查询web.xml中的url-parrtern中配置的…