目录

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

1. 漏洞描述

综合来说,这个漏洞的根源是"register_globals = on",在这个漏洞的前提下,攻击者可以发动这样的攻击向量

. 当前网站的"register_globals = on"已开启
. 在代码中没有显式声明、初始化的变量
. 在用户提交的HTML表单中提交了相同名字的字段
. 在以上的前提下,黑客可以任意控制代码中变量的值

大体来说,黑客可以有两种利用、及入侵方式

. 通过注入、覆盖变量$cfg_basedir,导致可以饶过身份认证和系统变量初始化文件,导致可以上传任意文件到指定目录
. 通过注入、覆盖变量$cfg_not_allowall、$newname等字段,绕过文件扩展名检查防御代码,向目标文件夹直接上传WEBSHELL

这两种攻击向量的最终目的都是向服务端上传WEBSHELL(.PHP、.ASP、.htaccess)等文件

Relevant Link:

http://huaidan.org/archives/3386.html
http://sebug.net/vuldb/ssvid-12518
http://4byte.cn/learning/51122.html
https://code.google.com/p/webfiles/source/browse/files/localhost/htdocs/cxtx/include/dialog/select_soft_post.php?spec=svn40&r=17

2. 漏洞触发条件

. register_globals = on: 网站本身的安全设置
. 攻击者可以通过自定义表单为相关的变量赋值: 伪造HTTP数据包

3. 漏洞影响范围

. Dedecms 5.5
. DEDECMS v5. Final

4. 漏洞代码分析

/include/dialog/select_soft_post.php

Relevant Link:

http://www.verydemo.com/demo_c116_i56826.html

5. 防御方法

0x1: 升级到最新的DEDECMS版本

0x2: Patch Code

我们知道,这个漏洞的根源是因为PHP变量覆盖导致的恶意文件上传,没法直接针对性的防御,要进行代码级的防御,可以从堵住入侵GETSHELL的最终目的这个角度入手

. 在代码流的相对末尾位置布置文件名检测
. 采取正则匹配文件名中是否有".php、.asp"等特征,来达到防止WEBSHELL上传的目的

/include/dialog/select_soft_post.php
defence code

....
if (preg_match('#\.(php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml)$#i', trim($filename)))
{
ShowMsg("你指定的文件名被系统禁止!",'javascript:;');
exit();
}
$fullfilename = $cfg_basedir.$activepath.'/'.$filename;
$fullfileurl = $activepath.'/'.$filename;
....

这个修复防御代码在Linux上运行没有问题,但是对于运行在Windows操作系统上的WEB系统,存在一个绕过的风险,这和windows对文件名的命名规约有关系

. 以下字符不能表示文件名
) <
) >
) /
) \
) |
) :
) "
) *
) ?
) 、
. 允许文件或者文件夹名称不得超过255个字符
. 文件名除了开头之外任何地方都可以使用空格
. 文件结尾不能以下列字符
) .

黑客可以通过上传文件名为"xxx.php."这种类型的文件名,WEB系统向磁盘上上写入文件之后,windows操作系统会自动删除结尾的".",这导致了WEB系统的防御逻辑和操作系统的文件名规约不一致,导致绕过的场景发生

..
if (preg_match('#\.(php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml)[^a-zA-Z0-9]+$#i', trim($filename)))
{
ShowMsg("你指定的文件名被系统禁止!",'javascript:;');
exit();
}
$fullfilename = $cfg_basedir.$activepath.'/'.$filename;
$fullfileurl = $activepath.'/'.$filename;
..

6. 攻防思考

0x1: 官方修复方案

文件上传属于WEB系统通用的功能,最佳的防御实践是将防御代码做成通用的代码模块,放置在WEB系统的关键节点位置,使用面向对象OO的思想对所有的文件上传进行防御

DEDECMS本身已经做了这方面的工作了

. include/common.inc.php
//检查和注册外部提交的变量
function CheckRequest(&$val)
{
if (is_array($val))
{
foreach ($val as $_k=>$_v)
{
CheckRequest($_k);
CheckRequest($val[$_k]);
}
}
else
{
if( strlen($val)> && preg_match('#^(cfg_|GLOBALS)#',$val) )
{
exit('Request var not allow!');
}
}
} . /include/uploadsafe.inc.php
//为了防止用户通过注入的可能性改动了数据库
//这里强制限定的某些文件类型禁止上传
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";
...
if(!empty(${$_key.'_name'}) && (eregi("\.(".$cfg_not_allowall.")$",${$_key.'_name'}) || !ereg("\.",${$_key.'_name'})) )
{
if(!defined('DEDEADMIN'))
{
exit('Upload filetype not allow !');
}
}

Copyright (c) 2014 LittleHann All rights reserved

Dedecms include\dialog\select_soft_post.php Upload Any Files To The Specified Directory Via Variable Not Initial Flaw Bypass Extension Defence的更多相关文章

  1. 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?

    复现过程 首先,我创建了一个基于Picture Library的图片文档库,名字是 Pic Lib 创建完毕后,我点击它的Upload 下拉菜单,点击Upload Picture按钮 在弹出的对话框中 ...

  2. How to Upload multiple files to documentLibrary in one time

         In a Sharepoint 2013 website,we can upload one file to the documentlibrary by click "Uploa ...

  3. How to configure Veritas NetBackup (tm) to write Unified and Legacy log files to a different directory

    Problem DOCUMENTATION: How to configure Veritas NetBackup (tm) to write Unified and Legacy log files ...

  4. Maximum number of WAL files in the pg_xlog directory (2)

    Jeff Janes: Hi, As part of our monitoring work for our customers, we stumbled upon an issue with our ...

  5. Maximum number of WAL files in the pg_xlog directory (1)

      Guillaume Lelarge: Hi, As part of our monitoring work for our customers, we stumbled upon an issue ...

  6. dedecms /include/uploadsafe.inc.php SQL Injection Via Local Variable Overriding Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 . dedecms原生提供一个"本地变量注册"的模拟 ...

  7. dedecms /include/helpers/archive.helper.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Dedecms会员中心注入漏洞 Relevant Link: http: ...

  8. Asp.net core 学习笔记 ( upload/download files 文件上传与下载 )

    更新 :  2018-01-22  之前漏掉了一个 image 优化, 就是 progressive jpg refer : http://techslides.com/demos/progressi ...

  9. Retrofit Upload multiple files and parameters

    Retrofit 的介绍以及基本使用 这里不再说明. 关于多文件上传 以及上传文件的同时携带多个参数说明 网上涉及到的不是太多. 上一张帅图: 代码: apiService: /** params 参 ...

随机推荐

  1. C#中treeview的问题,如何区分根节点和子节点以及根节点和根节点的兄弟节点?

    根节点的Level属性为0,一级子节点Level属性为1,二级子节点Level属性为2,以此类推:同级节点可以用索引.名称.文本来区分.用索引区分根节点时,TreeView.Nodes[0]就是第一个 ...

  2. [转] Centos 6.4 python 2.6 升级到 2.7

    http://blog.csdn.net/jcjc918/article/details/11022345

  3. Volley(五)—— 自定义Request

    详细解读Volley(四)—— 自定义Request Volley中提供了几个Request,如果我们有特殊的需求,完全可以自定义Request的,自定义Request自然要继承Request,那么本 ...

  4. xcode插件XAlign

    一款十分强大的自定义对齐模式插件 开源地址:https://github.com/qfish/XAlign/ 终端输入命令: $ curl http://qfi.sh/XAlign/build/ins ...

  5. Socket Programming in C#--Multiple Sockets

    Now lets say you have two sockets connecting to either two different servers or same server (which i ...

  6. 对兼容ie浏览器所遇到的问题及总结

    1,若直接给一个元素设置absolute定位.在浏览器缩放的时候.位置会错位.解决的方法是给外层的元素设置为relative定位. 2,低版本ie浏览器不支持placeholder属性 3,盒模型上规 ...

  7. 基于EventAggregator的事件发布及订阅

    EventAggregator简介 EventAggregator是Prism中专门处理ViewModel与ViewModel之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方 ...

  8. 如何清洗 Git Repo 代码仓库

    git prune 如何清洗 Git Repo 代码仓库       在腾讯云上创建您的SQL Cluster>>> »   相信不少团队的代码仓库 Git Repo 变得越来越大. ...

  9. Node.js文件系统、路径的操作函数

    Node.js文件系统.路径的操作函数 目录 Node.js文件系统.路径的操作函数 1.读取文件readFile函数 2.写文件 3.以追加方式写文件 4.打开文件 5.读文件,读取打开的文件内容到 ...

  10. Android权限列表permission说明

    网络上不乏android权限列表,但是很少有将列表和使用方法放在一起的,所以特此总结一下 需要在AndroidManifest.xml中定义相应的权限(以获取internet访问权限为例),如下: & ...