php intval()函数使用不当的安全漏洞分析
一、描述 <br /> intval函数有个特性:"直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换",在某些应用程序里由于对intval函数这个特性认识不够,错误的使用导致绕过一些安全判断导致安全漏洞. <br />二、分析 php程序员站 <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode20"> <br /> PHP_FUNCTION(intval) <br /> { <br /> zval **num, **arg_base; <br /> int base; <br /> switch (ZEND_NUM_ARGS()) { <br /> case 1: <br /> if (zend_get_parameters_ex(1, &num) == FAILURE) { <br /> WRONG_PARAM_COUNT; <br /> } <br /> base = 10; <br /> break; <br /> case 2: <br /> if (zend_get_parameters_ex(2, &num, &arg_base) == FAILURE) { <br /> WRONG_PARAM_COUNT; <br /> } <br /> convert_to_long_ex(arg_base); <br /> base = Z_LVAL_PP(arg_base); <br /> break; <br /> default: <br /> WRONG_PARAM_COUNT; <br /> } <br /> RETVAL_ZVAL(*num, 1, 0); <br /> convert_to_long_base(return_value, base); <br /> } <br /> Zend/zend_operators.c->>convert_to_long_base() <br /> …… <br /> case IS_STRING: <br /> strval = Z_STRVAL_P(op); <br /> Z_LVAL_P(op) = strtol(strval, NULL, base); <br /> STR_FREE(strval); <br /> break; <br /></div><br /> 当intval函数接受到字符串型参数是调用convert_to_long_base()处理,接下来调用Z_LVAL_P(op) = strtol(strval, NULL, base);通过strtol函数来处理参数。 <br /> 函数原型如下: <br /> long int strtol(const char *nptr,char **endptr,int base); <br /> 这个函数会将参数nptr字符串根据参数base来转换成长整型数,参数base范围从2至36,或0.参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。 <br /> 流程为: <br /> strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换,并将结果返回。 <br /> 那么当intval用在if等的判断里面,将会导致这个判断实去意义,从而导致安全漏洞. <br /> 三、测试代码 <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode21"> <br /> //intval.php <br /> $var="20070601"; <br /> if (intval($var)) <br /> echo "it's safe"; <br /> echo '$var='.$var; <br /> echo ""; <br /> $var1="1 union select 1,1,1 from admin"; <br /> if (intval($var1)) <br /> echo "it's safe too"; <br /> echo '$var1='.$var1; <br /> ?> <br /></div><br /> 四、实际应用 <br /> WordPress <= 2.0.6 wp-trackback.php Zend_Hash_Del_Key_Or_Index / sql injection exploit
頁:
[1]