一
描述
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 *nptr
char **endptr
int 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 <=
wp
trackback
php Zend_Hash_Del_Key_Or_Index / sql injection exploit