网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

php intval() 小数时安全漏洞分析


发布日期:2023年12月27日
 
php intval() 小数时安全漏洞分析
变量转成整数类型

语法 int intval(mixed var int [base])

返回值 整数

函数种类 PHP 系统功能

内容说明

本函数可将变量转成整数类型可省略的参数 base 是转换的基底默认值为 转换的变量 var 可以为数组或类之外的任何类型变量

intval()使用不当的安全漏洞分析

intval函数有个特性直到遇上数字或正负符号才开始做转换再遇到非数字或字符串结束时()结束转换在某些应用程序里由于对intval函数这个特性认识不够错误的使用导致绕过一些安全判断导致安全漏洞

分析

代码如下 复制代码

PHP_FUNCTION(intval)

{

zval **num **arg_base;

int base;

switch (ZEND_NUM_ARGS()) {

case :

if (zend_get_parameters_ex( &num) == FAILURE) {

WRONG_PARAM_COUNT;

}

base = ;

break;

case :

if (zend_get_parameters_ex( &num &arg_base) == FAILURE) {

WRONG_PARAM_COUNT;

}

convert_to_long_ex(arg_base)

base = Z_LVAL_PP(arg_base)

break;

default:

WRONG_PARAM_COUNT;

}

RETVAL_ZVAL(*num

convert_to_long_base(return_value base)

}

Zend/zend_operatorsc》convert_to_long_base()

……

case IS_STRING:

strval = Z_STRVAL_P(op)

Z_LVAL_P(op) = strtol(strval NULL base)

STR_FREE(strval)

break;

当intval函数接受到字符串型参数是调用convert_to_long_base()处理接下来调用Z_LVAL_P(op) = strtol(strval NULL base)通过strtol函数来处理参数

函数原型如下

long int strtol(const char *nptrchar **endptrint base)

这个函数会将参数nptr字符串根据参数base来转换成长整型数参数base范围从参数base代表采用的进制方式如base值为则采用进制若base值为则采用进制等

流程为

strtol()会扫描参数nptr字符串跳过前面的空格字符直到遇上数字或正负符号才开始做转换再遇到非数字或字符串结束时()结束转换并将结果返回

那么当intval用在if等的判断里面将会导致这个判断实去意义从而导致安全漏洞

测试代码

代码如下 复制代码

<?php

$o = ;

for($a = ; $a < ; $a++){

$o += ;

echo <br />intval($o) = intval($o)

if(intval($o)){

print(&nbsp;true

}else{

print(&nbsp;false

}

}?>

输出结果

intval() = false

intval() = false

intval() = false

intval() = false

intval() = false

intval() = false

intval() = false

intval() = false

intval() = false

intval() = true

intval() = true

intval() = true

intval() = true

intval() = true

intval() = true

intval() = true

intval() = true

intval() = true

intval() = true

……

php intval 与 int 的区别

代码如下 复制代码

$t =;

echo gettype((int)($t))

echo <hr>;

echo gettype(intval($t))

//输出结果integer integer value:

$t =a;

echo gettype((int)($t))

echo <hr>;

echo gettype(intval($t))

//结果 integer integer value:

$string=a;

$string=intval($string)

echo $string的值$string$string的值;//单引号不会输出变量将原样输出

$string=(int)($string)

echo $string

               

上一篇:提高代码质量及字节码防止内存错误

下一篇:webservice的安全机制2---handler实现