Java基础--IO流
0x00 前言在学习Java反序列化基础时学习Java的IO流,我认为是很明智的。序列化和反序列化的本质就是数据形式的转换,既然是数据形式的转换,那就必须通过各种IO流来实现。
参考文章(强推):Java(2)-Java IO输入输出流
0x01 IO流概述数据流概述IO其实是Input/Output,输入和输出。所谓IO流,就是指输入流和输出流。
输入流和输出流同属于数据流——数据流是一组有序,有起点和终点的字节的数据序列。请看下面的图片:
我们不难想到数据流的三个基本组成部分:数据形式、起点、终点。这里的起点和终点既可以是外部的存储物件,也可以是程序里的内存区,这到底有什么规律呢?
数据存储数据存储的三种方式:外存,内存,缓存,Java数据的存储同样是这三种。外存指的是硬盘,磁盘,U盘等等,内存在本文就指的是内存区(在电脑上指的是内存条),缓存在CPU里。
IO流概念经过上面的知识铺垫,我们可以开始了解Java的IO流了。
可能大家会问:把数据存储到程序的内存,但是内存本身就是一个抽象的概念,到底是存储在内存的哪一个物理客体上呢?这就要依靠Java的JVM了,JVM的内 ...
Java反序列化基础篇-03-Java反射进阶
0x00 前言Java反序列化基础篇的第三篇文章。
参考教程:白日梦组长的视频 Java反序列化漏洞专题
Java反序列化基础篇-03-Java反射进阶 | Drunkbaby’s Blog
0x01 知识回顾setAccessible(true)
setAccessible(),即暴力访问权限。当一个类的构造器、属性、方法被private修饰时,就需要设置setAccessible(true),才能成功访问它们。
这种方法可以和getConstructor配合使用,再回顾一下getConstructor方法:
该方法可以拿到指定的Class对象的构造器。
利用思路:(顺序并不绝对,看个人理解和习惯)
先得到Class对象
再从Class对象拿取exec方法
实例化Class对象
利用exec方法
代码实现如下:
但是可以实现的更简单一点:
就其原理,还是前文所述,利用反射机制得以利用类的方法,该方法的实现需要类的实例,类的实例的实现需要构造器,所以就需要getConstructor,本例访问的构造器需要权限,所以使用setAccessible(true),这就是二者配 ...
Java反序列化基础篇-02-Java反射与URLDNS链分析
0x00 前言Java反序列化基础篇的第二篇文章。
参考教程:白日梦组长的视频 Java反序列化漏洞专题
Java反序列化基础篇-02-Java反射与URLDNS链分析 | Drunkbaby’s Blog
0x01 回顾攻击思路在上篇文章,我们大致了解了Java反序列化的攻击思路:
首先要具有Serializable接口,可以被序列化喝反序列化
入口类(最好重写readObject方法)应该满足三个条件:
该readObject方法接收的参数类型宽泛,比如Object类型
该readObject方法可以调用常见的函数,比如Object类下的hashCode方法
该入口类最好jdk自带
找到了入口类,还要找到调用链( gadget chain)
最后要找到执行类(sink)用来攻击
谈起反射在上文,我们遇到了一个问题,给出题干:
不难看到在反序列化之前执行了hashmap.put方法,跟进该方法:
对比hashmap的readObject方法的一段代码:
二者一模一样的代码,对URLDNS有很大的影响:
在序列化hashmap对象之前,hash(key)方法会执 ...
Java反序列化基础篇-01-反序列化概念与利用
0x00 前言千里之行,始于足下······Java反序列化基础篇的第一篇文章。
参考教程:白日梦组长的视频 Java反序列化漏洞专题
Java反序列化基础篇-01-反序列化概念与利用 | Drunkbaby’s Blog
0x01 基础概述序列化与反序列化是什么简单来说:
序列化:对象->特定格式的字符串
反序列化:特定格式的字符串->对象
序列化与反序列化的作用序列化可以把对象转换成字符串数据,而反序列化可以把这些字符串数据重新转换为对象。
为什么要把对象转换成字符串数据呢?或者说,什么情况下对象需要转换成字符串数据呢?
在数据传输过程中,我们并不能直接传输对象,而是利用反序列化把对象转换成便于传输的字符串数据,当字符串数据传输到目的进程时,再利用反序列化把这些字符串数据转换成原先的对象。
又或者存储一些对象的时候,利用字符串便于存储的特点,可以存储对象数据到文件或者数据库中。
这里我们就难免要思考字符串数据的优势:
利用序列化可以实现远程通信,可以在网络上传输对象的字节序列。
可以实现数据的持久化存储,通过序列化可以把数据永久地存储在文件或者硬盘上。
序列 ...
phar反序列化入门
0x00 前言当学习感到吃力且无趣时,正是学到深处时,当不畏艰苦、细细研究。
0x01 phar概述phar文件介绍PHAR(PHP Archive)是一种将多个 PHP 文件和资源打包成一个单独文件的格式,类似于 Java 的 JAR 文件。其用于打包 PHP 项目,使其更易于分发和部署。
phar文件结构大体上来说,phar文件结构由四部分组成:
stub :phar文件标识
a manifest describing the content : 描述文件内容的清单
the file contents : 存储的文件内容
[optional] a signature for verifying Phar integrity (phar file format only) :用于验证 PHAR 文件完整性的签名(仅适用于 PHAR 文件格式)
1. stub
格式为:xxx<?php xxx; __HALT_COMPILER();?>,xxx的内容不限,但是必须以 __HALT_COMPILER();?>结尾,不然phar扩展无法把该文件识别为phar文件。
p ...
GZ出题——动态flag
0x00 项目一览基本目录一览:
目录结构:
your_term
src
你的题目
files
start.sh
flag.sh
Dockerfile
0x01 两种方法法一 · 直接输出flag这个方法适用于:你希望写题的人在完成条件后直接输出flag。
src目录src目录下是我们的整个题目源码,大家写了PHP留言板项目后对PHP项目并不陌生。
你需要在src目录输出flag的文件里写入:
1echo getenv('GZCTF_FLAG');
files目录start.sh和flag.sh的内容都如下:
1#!/bin/bash
Dockerfile文件源码如下:
1234567FROM ctfhub/web_httpd_php_5.6COPY src /var/www/html/COPY files/flag.sh /flag.shCOPY files/start.sh /start.shEXPOSE 80
法二 · getshell这个方法适用于:你希望写题的人要getshell并cat /flag。
src目录只要给 ...
一道很棒的PHP题目
0x00 前言到底什么是能力?鄙人看来,即是根据已有的和能收集到的知识,通过各种方式达成目的。这里的”知识“又称为经验,”方式“又称为思维。(实际上,收集知识也是一种很重要的能力)
如上所言,我很注重培养自己的经验和思维。经验可以依靠持之以恒的积累,但是思维的提升需要深度的思考。每做一题,可以积累经验,每复盘一题,可以提升思维——磨刀不误砍柴工。
0x01 题目题目来源:NestCTF-2019-Web-love math 2
题目如下(纯PHP代码):
12345678910111213141516171819202122232425262728<?phperror_reporting(0);//听说你很喜欢数学,不知道你是否爱它胜过爱flagif(!isset($_GET['c'])){ show_source(__FILE__);}else{ //例子 c=20-1 $content = $_GET['c']; if (strlen($content) >= 60) ...
XML与XXE入门
概述XMLXML(eXtensible Markup Language),即可扩展标记语言,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
XML结构分为:
XML声明
DTD文档类型定义(可选)
文档元素
XML漏洞
XXEXXE是XML的一个漏洞,全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害
XXE产生根本原因:网站接受XML数据,没有对xml进行过滤
XXE知识总结,有这篇就够了!-CSDN博客
XXE原理CSAWCTF-复赛-2019-Web-Unagi参考题解:CSAWCTF-复赛-2019-Web-Unagi - 知乎 (zhihu.com)
ctf题目练手·五
0x00 前言思维定势最不可取。但是在刚学习一些知识和技能时,我们只能生搬硬套或者照葫芦画瓢。
惟有在日后学习时,不断思考所学内容的本质,方能举一反三,妙思频出。
0x01 题目题目来源:CISCN-2019-华北赛区-Day2-Web-Web1
index.php
很明显,flag应该在当前数据库的flag表的flag列。
抓包看看参数和其他信息:
0x02 尝试面对sql注入,我首先想的是找到可行的注入方法,换言之,我要知道题目限制了哪些关键字符,该怎么绕过或者采用什么注入方式巧妙避免这些限制。
严格的限制限制空格1.本题限制有点严格,我先尝试了1’#
2.单独使用某个字符会回显如下:
3.看起来是组合的错误,那当然要使用空格分开了:
em,空格直接限制了,有以下几种绕过方法:
/**/
%09
%0a %0b %0c %0d
%a0 (没用成功过)
%09和%0a-%0d都可以,我使用%09。
莫名其妙的限制
What can I say ?
后面采用了ASCII编码,十六进制编码等等,都绕不开过滤,只能通过fuzz找找突破口:
bp再爆破就爆破不 ...