描叙 intval函数有个特征:"直到遇上数字或正负符号才最先做转换,再遇到非数字或字符串竣事时(\0)竣事转换",在某些应用程序里由于对intval函数这个特征熟悉不够,错误的使用导致绕过一些平安判断导致平安破绽. 二 剖析PHP_FUNCTION(intval) { zval **num, **arg_base; int base; switch (ZEND_NUM_ARGS()) { case 1: if (zend_get_parameters_ex(1, amp;num) == FAILURE) { WRONG_PARAM_COUNT; } base = 10; break; case 2: if (zend_get_parameters_ex(2, amp;num, amp;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, 1, 0); convert_to_long_base(return_value, base); } Zend/zend_operators.c-gt;gt;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局限从2至36,或0.参数base代表接纳的进制方式,如base值为10则接纳10进制,若base值为16则接纳16进制等。 流程为:strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才最先做转换,再遇到非数字或字符串竣事时(\0)竣事转换,并将效果返回。 那么当intval用在if等的判断内里,将会导致这个判断实去意义,从而导致平安破绽. 三 测试代码 "; var1="1 union select 1,1,1 from admin"; if (intval(var1)) echo "it's safe too"; echo 'var1='.var1; ?gt; 四 现实应用 WordPress lt;= 2.0.6 wp-trackback.php Zend_Hash_Del_Key_Or_Index / sql injection exploit[http://superhei.blogbus.com/logs/.html] ----------------我是分割线(# 鬼仔:下面属于注释)---------------# 鬼仔注:这是 Superhei 搞的 Php Codz Hacking 的第一篇,相关的先容在这里 http://www.80vul.com近期推出[PCH]Php Codz Hacking项目,该项目主要是对一些php应用平安有影响的'特征'或者'破绽'在php源代码的基础上举行一些剖析和探讨. 对于这个项目最先我们想了一个名称:"some features of php app sec",主要是源之80vul揭晓在即将面市的pstzine0x3里的一篇文章: * 剖析php源代码,发现新的破绽函数“特征”或者破绽。(在上一节里先容的那些“破绽审计计谋”里,都没有php源代码的剖析,若是你要进一步找到新的字典,可以在php源代码的基础上剖析下成因,然后凭据这个成因来剖析寻找新的破绽函数“特征”或者破绽。)(我们以后会陆续宣布一些我们对php源代码的剖析) 由于我们以为发现更多的php自己的特征或者破绽,是以后php应用程序平安的主要的一个偏向:).