shiro系列漏洞分析
前言:经过一段时间的java安全知识的学习,对整个java安全的认知也进一步加深,平时耳熟能详的shiro也来到了我的java安全学习日程中,接下来就针对shiro系列漏洞shiro550,shiro721进行一波学习。
shiroshiro是一款安全框架,他主要干的事情就是和身份验证,授权,会话管理等有关的事情,shiro550和shiro721的漏洞触发点都是因为shiro在登陆的时候提供了一个大家经常都能用到的功能:记住登陆状态,下次登录就不用重新输入密码了。但是shiro在处理他时采用的办法是在cookie中加入一个rememberMe字段,并且往里面保存加密后的序列化数据,当用户再次登录会直接反序列化这一段数据来获得用户信息.我们要是知道加密方式就能任意触发反序列化代码导致漏洞出现
shiro550部署
直接访问
https://github.com//apache/shiro/archive/refs/tags/shiro-root-1.2.4.zip
下载后使用idea打开使用maven一键下载依赖,然后配置tomcat,deployment选择samples-web:w ...
通过调试源码深入理解分析RMI运行机制(长文)
阅读本篇文章前注意事项如果你是初次接触RMI,JNDI等概念,请先理解阅读我写的另一篇文章”RMI-JNDI初探”,个人认为整个RMI的运行机制还是非常复杂的,因为他在整个调用的过程中是多线程的,有非常非常多的坑点,本篇文章将以RMI运行过程为大纲,深入剖析其运行原理。
本篇文章运行环境为JDK7U80
[TOC]
第一步:服务端开启注册服务调试代码:
Server端:
1Registry registry = LocateRegistry.createRegistry(1099);
Client端:
12Registry registry = LocateRegistry.getRegistry("127.0.0.1",1099);registry.lookup("hello");
一切准备就绪,跟随Server端的启动进入RMI的调用旅程
跟进后首先便是实例化RegistryImpl对象
进入RegistryImpl类的构造函数,实例化一个LiveRef对象,var2就是端口号1099,此时this为Regis ...
RMI,JNDI初探
前言:在学习JAVA安全的路上有许多不顺利的地方,早早就听闻RMI,JNDI注入。最初我作为一个初学者,以为JNDI注入是不是就是类似sql注入和ongl表达式注入那样在某个输入框输入payload直接就触发然后就命令执行,带出数据xxx或者执行其他操作.但是当我初次研究后,处于一脸懵逼的状态,他好像比我想象中的复杂,接触初期觉得复杂肯定不是因为背后的代码有多么复杂,而是被概念搞混。本篇文章将会又最基本的概念解释开始讲起,逐渐深入其实现原理。
什么是RMI?RMI全称(Java Remote Method Invocation)JAVA远程方法调用,顾名思义,RMI是一个行为,我们把在一个JVM中调用另一个JVM中的JAVA方法的这种行为称之为RMI。
要完成RMI这个行为,我们分为三个步骤
1.Client-客户端 调用服务端方法
2.Server-服务端 给客户端提供方法进行调用注:代码将在服务端执行,而不是客户端。客户端获得的只是方法在客户端执行后的返回值
3.Register-注册中心 :本质是一个map,里面保存着客户端查询要调用的方法的引用
举个例子,下面编写两个程序,一个 ...
java反序列化入门(URLDNS)
前言:反序列化漏洞在研究java反序列化漏洞之前大家肯定也对php反序列化漏洞,python反序列化漏洞有一定的了解.为什么反序列化漏洞如此盛行,在多个语言中都存在呢? 在学习java反序列化的时候我抛出了这样一个疑问.虽然本人水平有限并且短时间内难以准确回答这个问题,但是我从php反序列化和java反序列化中找到他们的相同与不同处,可能一定程度上能帮助我理解java反序列化.
反序列化漏洞的逻辑是什么?反序列化漏洞的触发是一个链型的逻辑,我们把这个链形调用链的开头,中部,结尾划分为以下三个部分
1.链的开头:在反序列化过程中执行或反序列化后执行的,我们称之为“kick-off” gadget
2.中部: 各种chain,起到链接1和3的作用
3.链的结尾:执行的任意代码或者命令的类(达成恶意目的) 我们称之为”sink” gadget
我们在代码中去寻找1和3,然后再找能让1和3链接起来的逻辑,从而形成一条完整的调用链触发恶意代码
PHP反序列化链中的kick-offphp中引入了魔法函数这一概念,对象在一些特殊状态下会触发他们.例如对象被初始化时使用的时候的__construct方 ...
JAVA常用特性详解
作为一个没有进行过JAVA开发的菜鸡,在审计代码的过程中经常会遇到JAVA的一些特性,了解这些特性是必要的.我采用一边学习一边记录的方式,在学习JAVA安全过程中遇到的各种JAVA特性,概念在这里进行统一的学习记录,以方便查看.
这里我把他们分为两个类型,需要详细深入分析(以下简称详细)**的和了解用法原理(以下简称了解)的,**了解指能让我更好的理解读懂代码,详细指对漏洞触发,漏洞原理有直接影响的的核心特性.
目录:
[TOC]
泛型(了解)泛型,顾名思义广泛的数据类型,如何让一个变量成为任意的数据类型呢?答:让他成为泛型
例子:在JAVA中List就是一个泛型,我们可以往里面存各种数据,string,int,float,object都可以
可能出现的疑问(会在最后解答):为什么List是一个泛型?
12345List demo = new ArrayList();demo.add(123);//Integerdemo.add("123");//StringSystem.out.println(demo.get(0));System.out.println(dem ...
Struts2-S007详细分析
前言:在分析007的过程中发现007和001有一定的相似程度,但是在搭建环境的时候被网上不少文章给误导了,很明显这些文章并不是很清楚整个漏洞的触发条件以及原理,大部分的文章都会添加一个[ActionName]-validation.xml的验证表单,好像这个东西是整个漏洞触发的必要条件.后来发现这个是vulhub中带的,大家没有自己搭建环境就直接下载现成环境自然而然也不会去追究为什么会有这么一个东西以及他究竟是不是有必要的所以自己搭建环境进行复现是非常有必要的
0X01:环境搭建S2-007究竟会在什么样的一个环境下触发,首先就需要直到为什么会造成这个漏洞
很多文章一开头就说了,这个漏洞发生在类型转换时如果发生错误(比如abcd不能转换为int类型)的时候会将错误保存起来,然后将发生错误的参数传入input视图(struct.xml中配置),input视图如果存在标签解析,而这个标签恰巧是我们的可控数值,这个时候就struct就会默认尝试先去使用ognl解析这个标签的值,如果此时我们的值是一个ognl表达式那么就会被解析了
所以能够造成此漏洞的需要的必要环境条件是
1.于存在类型转换错 ...
常用单词随笔记录
为什么会有这样一个文章?
在我们看别人代码的时候,大部分变量名是以英文命名的,虽然我们有翻译软件可以翻译,但是在审计代码的过程中复杂的调用过程都去百度翻译一下是很浪费时间的而且很有可能让本来都不通顺的思维打断,我常常通过变量名,方法名作为理解一个函数作用的重要方法,英语又是我非常烂的一门学科,所以有了这篇文章,这篇文章会一直更新,记录那些常用的单词,并解释他们作为变量名的时候的含义,**并且同时学习代码编写规范,**这样才能更好的看懂别人的代码.
12345678910111213141516handle:句柄Conversion :转换Exception:异常property:属性Intercept:拦截器invoke:激活,引用invocation:调用iterator:迭代器pre:pre- 开头的函数或者变量名,通常会在程序的核心流程之前发生、进行;contains:包含util:工具类会带上,是utiliy的缩写compile:编译Malformed:格式错误sequence:序列External:外部Serial:连续的
Struts2-S2 005详细分析
前言:注:如果你跟我一样是个菜鸡并且没有看过S2-003,那么强烈建议去看一下S2-003的调用过程,我也有写,可以先看一下
昨天刚啃完了struts2-s003,第一次分析觉得超级复杂花费了大量的时间,同时也对整个解析流程熟悉了很多,听说S2-005是S2-003的绕过,不妨趁热打铁,直接分析一下.
注:以下内容以及思维逻辑站在一个刚开始接触java审计的菜鸡身上,同时也能记录我的思维进步过程
由于熟悉S2-003的调用过程,当我首次看网上各类文章的时候,分为两种
第一种:简单介绍一下这个是s2-003的绕过,然后提了一下unicode编码绕过,然后就说官方是通过增加一个沙盒模式进行修复,然后就是下载现成环境打一发payload结束
第二种:一些大佬们直接从代码层面分析代码的改动,首先新增了几个接口,由xxx实现,解释了一大波新的内容,新增了xxxx方法,这对于我这种开发经验不足且刚接触java审计的菜鸡无疑是毁灭性的打击,但是,既然是针对S2-003的绕过,那我就饶过这个本质而言,先尝试自己分析为什么旧的payload不能执行了分析完后没想到并没有这么复杂并且我自己在没有看别人发的 ...
Struts2-S2 003详细分析
前言:S2-003是第我审计的第二个java漏洞,其中核心还是围绕着OGNL表达式注入的利用,在我的”Struts2-S001”中以一种初学者的理解讲解了ognl表达式的用法,如果说S2-001的作用是让我大概了解了Struts2的执行流程,那么这次的S2-003让我深入了解了ognl的执行原理,网上对于S2-003的解释十分有限,内容不相同的文章就没有几篇,其中有一些我认为很复杂的概念没有讲出来,导致整个利用原理让人摸不着头脑,为什么payload形如(one)(two)?这些括号的意义是什么?为什么ognl就会解析one,而不会解析two呢,为什么(one)(two)(three)甚至是(one)(two)(three)(four)…也是可以成功执行的呢?这涉及以下几个核心概念,本篇文章会在恰当的地方进行解释.
1.什么是ASTchain,他长什么样?
2.ognl是如何解析各种类型的AST的
3.payload被解析为ASTchain后是什么一个形式
4.payload的解析顺序
0X01:利用过程&环境搭建先写利用过程
12GET /Struts2-s003& ...
UDF提权
UDF(user defined function)mysql自带的函数有user(),version()等,除了自带的函数,用户可以自定义一些函数方便在查询的时候使用它们,我们把这些函数称之为UDF(user defined function)
用法:
1create function function_name returns {string|integer|real|decimal} routine_body
function_name:函数名
routine_body:由合法的sql语句构成的函数体
举个例子:
查询user表id为1的username我们应该这么写:
1select username from user where id = 1;
执行结果如下:
12345+----------+| username |+----------+| mengda |+----------+
这个时候我们自定义一个函数
1create function getUserName(userid int) returns varchar(30) ...