php函数漏洞

2023-11-01

1.intval()

intval — 获取变量的整数值

说明

int intval ( mixed $var [, int $base = 10 ] )

通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

参数

var

要转换成 integer 的数量值

base

转化所使用的进制

Note:

如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

 

 


返回值

成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。

最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval('1000000000000') 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

字符串有可能返回 0,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。

intval('1024e')  结果为1024      intval('1024e1')结果为1024     intval('0x23333')结果为0

2.is_numeric() 

 判断变量是否为数字或数字字符串,不仅检查10进制,16进制是可以。

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!

该函数还可能造成sql注入,例如将‘1 or 1'转换为16进制形式,再传参,就可以造成sql注入

0×00 简介
国内一部分CMS程序里面有用到过is_numberic函数,我们先看看这个函数的结构
bool is_numeric ( mixed $var )
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

0×01 函数是否安全
接下来我们来看个例子,说明这个函数是否安全

$s = is_numeric($_GET['s'])?$_GET['s']:0;
$sql="insert into test(type)values($s);";//是 values($s) 不是values('$s') 
mysql_query($sql);

上面这个片段程序是判断参数s是否为数字,是则返回数字,不是则返回0,然后带入数据库查询。(这样就构造不了sql语句)
我们把‘1 or 1’ 转换为16进制 0x31206f722031 为s参数的值
程序运行后,我们查询数据库看看,如下图:

如果再重新查询这个表的字段出来,不做过滤带入另一个SQL语句,将会造成2次注入.
0×02 总结
尽量不要使用这函数,如果要使用这个函数,建议使用规范的sql语句,条件加入单引号,这样16进制0x31206f722031就会在数据库里显示出来。而不会出现1 or 1。

3.ereg与eregi

ereg — 正则表达式匹配

说明

int ereg ( string $pattern , string $string [, array &$regs ] )

Note:

使用 Perl 兼容正则表达式语法的 preg_match() 函数通常是比 ereg() 更快的替代方案。

 

以区分大小写的方式string 中寻找与给定的正则表达式 pattern 所匹配的子串。

如果找到与 pattern 中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数 regs,则匹配项将被存入 regs 数组中。$regs[1] 包含第一个左圆括号开始的子串,$regs[2] 包含第二个子串,以此类推。$regs[0] 包含整个匹配的字符串。

eregi函数与ereg一样,只不过eregi函数不区分大小写

<?php 
error_reporting(0);
$a=$_GET['a'];
var_dump(ereg('^[0-9]+$',$a));
if(ereg('^[0-9]+$',$a))
	echo 'hello';
else echo 'wrong';
if(ereg('^[0-9]+$',$a)===substr($a,42))
	echo 'ok';
?>

这里ereg有两个漏洞:

①%00截断及遇到%00则默认为字符串的结束

②当参数a为数组时它的返回值是FALSE,可以绕过ereg('^[0-9]+$',$a)===substr($a,42)

亲测eregi也有这两个漏洞

注意:ereg及相关函数已经在高版本中被弃用了

4.php弱类型比较

4.1)=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较

4.2)== 在进行比较的时候,会先将字符串类型转化成相同,再比较

         如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行

           其中还有一个大bug:bool类型的TRUE与任意字符串用==匹配相等,除了单个字符为"0"。

1 <?php
2 var_dump("admin"==0);  //true
3 var_dump("1admin"==1); //true
4 var_dump("admin1"==1) //false
5 var_dump("admin1"==0) //true
6 var_dump("0e123456"=="0e4456789"); //true 
7 ?>  //上述代码可自行测试
1 观察上述代码,"admin"==0 比较的时候,会将admin转化成数值,强制转化,由于admin是字符串,转化的结果是0自然和0相等
2 "1admin"==1 比较的时候会将1admin转化成数值,结果为1,而“admin1“==1 却等于错误,也就是"admin1"被转化成了0,为什么呢??
3 "0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等
注意:当一个字符串欸当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内
该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0

4.3)可以用php弱类型做一些绕过

4.3.1)md5绕过(Hash比较缺陷)

<?php
if (isset($_GET['Username']) && isset($_GET['password'])) {
       $logined = true;
       $Username = $_GET['Username'];
       $password = $_GET['password'];
       if (!ctype_alpha($Username)) {$logined = false;}
       if (!is_numeric($password) ) {$logined = false;}
       if (md5($Username) != md5($password)) {$logined = false;}
       if ($logined){
            echo "successful";
       }else{
            echo "login failed!";
            }
     }
?>    

题目大意是要输入一个字符串和数字类型,并且他们的md5值相等,就可以成功执行下一步语句

介绍一批md5开头是0e的字符串 上文提到过,0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0md5('240610708') == md5('QNKCDZO')成功绕过!

240610708     0e462097431906509019562988736854
QNKCDZO       0e830400451993494058024219903391
s878926199a   0e545993274517709034328855841020 
s155964671a   0e342768416822451524974117254469 
s214587387a   0e848240448830537924465865611904 
s878926199a   0e545993274517709034328855841020 
s1091221200a  0e940624217856561557816327384675 
s1885207154a  0e509367213418206700842008763514

更多的md5转换后为0e开头的查此链接  https://mp.weixin.qq.com/s/DEPyKbi4wL5PZs3cYr3apQ

4.3.2) json绕过

<?php
if (isset($_POST['message'])) {
    $message = json_decode($_POST['message']);
    $key ="*********";
    if ($message->key == $key) {
        echo "flag";
    } 
    else {
        echo "fail";
    }
 }
 else{
     echo "~~~~";
 }
?>

输入一个json类型的字符串,json_decode函数第二个参数默认FLASE,并解密成一个对象,判断对象中成员key的值是否等于 $key的值,但是$key的值我们不知道,但是可以利用0=="admin"这种形式绕过

最终payload message={"key":0}

至于json的知识可以访问百度 :https://baike.baidu.com/item/JSON/2462549?fr=aladdin

4.3.3)in_array()绕过

在PHP手册中,in_array()函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。

1
2
3
$array=[0,1,2,'3'];
var_dump(in_array('abc', $array));  //true
var_dump(in_array('1bc', $array));	//true

可以看到上面的情况返回的都是true,因为’abc’会转换为0,’1bc’转换为1。
array_search()与in_array()也是一样的问题。

4.3.4)十六进制转换绕过

还存在一种十六进制余字符串进行比较运算时的问题。例子如下:

1
2
3
"0x1e240"=="123456"		//true
"0x1e240"==123456		//true
"0x1e240"=="1e240"		//false

当其中的一个字符串是0x开头的时候,PHP会将此字符串解析成为十进制然后再进行比较,0x1240解析成为十进制就是123456,所以与int类型和string类型的123456比较都是相等。

4.3.5)函数之 empty 和 isset


  • 1)变量为:0,"0", null, '', false,array() 时,使用 empty 函数,返回的都为 true

  • 2)变量未定义或者为 null 时,isset 函数返回的为 false ,其他都为 true

4.3.6)switch绕过

<?php 
$a="4admin"; 
switch ($a) { 
    case 1: echo "fail1"; break; 
    case 2: echo "fail2"; break;
    case 3: echo "fail3"; break; 
    case 4: echo "sucess"; //结果输出success; break; 
    default: echo "failall"; break; 
    } 
?>

switch非严格匹配,即松比较,自动转换类型 如果switch是与数字类型的case的比较时,switch会将其中的参数转换为int类型

其次,switch比较还有一个坑,看如下代码

<?php
$a=0;
 switch($a){
        case $a>=0: echo 0;break;
	case $a>=10:echo 1;break;
	default: echo 2;break;	
 }
?>

乍一看 应该是进入第一个case 其实不然 switch 匹配的是case中表达式的值 不能把case当if用
这里第一行case ($a >= 0)
0>=0 这个条件表达式 的值为 true switch($key) 中传过来的是 0

0和true 匹配 当然匹配不上。 下面几行case中的表达式值都是false,所有0和false可以匹配上,这中间是松比较

参考资料:http://www.phpchina.com/portal.php?mod=view&aid=40031

相关链接  https://mp.weixin.qq.com/s/DEPyKbi4wL5PZs3cYr3apQ

5.strcmp函数漏洞

注:这一个漏洞适用与5.3及其以后版本的php,5.3以前的版本并不并不适用

我们首先看一下这个函数,这个函数是用于比较字符串的函数

int strcmp ( string $str1 , string $str2 )

参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 -1; 如果 str1 大于 str2 返回 1;如果两者相等,返回 0。

可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了 不符合的类型,这个函数将发生错误,但是在5.3及其以上的php中,显示了报错的警告信息后,将return 0 !!!! 也就是虽然报了错,但却判定其相等了。这对于使用这个函数来做选择语句中的判断的代码来说简直是一个致命的漏洞,php版本以前的却没有此漏洞,我也不知为啥。。。。不信的话可以测试一下,之前看到一个害人的博客,说php5.3之前的有这个漏洞,5.3后没有此漏洞,结果我在本地测试正好相反,又在远程服务器测试了,结果证明他是错的。

<?php
    $a=$_GET['a'];
    var_dump(strcmp($a,$password)==0);
    $password="123m";
     if(isset($a)){
        if (strcmp($a,$password) == 0) {
            echo "Right!!!login success";
            exit();
        } else {
            echo "Wrong password..";
         }
     }
?>

对于这段代码,我们能用什么办法绕过验证呢, 只要我们$_GET[‘password’]是一个数组或者一个object即可,但是上一个问题的时候说到过,只能上传字符串类型,那我们又该如何做呢。

其实php为了可以上传一个数组,会把结尾带一对中括号的变量,例如 xxx[]的name(就是$_POST中的key),当作一个名字为xxx的数组构造类似如下的request

password[]=admin,  便可以成功绕过。

相关资料请查看以下博客 https://blog.csdn.net/zhaohansk/article/details/43984569?utm_source=blogxgwz0

                                        https://blog.csdn.net/qq_35191331/article/details/77149952

6.sha1()和md5()

无法处理数组类型,sha1(a[]) = sha1(b[]) = false

7..strlen    判断字符串长度

可以利用科学计数法进行绕过

例,else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)

科学记数法,由于要使密码长度小于8或值大于9999999,可以使用1e8或1e9满足条件。

============================未完待续======================================

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php函数漏洞 的相关文章

  • XML 和 INI 哪个更快?

    我想知道 XML 是否比 INI 更快 反之亦然 我正在开发一个包含许多文件的网站 这个问题与我的问题有关关于包含许多文件 https stackoverflow com questions 7777522 too many include
  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • Doctrine 模型的默认排序属性

    我想知道是否有办法声明我的学说模型的默认顺序 e g 我有一个work模型并且它有photos 当我加载作品时 与其关联的所有照片都会加载到 work gt photos 当我显示它们时 它们是按 ID 排序的 在另一个字段上声明默认顺序或
  • 将视图加载到变量中

    有什么方法可以将 PHP 文件的内容放入变量中吗 我想做这个 msg this gt load gt view some view 但当我这样做时 msg is NULL 是否可以 有可能的 msg this gt load gt view
  • 合并数组而不丢失键索引

    我有两个数组 Menu Navigation var array public nav top array 100 gt Dashboard 200 gt Sell 300 gt Products 400 gt History 500 gt
  • PHP 7.0和MySQL启动错误“未定义符号:mysqlnd_allocator in Unknown”

    即使在运行时 在自定义编译版本的 PHP7 上也会收到此警告php v 尝试了发布的所有解决方案 什么可能导致这种情况 PHP 警告 PHP 启动 无法加载动态库 usr lib php 20151012 pdo mysql so usr
  • 从 MySQL 返回结果时的数字顺序

    我的数据库表中有以下类型的标题 Topic 1 blah blah Topic 2 blah blah Topic 3 blah blah Topic 10 blah blah Topic 11 blah blah etc 选择查询将始终返
  • PHP 中 glob() 中的转义空格?

    我在 PHP 中有以下函数 除了名称中带有空格的文件外 该函数运行良好 Good picture jpg例如 这里是 function getphotolist currentalbum photos glob currentalbum J
  • SESSION 中存储的数组后面出现数字

    我正在对存储在会话变量上的数组执行 print r 由于某种未知的原因 它在数组打印后添加了一个数字 Example Array 0 gt 868 userid gt 868 1 如果我直接在函数本身中执行 print r 并且在变量存储在
  • Symfony - 自定义验证器和依赖注入

    我正在尝试对自定义验证器使用依赖项注入 以便能够使用实体管理器 我遵循 Symfony 示例 依赖注入 http symfony com doc current cookbook validation custom constraint h
  • 预期响应代码 250,但收到代码“530”,并显示消息“530 5.7.1 需要身份验证”

    我尝试配置 SMTP 邮件时遇到此错误laravel 这是我的配置 env MAIL DRIVER smtp MAIL HOST smtp mailtrap io MAIL PORT 2525 MAIL USERNAME fff3c01db
  • 让 PHP 脚本永远循环执行队列系统中的计算作业

    目前 我有一个永远在我的服务器上运行的 perl 脚本 检查 SQS 是否有要计算的数据 该脚本已经运行了大约 6 个月 没有出现任何问题 所以 现在我想切换到 PHP 的 CLI 并让脚本永远循环在那里 主要是因为我对PHP比较熟悉 Ba
  • 交响乐 2 |修改具有文件(图片)字段的对象时出现表单异常

    我正在使用 Symfony2 我有一个实体Post有标题和图片字段 我的问题 当我创建帖子时一切都很好 我有我的图片等 但是当我想修改它时 我遇到了 图片 字段的问题 它是一个上传的文件 Symfony 想要一个文件类型并且它有一个字符串
  • 如何使用多个Auth组件?

    我使用用户模型将身份验证组件配置为 管理页面 但现在 我还想为客户端创建 配置身份验证 我尝试 重写 inialize This is in my ClientsController php public function initiali
  • 更新 xampp 中的 ICU 扩展吗?

    我在跑xampp我需要升级ICU php intl 扩展 到最新版本 我下载了54从 ICU 页面 但不确定如何升级它 有一个bin include and lib文件夹 我应该把这些文件放在哪里 我还需要做其他事情吗 要升级 XAMP 安
  • PHP 将日期与今天的日期进行比较

    我正在尝试采用以下格式的信用卡到期日期mm yy并查看该日期是否已过 以便我知道信用卡是否已过期 如果已经过期 则一类expired被插入到 tr 我的代码结果检查了 05 16 的样本日期 并且脚本显示该卡尚未过期 而显然该卡已经使用了一
  • php平台安装询问我intl扩展,但似乎已经安装

    在 orocrm 安装期间 使用 symfony 2 开发的平台 我收到此错误 Fatal error Uncaught exception Symfony Component Intl Exception MethodArgumentVa
  • 如何在没有脚本 (PHP) 或服务器配置 (Nginx) 的情况下检测移动设备(和/或移动 cookie)?

    我们很快就会推出网站的移动版本 我们的完整网站和移动网站仅在主题上有所不同 即网址相同 唯一的区别在于前端 当用户访问我们的网站时 我们需要能够执行以下操作 1 检查 cookie 移动 true 或 false 以确定是否已定义完整与移动
  • 逻辑编程帮助

    A if infos 空和inputs empty 删除 B if infos空和inputs 空的 添加 C if infos 空和inputs 等于信息 添加 我们可以有这样的 if B it s the most common ope
  • PHP - While/Else 错误? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有以下

随机推荐

  • 搭建国内yum源

    文章目录 1 什么是yum仓库 2 yum仓库配置 2 1 配置 阿里镜像仓库 2 1 1 配置步骤 2 2 配置 清华大学镜像仓库 推荐 3 epel源 安装和配置 3 1 查看yum源 1 什么是yum仓库 yum仓库就是使用yum命令
  • python pandas借助pandas-profiling自动生成EDA

    安装方法 pip install pandas profiling github地址 https github com pandas profiling pandas profiling 示例代码 import numpy as np im
  • ECshop前台和后台提示信息调用

    1 显示一个提示信息 调用以下函数 show message content links hrefs type info auto redirect true content 提示内容 links 跳转链接名称 hrefs 跳转链接地址 t
  • WPS全新品牌升级

    2022年1月7日 WPS正式官宣品牌升级 作为一款民族办公软件 WPS已经在办公领域默默深耕了34年 此次全新品牌升级后 WPS将正式启用全新的品牌标语 新建无限可能 并将品牌定位升级为 专注创新的国民办公软件 未来 WPS将秉持让每一个
  • c++成员初值列/成员初始化列表

    1 应用背景 如果我们只是简单的int x 去定义一个x变量 此时的x未被初始化 那么当我们读取这个未初始化的值时会导致不明确的行为发生 因此最佳的处理办法就是 永远在使用对象之前先将它初始化 对于无任何成员的内置类型 我们通常必须手工完成
  • 【单片机】单片机的核心思想

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 单片机的核心思想
  • Anaconda安装Python之【Conda基本操作】

    1 Conda安装 Anaconda是开源的Python包管理器 包含了python学习的全部包 安装后包含conda 一个用于管理python环境的工具 1 1 Conda安装 Conda installation For Linux c
  • Aurigma Image Uploader的ActiveX / JAVA图像文件上传控件概述

    Aurigma Image Uploader是一个功能强大的图像文件上传控件 该控件可以在客户端执行基本的图像处理 调整大小和旋转90度 缩略图可以使没有经过培训的用户也能方便的上载图像 产品特征 Image Uploader是一个客户端的
  • Myeclipse启动不了的解决方法

    Myeclipse启动不了的解决方法 我们在开发过程中经常在加载大工程时由于项目很大 导致编译时间很长 或是其他原因导致进度条有时候一直在不停地跑 占用了大量内存 在无奈之下直接将进程kill掉 当再次打开 这时候悲剧的事情发生了 发现My
  • 更改终端默认的python 解释器

    1 终端打开 bash profile文件 open bash profile 2 修改 bash profile文件内容 默认应该会有 如果没有PATH路径需要找到本机的路径设置 Setting PATH for Python 3 5 T
  • QT笔记——生成dump文件

    我们经常会遇到崩溃 此时我们需要定位问题再什么地方 这时候我们就会需要用到dump文件 方式一 include Windows h include DbgHelp h pragma comment lib dbghelp lib int G
  • 22 Python基础之流程控制之for循环

    流程控制之for循环 一 语法 二 for break 三 for continue 四 for循环嵌套 五 for else 六 for循环实现loading 一 语法 为什么有了while循环 还需要有for循环呢 不都是循环吗 我给大
  • fastjson反序列化漏洞(CVE-2017-18349)

    文章目录 fastjson 序列化 FastJson 序列化操作 反序列化 漏洞原理 漏洞复现 CVE 2017 18349 fastjson fastjson 是阿里巴巴开发的 java语言编写的高性能 JSON 库 用于将数据在 Jso
  • postgresql jdbc连接参数

    jdbc postgresql 192 168 1 23 12308 test useUnicode true amp characterEncoding gbk amp allowEncodingChanges true 见官网 http
  • 2023-2030老龄化(>=65)比率预测模型

    目录 前言 一 数据来源和处理 二 相关性检验 图形说明 相关矩阵 三 LSTM算法预测 四 BP神经网络预测 前言 如何预测未来八年老龄化比率 作者从以下四个角度出发 GDP 医院数 医院包括综合医院 中医医院 中西医结合医院 民族医院
  • 1_有关 01背包问题 和 完全背包问题 的详解

    目录 一 01背包问题 物品仅可选一次 1 题目 2 版本1 题解代码 代码 详解 3 版本2 题解代码 优化为一维 代码 详细 4 版本3 题解代码 优化输入 优选 代码 详解 二 完全背包问题 物品可选无限次 1 题目 2 基础版本1
  • OpenCV——中值滤波

    目录 一 原理概述 二 C 代码 三 结果展示 1 原图 2 3x3滤波 3 9x9滤波 四 python代码 一 原理概述 中值滤波 Median Filter 是一种非线性滤波技术 其基本思想是在单通道中将像素点邻域的灰度值进行排序 取
  • 启明云端分享

    1 Sstar System Tool说明 软件开发人员访问SigmaStar芯片寄存器 必须使用Debug Tool硬件工具和Sstar System Tool软件工具 Debug Tool硬件工具 如图所示 使用USB延长线连接PC机
  • 设计模式-策略模式

    策略模式是一种行为型设计模式 其主要目的是允许在运行时选择算法的行为 在Java中 我们可以使用策略模式来根据不同的条件动态地选择不同的算法 下面是一个示例代码 展示了如何在Controller中确定是什么策略 以及如何调用相应的Servi
  • php函数漏洞

    1 intval intval 获取变量的整数值 说明 int intval mixed var int base 10 通过使用指定的进制 base 转换 默认是十进制 返回变量 var 的 integer 数值 intval 不能用于