国酱 發表於 2012-2-10 11:38:36

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

一、描述 <br />  intval函数有个特性:&quot;直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换&quot;,在某些应用程序里由于对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, &amp;num) == FAILURE) { <br />  WRONG_PARAM_COUNT; <br />  } <br />  base = 10; <br />  break; <br />  case 2: <br />  if (zend_get_parameters_ex(2, &amp;num, &amp;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-&gt;&gt;convert_to_long_base() <br />  &hellip;&hellip; <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 />  ?&gt; <br /></div><br />  四、实际应用 <br />  WordPress &lt;= 2.0.6 wp-trackback.php Zend_Hash_Del_Key_Or_Index / sql injection exploit
頁: [1]
查看完整版本: php intval()函数使用不当的安全漏洞分析