php

位置:IT落伍者 >> php >> 浏览文章

php内置函数intval()


发布日期:2022年05月17日
 
php内置函数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等的判断里面将会导致这个判断实去意义从而导致安全漏洞

测试代码

//intvalphp

$var=;

if (intval($var))

echo its safe;

echo $var=$var;

echo

;

$var= union select from admin;

if (intval($var))

echo its safe too;

echo $var=$var;

实际应用

WordPress <= wptrackbackphp Zend_Hash_Del_Key_Or_Index / sql injection exploit

上一篇:php的变量、函数、对象的引用

下一篇:php中遍历数组方法