shiro反序列化初探
Apache shiro简介shiro是一种开源的java安全框架。它提供了身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(Session Management)等安全功能,用于保护Web应用程序和非Web应用程序中的安全性。可运行在web应用和非web应用中。使用Shiro框架可以使应用程序的安全性得到提高,同时也可以使开发者更加方便地进行身份验证、授权和会话管理等操作,减少了开发的复杂度和工作量。
漏洞原理shiro框架提供了保持会话的功能,当用户勾选Remember Me并且登录成功后,服务端会返回一个字段名为rememberMe的Cookie字段,该字段将登录信息序列化,AES加密后base64编码作为rememberMe字段值返回给客户端。用户以后每次登录时携带此Cookie就可以免账号密码登录。由于AES是固定key加密,key是写死在源代码中的,(后面分析会讲)那么攻击者就可以将恶意代码序列化,AES加密并编码通过Cookie传递服务端达到恶意代码执行的目的。
影响版本:Apache Shiro & ...
东华杯ezgadget复现
前言学了cc链后找个题练练吧,本篇文章记录东华杯2021ezgadget题目的复现过程。题目附件网上随处可见,在这就不放附件了。题目不是很难 ,看看吧。
题目分析利用jd-gui工具反编译jar包,idea新建maven项目,把反编译好的源码拷贝进去。运行代码启动服务
本地环境启动成功,当然也可以运行jar包来起环境,只不过放在idea中更好调试。废话不多说了开始分析。有一个控制器类
@Controller public class IndexController { @ResponseBody @RequestMapping({"/"}) public String index(HttpServletRequest request, HttpServletResponse response) { return "index"; } @ResponseBody @RequestMapping({"/readobject"} ...
java反序列化-cc3链分析
简介继续来分析cc链了,相较于cc1,这条cc3链就是改变了最后的执行类。由之前的Runtime命令执行改变为动态类加载,能够任意代码执行,对于命令执行,代码执行应用更加广泛。这篇cc3的分析文章也是基于cc1分析文章的基础上编写。
CC3链分析执行类我们知道CC3链是任意类动态加载来代码执行的,而这个利用点就在defineClass方法中。
而这个方法主要做的事情就是由字节码数据加载为java对象,也就是类的加载。这个方法是由protected修饰,不能直接被包外的类调用。那么我们就逆向找哪个public修饰的方法调用了此处。在Templateslmpl类中的defineClass方法中调用了。
这也不是public,继续找。在本类的defineTransletClasses方法调用了。继续往上找,在该类的getTransletInstance方法中调用了。
我们知道,执行静态代码块需要满足两个条件,类加载与初始化。而这个方法中对_class初始化了,所以我们需要将链走到这里。这个还是私有的方法,继续往上找,看谁调用了它。
public方法有了。那么就从这个地方开始编 ...
java反序列化-cc6链分析
简介继续分析CC链了。上一篇文章分析了CC1链,这条链子限制特别多,jdk版本的限制,Commons Collections版本的限制,所以这条链子其实并不是很好用。那么这篇文章主要分析CC6链,这条链子通用,几乎没有一些所谓的版本限制,而且这条链子可以说是结合了CC1链和URLDNS链,学了这两条链子后再分析这条CC6链,就会发现很容易了。注:此篇文章在URLDNS和CC1链分析文章的基础上编写。
CC6链分析这条链子的利用点还是没有变的,依旧是InvokerTransformer类的transform方法,
因为执行类Runtime类不能序列化,所以需要配合ChainedTransformer类与反射生成实例执行命令,直接照抄下来。
Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod",new Cla ...
java反序列化-cc1链分析
Commons Collections简介Commons Collections是Apache软件基金会的一个开源项目,它提供了一组可复用的数据结构和算法的实现,旨在扩展和增强Java集合框架,以便更好地满足不同类型应用的需求。该项目包含了多种不同类型的集合类、迭代器、队列、堆栈、映射、列表、集等数据结构实现,以及许多实用程序类和算法实现。它的代码质量较高,被广泛应用于Java应用程序开发中。本篇文章就是分析Commons Collections3.1版本下的反序列化问题,针对于它的攻击链也被称为cc1链。
准备工作选择jdk版本为8u65,因为漏洞在8u71的版本就被修复了。下载地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html。
CommonsCollections的版本选择3.2.1,不能太高,太高也是没有漏洞的。添加Maven依赖下载:
<dependencies> <!-- https://mvnrepository.com/artifact ...
java反序列化基础
简介与php和python的反序列化类似,序列化与反序列化本质上就是方便以流的形式在网络上传输,更持久化的保存对象。在服务端没有严格限制用户输入的情况下,服务端代码会在反序列化时运行用户提交的恶意代码,最终造成攻击的目的。
相关基础Serializable 接口跟进源码发现,它这只是一个空接口。
这个接口是用来标识那些类是可以被反序列化的,换句话说,只有实现了Serializable接口的类才能被反序列化,强行序列化会发生报错。对于静态成员变量和transient 标识的对象成员变量不参与反序列化。
ObjectOutputStream类是Java I/O类库提供的一种对象输出流类,它可以用于将对象序列化后写入输出流中。能将 Java 中的类、数组、基本数据类型等对象转换为可输出的字节,也就是序列化。
writeObject函数序列化函数,将一个对象写入输出流。在序列化对象时,我们可以将一个对象作为参数传递给 writeObject() 方法。该方法会自动将该对象序列化并写入到输出流中。
objectInputStream类Java 中的一个类,用于读取序列化对象。它可以 ...
VNCTF2023web复现
前言近期参加了VNCTF2023,里面有两道web题是考察rust和go语言的,由于这两门语言之前从未接触过,比赛结束后借着师傅的wp复现一波,在此写文章记录一下。网上一位师傅的wp:
https://www.cnblogs.com/nLesxw/p/VNCTF2023.html
根据此wp进行复现。
象棋王子打开题目,前端象棋小游戏。
找js文件审计代码了解逻辑,在play.js中发现jsfuck编码,一看就是flag,直接放在游览器上运行出flag。
电子木鱼给了附件,Rust语言做后端。Rust语言之前从来没接触过,比赛时边查文档边审。主要说一下几个路由,
#[derive(Deserialize)]struct Info { name: String, quantity: i32,}#[derive(Debug, Copy, Clone, Serialize)]struct Payload { name: &'static str, cost: i32,}const PAYLOADS: ...
浅说XSS和CSRF
浅说XSS简介
跨站脚本是一种针对于前端的代码注入攻击,攻击者将恶意的JavaScript代码注入到过滤不严格的web网页中,当用户游览该网页时,JavaScript代码就会被执行,从而达到恶意攻击的目的。
XSS有三种类型,分别来说说。
反射型XSS通常情况下,恶意代码参数会注入在URL中,通过用户去点击链接,其中的恶意参数会被HTML解析,执行。非持久的,恶意代码不会注入到服务器中,每次执行都需要用户去点击或者访问。
DVWA靶场设置难度为low,源码:
<?phpheader ("X-XSS-Protection: 0");// Is there any input?if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Feedback for end user $html .= '<pre>Hello ' . $_GET[ 'name' ] . ...
NSSRound#8 Basic记录
前言继续记录NSS平台的赛题,NSSRound#8赛题比较基础,但还是值得记录一下。
MyDoor打开题目,细看url。
盲猜这里存在文件包含,使用php://filter读取index文件,获得源码。
<?phperror_reporting(0);if (isset($_GET['N_S.S'])) { eval($_GET['N_S.S']);}if(!isset($_GET['file'])) { header('Location:/index.php?file=');} else { $file = $_GET['file']; if (!preg_match('/\.\.|la|data|input|glob|global|var|dict|gopher|file|http|phar|localhost|\?|\*|\~|zip|7z|compress/is ...
java代理机制学习
什么是代理?举个例子,蔡徐坤要开演唱会,那么他需要布置场地,宣传,收钱等工作。这么多繁杂的工作让他一个人做肯定是不的,所以就请了一个经纪人,也就是代理,让经纪人去干这些繁琐的事。而蔡徐坤只需要唱歌就可以了。而这个经纪人也必须代表蔡徐坤演唱会 (也就是拥有委托类的所有方法)。那么,代理模式就是代理类与委托类有相同的接口,代理类是不修改委托类代码的前提下对类的功能进行扩展。
静态代理比较容易理解,写个代码就知道了。先定义一个接口
interface a1{ //定义一个接口 public void cell();}
然后再写一个委托类。
class a2 implements a1 { //设置委托类来重写方法 public void cell(){ System.out.println("方法被重写了"); }}
然后再写一个代理类,代理类也继承于接口。
class ProxyClass implements a1{ //设置代理类来重写方法 private ...