ThinkSNS2.5前台getshell+后台任意文件删除
12年爆出的一个洞 前几天比赛的一个cms 于是跟出题人表哥要过来审计了看看
漏洞文件再根目录thumb.php中
<?php
/*
* 自动缩略图 参数 url|w|h|type="cut/full"|mark="text/image|r"
* thumb.php?url=/thinksns/data/userface/000/00/00/41_middle_face.jpg?1247718988&w=20&h=20
*/
error_reporting(0);
set_time_limit(30);
$biggest_memory_limit = 256; //单位M,后缀不要加M
//全局定义文件
//require 'define.inc.php'; //临时目录
$tempDir = "./data/thumb_temp/";
checkDir($tempDir); //分析URL
$url = urldecode($_GET['url']); //XSS脚本攻击探测
//include THINK_PATH.'/Vendor/xss.php';
//DetectXSS($url); //2009-10-7 修改 将本地图片修改成相对地址,避免file_get_contents不能读取远程文件时出错(可修改php.ini 设置 allow_fopen_url 为 true)
//$url = str_ireplace(SITE_URL,'.',$url);
if(file_exists($url)){
$url = $url; }elseif($result = GrabImage($url,$tempDir)){
$url = $result;
$grab_temp_file = $result;
}else{
$url = "./public/images/nopic.jpg";
} //解析参数
$w = $_GET['w']?$_GET['w']:'100'; //宽度
$h = $_GET['h']?$_GET['h']:'100'; //高度
$t = $_GET['t']?$_GET['t']:'c'; //是否切割
$r = $_GET['r']?'1':'0'; //是否覆盖 //目录名hash
$fileHash = md5($url.$w.$h);
$hashPath = substr($fileHash,0,2).'/'.substr($fileHash,2,2).'/'; //缩图目录
$thumbDir = "./data/thumb/".$hashPath;
checkDir($thumbDir); $tempFile = $tempDir.$fileHash.'.'.$sourceInfo['type']; $thumbFile = $thumbDir.$fileHash."_".$w."_".$h."_".$t.'.'.$sourceInfo['type']; $img = new Image();
//判断是否替换,存在则跳转,不存在继续进行
if(!$r && file_exists($thumbFile)){
//这里有2种方法,第一种多一次跳转,多一个http连接数,第二种,要进行一次php处理,多占用一部分内存。
//header('location:'.$thumbFile);
$img->showImg($thumbFile);
} //不存在输出
if(copy($url,$tempFile)){
//判断图片大小 如果图片宽和高都小于要缩放的比例 直接输出
$info = getimagesize($tempFile); //判断处理图片大约需要的内存
$need_memory = (($info[0]*$info[1])/100000);
$memory_limit = ini_get('memory_limit');
if( ($need_memory > $memory_limit) && ($need_memory <= $biggest_memory_limit) ){
ini_set('memory_limit',$need_memory.'M');
} if($info[0]<=$w && $info[1]<=$h){ copy($tempFile,$thumbFile);
$img->showImg($thumbFile,'',$info[0],$info[1]);
unlink($tempFile);
unlink($grab_temp_file);
exit;
}
else{ //生成缩图
if($t=='c'){
$thumb = $img->cutThumb($tempFile,$thumbFile,$w,$h);
}elseif($t=='f'){
$thumb = $img->thumb($tempFile,'',$thumbFile,$w,$h);
}
//输出缩图
$img->showImg($thumb,'',$w,$h);
unlink($tempFile);
unlink($grab_temp_file);
exit;
}
}
第17行获取了url参数
第28行进入了GrabImage函数
//获取远程图片
function GrabImage($url,$thumbDir) {
if($url=="") return false;
$filename = md5($url).strrchr($url,".");
$img = file_get_contents($url);
if(!$img) return false; $filepath = $thumbDir.$filename;
$result = file_put_contents($filepath,$img);
if($result){
return $filepath;
}else{
return false;
}
}
获取url参数的内容 并写入了filepath中截取了一下
./data/thumb_temp/7588534a6998ec36787cf997e688a8d6
第53行 重新构造文件名
$thumbFile = $thumbDir.$fileHash."_".$w."_".$h."_".$t.'.'.$sourceInfo['type'];
这里$t传入.php
第77行 完成了复制的操作
copy($tempFile,$thumbFile);
导致了getshell
在后台数据库导入的地方
function import(){
$filename = $_GET['filename'];
$sqldump = '';
$file = './data/database/'.$filename;
//die($file);
if(file_exists($file)){
$fp = @fopen($file,'rb');
$sqldump = fread($fp,filesize($file));
fclose($fp);
}
$ret = D('Database')->import($sqldump);
if($ret) {
$this->success('导入成功');
}else{
$this->error('导入失败');
}
}
首先文件名没有进行过滤 可以遍历读取到东西之后进入了另外一个import函数
跟进一下
public function import($sqldump){
$sqlquery = $this->splitsql($sqldump);
var_dump($sqlquery);
$ret = false;
$linkid = $this->db->connect();
foreach($sqlquery as $sql) {
$sql = trim($sql);
if(!empty($sql)) {
$ret = mysql_query($sql);
}
}
return $ret;
}
没有过滤 逐行执行
但是没有上传功能呀 怎么办呢
在前台头像上传的地方
function upload(){
@header("Expires: 0");
@header("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
$pic_id = time();//使用时间来模拟图片的ID.
$pic_path = $this->getSavePath().'/original.jpg';
$pic_abs_path = __UPLOAD__.'/avatar'.convertUidToPath($this->uid).'/original.jpg';
//保存上传图片.
if(empty($_FILES['Filedata'])) {
$return['message'] = L('photo_upload_failed');
$return['code'] = '0';
}else{
$file = @$_FILES['Filedata']['tmp_name'];
//die($pic_path);
file_exists($pic_path) && @unlink($pic_path);
if(@copy($_FILES['Filedata']['tmp_name'], $pic_path) || @move_uploaded_file($_FILES['Filedata']['tmp_name'], $pic_path))
{
@unlink($_FILES['Filedata']['tmp_name']);
/*list($width, $height, $type, $attr) = getimagesize($pic_path);
if($width < 10 || $height < 10 || $width > 3000 || $height > 3000 || $type == 4) {
@unlink($pic_path);
return -2;
}*/
include( SITE_PATH.'/addons/libs/Image.class.php' );
Image::thumb( $pic_path, $pic_path , '' , 300 , 300 );
list($sr_w, $sr_h, $sr_type, $sr_attr) = @getimagesize($pic_path);
$return['data']['picurl'] = 'data/uploads/avatar'.convertUidToPath($this->uid).'/original.jpg';
$return['data']['picwidth'] = $sr_w;
$return['data']['picheight'] = $sr_h;
$return['code'] = '1';
} else {
@unlink($_FILES['Filedata']['tmp_name']);
$return['message'] = L('photo_upload_failed');
$return['code'] = '0';
}
}
return json_encode( $return );
}
大体意思就是没检测文件内容 也不管后缀是什么 读取出文件内容 统一写入一个固定的文件
我们在这里写入要执行的sql语句这里我想到的利用方法
1.留xss后门

执行一个update或者insert语句 在用户管理的表中 后台查看用户就会触发xss 这里绕过了前台的过滤持续控制后台
2.因为并没有回显
可以执行update 或者insert语句 在插入文章的
INSERT INTO `ts_ad` (`title`,`place`,`is_active`,`content`,`is_closable`,`mtime`,`ctime`) VALUES ('31',0,'0',user(),0,1502120589,1502120589)

进一步获取服务器敏感信息
3 如果有root权限可以写shell
4有时间可以尝试下时间盲注
同时删除的地方可以进行任意文件删除
ThinkSNS2.5前台getshell+后台任意文件删除的更多相关文章
- PHP:网展cms后台任意文件删除和sql注入
0x01:目录结构 可以发现Frameword是框架的文件 install安装 public公共文件 uploads储存上传之类的文件 webuser后台文件 Home前台文件 0x02.csrf漏洞 ...
- Discuz!X V3.4后台任意文件删除
Discuz!X V3.4后台任意文件删除 简述 该漏洞为后台任意文件删除,需要有管理员的权限,所以说危害非常小 复现环境 docker.vulhub-master 项目地址:https://gite ...
- 【代码审计】iZhanCMS_v2.1 后台任意文件删除漏洞分析
0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...
- 【代码审计】CLTPHP_v5.5.3后台任意文件删除漏洞分析
0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chich ...
- ZZCMS v8.2 前台Insert注入+任意文件删除
前几天看了水泡泡老哥的zzcms的审计,在论坛上一搜发现这个cms有不少洞.听说很适合小白练手,所以来瞅一瞅.不知道我发现的这个洞是不是已经被爆过了,如果雷同,纯属巧合. 一.Insert注入,直接返 ...
- HDWIKI6.0后台任意文件删除/下载
- [代码审计]phpshe开源商城后台两处任意文件删除至getshell
0x00 背景 这套系统审了很久了,审计的版本是1.6,前台审不出个所以然来.前台的限制做的很死. 入库的数据都是经过mysql_real_escape_string,htmlspecialchars ...
- [代码审计]云优cms V 1.1.2前台多处sql注入,任意文件删除修复绕过至getshell
0X00 总体简介 云优CMS于2017年9月上线全新版本,二级域名分站,内容分站独立,七牛云存储,自定义字段,自定义表单,自定义栏目权限,自定义管理权限等众多功能深受用户青睐,上线短短3个月,下载次 ...
- Discuz!X 3.4 前台任意文件删除漏洞复现
Discuz!X 3.4 前台任意文件删除漏洞复现 参考链接: http://www.freebuf.com/vuls/149904.html http://www.freebuf.com/artic ...
随机推荐
- 慢腾腾的Quartus prime16.0加快编译速度
前言 当一个工程反复修改的时候,可能有时候源代码没有更改,为了加快编译速度可以配置quartus一些选项.当然,初次编译的速度是否会提升,未验证.更高级的设计分区以及逻辑锁区提升速度,以后阐述. 流程 ...
- django 报错 : django.core.exceptions.ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting
错误原因有可能是在settings中静态文件目录设置的有问题 STATIC_ROOT=os.path.join(BASE_DIR,"static/")#错误 STATIC_ROOT ...
- word 2013 题注、图注、插入图片自动修改大小、批量更新题注编号
1 .题注 图片下面的文字说明,如 图 1.1.1 2.图注 图的标题格式,可以右键修改段落为居中,选中图片,点下此格式快捷居中等其他格式 3. 题注插入 效果 如下 4.题注自动居中对齐 先点击图 ...
- [luogu4139]上帝与集合的正确用法【欧拉定理+扩展欧拉定理】
题目大意 让你求\(2^{2^{2^{\cdots}}}(mod)P\)的值. 前置知识 知识1:无限次幂怎么解决 让我们先来看一道全国数学竞赛的一道水题: 让你求解:\(x^{x^{x^{\cdot ...
- cf406E Hamming Triples (推公式)
考虑某两行a和b的dis 如果相同:$|a-b|$ 如果不同:$n-|a-b|$ 然后考虑三行的dis,不妨设a>=b>=c 那么有4种情况: 1.a,b,c 0/1的种类相同:$|a-b ...
- PID 通俗解释
PID 控制原理3 个故事:看完您就明白了.1.: PID 的故事小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就 ...
- NOIp2018爆零记
Day-2~Day0 考前抱佛脚,赶紧刷刷各种模板 Day 1 在开考之前打好了拍子模板,然后试题密码就发下来了(这是我前面的神仙打了\(100\)多行\(emacs\)的配置\(QAQ\)). 先按 ...
- HDU--4417 Super Mario (主席树模版题)
题目链接 题目让求 L R区间 不大于H 的数有多少 数据太大需要离散化 #include<bits/stdc++.h> using namespace std; #define maxn ...
- WinterAndSnowmen
https://vjudge.net/problem/TopCoder-12891 暴力想法是:dp[i][s1][s2]前i个,第一个集合xor是s1,第二个集合xor是s2方案数O(n^3) 有x ...
- django基于中间件的IP访问频率控制
一.中间件的代码 注意:成功时返回的是None,那样才会走视图层,返回httpresponse就直接出去了 import time from django.utils.deprecation impo ...