来源:自学PHP网 时间:2015-04-16 23:15 作者: 阅读:次
[导读] 感觉这个漏洞有点意思~~,绕了我半天。PS:开不开gpc无所谓的在 system init php的59行if (function_exists( 39;get_magic_quotes_gpc 39;)){if (@get_magic_quotes_gpc()) GPC 进行反向处理{if (! f...
感觉这个漏洞有点意思~~,绕了我半天。
PS:开不开gpc无所谓的
在/system/init.php的59行
if (function_exists('get_magic_quotes_gpc')) { if (@get_magic_quotes_gpc()) // GPC 进行反向处理 { if (! function_exists('stripslashes_gpc')) { function stripslashes_gpc(&$value) { $value = stripslashes($value); } }
如果你服务器开了gpc我就使用stripslashes,就是说初始进入的数据都是没有转义的。很好,适应将来嘛(因为php6已经移除这个get_magic_quotes_gpc()函数)。
在文件/system/aws_model.inc.php的978行,
public function quote($string) { if (is_object($this->db())) { //下面return有点意思的,我们去踪$this->db()->quote($string),俩个quote是不一样,不要以为是递归,不然溢出了 return trim($this->db()->quote($string), "'"); } if (function_exists('mysql_escape_string')) { $string = @mysql_escape_string($string); } else { $string = addslashes($string); } return $string; }
采用的是zend框架。/system/Zend/Db/Adapter/Abstract.php的859行
public function quote($value, $type = null) { $this->_connect(); if ($value instanceof Zend_Db_Select) { return '(' . $value->assemble() . ')'; } if ($value instanceof Zend_Db_Expr) { return $value->__toString(); } if (is_array($value)) { foreach ($value as &$val) { $val = $this->quote($val, $type); } return implode(', ', $value); } if ($type !== null && array_key_exists($type = strtoupper($type), $this->_numericDataTypes)) { $quotedValue = '0'; switch ($this->_numericDataTypes[$type]) { case Zend_Db::INT_TYPE: // 32-bit integer $quotedValue = (string) intval($value); break; case Zend_Db::BIGINT_TYPE: // 64-bit integer // ANSI SQL-style hex literals (e.g. x'[\dA-F]+') // are not supported here, because these are string // literals, not numeric literals. if (preg_match('/^( [+-]? # optional sign (?: 0[Xx][\da-fA-F]+ # ODBC-style hexadecimal |\d+ # decimal or octal, or MySQL ZEROFILL decimal (?:[eE][+-]?\d+)? # optional exponent on decimals or octals ) )/x', (string) $value, $matches)) { $quotedValue = $matches[1]; } break; case Zend_Db::FLOAT_TYPE: // float or decimal $quotedValue = sprintf('%F', $value); } return $quotedValue; } return $this->_quote($value); }
这里return回来的是_quote函数,看名字大概就知道了哇同一文件839行
protected function _quote($value) { if (is_int($value)) { return $value; } elseif (is_float($value)) { return sprintf('%F', $value); } return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'"; }
就是进行addslashes处理。好了我们转义了一次。然后return回来到外层的quote函数,再看看这句return trim($this->db()->quote($string), "'");
主要看trim了去掉两边的',假如一开始我们输入了’,那么处理到了这里之后剩下\。哈哈,想必你也看出来了。当sql语句执行的时候\就去转义最后包含字符串的反引号了,后面带入查询的函数我就不贴了啊。
使用的是mysql预处理语句,执行的时候都是prepare和execute,和一般的还真的是不一样啊,恶补了下,还是不太懂,zend框架也没去玩过。。
这个bug真是坑爹..
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com