5.1k words
I. Lời nói đầuTrong chain CC2, Javasisst được sử dụng để xây dựng gadget chain. Do đó, trước khi debug chain CC2 tôi muốn hiểu Javasisst thật sự làm gì. II. Giới thiệu về Javasisst2.1. Javassist là gì?Bytecode Java được lưu trữ dưới dạng nhị phân trong các file .class. Mỗi file .class chứa một class hoặc một interface Java. Javassist (Java Programming Assistant) là thư viện Java dùng để đọc, tạo và chỉnh sửa bytecode của class Java ngay trong lúc chạy hoặc trước khi chạy ứng dụng. Tóm gọn: th...
28k words
I. Tổng quan về CommonsCollections1 chainChain này có tác dụng là RCE.Để hiểu và phân tích chain này cần có kiến thức về các cơ chế sau trong Java: Reflection API Dynamic Proxy Đặc điểm của CC1 chain: Kick-off Gadget là method AnnotationInvocationHandler.readObject() Sink Gadget là chuỗi ChainedTransformer Chain Gadget: bên trong chain có thể sử dụng LazyMap.get() hoặc TransformedMap.put() Tổng thể chain sẽ trông như sau (theo phong cách ysoserial): 1234567891011121314151617ObjectInputStr...
8.9k words
Lời nói đầuTrước khi đến với Dynamic Proxy, ta sẽ tìm hiểu Proxy Pattern là gì ? I. Java Proxy PatternĐể nói về proxy pattern, trước hết ta cần hiểu khái niệm proxy (đối tượng đại diện/trung gian). Trong hình minh họa bên dưới, đối tượng trung gian (hoặc người đại diện) chính là thứ mà chúng ta gọi là proxy. (Lưu ý: Hình ảnh có thể minh họa kịch bản người thuê nhà → người môi giới/đại diện → chủ nhà.) Trong Java, Proxy Pattern là một mẫu thiết kế cấu trúc (structural design patter...
53k words
I. Kiến thức nềnVề thuật ngữ source và sink: https://sheon.hashnode.dev/java-security-2-phan-tich-urldns-chain-ysoserial Về Java bytecode và framework ASM: https://sheon.hashnode.dev/java-learning-7-java-bytecode https://sheon.hashnode.dev/java-learning-8-java-bytecode-asm-framework Tổng quan về Gadget Inspector được công bố trong bài trình bày Automated Discovery of Deserialization Gadget Chains bởi Ian Haken tại hội thảo DEFCON26 năm 2018 Slide của bài trình bày Automated Discovery of D...
1.3k words
Type descriptor Kiểu trong Java Type descriptor boolean Z char C byte B short S int I float F long J double D Object Ljava/lang/Object; int[] [I Object[][] [[Ljava/lang/Object; Method descriptor Method ví dụ Method descriptor tương ứng void m(int i, float f) (IF)V int m(Object o) (Ljava/lang/Object;)I int[] m(int i, String s) (ILjava/lang/String;)[I Object m(int[] i) ([I)Ljava/lang/Object; Object m(String str) (Ljava/lang/String;)Ljava/lang/Object; pu...
10k words
Lời nói đầuNhư đã nói, sang bài này tôi sẽ phân tích chain URLDNS trong công cụ ysoserial. Kiến thức nềnĐể hiểu được các khái niệm nói trong bài này, bạn cần có kiến thức về cơ chế Serialization/Deserialization và Reflection API. Tôi có viết về các cơ chế này trong series Java Learning, cụ thể là 2 bài sau:https://sheon.hashnode.dev/java-learning-5-serialization-deserializationhttps://phmclong.github.io/myblog/2023/07/19/java_reflection/ Ngoài ra có 1 khái niệm mà tôi sẽ dùng trong ...
9.3k words
Lời nói đầuHôm nay tôi sẽ giới thiệu ngắn gọn về Reflection API trong Java. Việc hiểu được cơ chế của Reflection API sẽ là tiền đề quan trọng cho việc nghiên cứu lỗ hổng bảo mật Deserialization trong Java. Kiến thức nềnTrước khi tìm hiểu Reflection, trước tiên bạn nên hiểu 2 khái niệm: giai đoạn biên dịch (compile time) và giai đoạn chạy (run time). Compile time Là giai đoạn mà source code được compiler biên dịch thành code mà máy tính có thể thực thi (executable code). Trong Java, đó là quá ...
2.7k words
Lời nói đầuMở đầu cho series Java Security, tôi sẽ viết về lỗ hổng Insecure Deserialization. Kiến thức nềnTrước khi đến với chủ đề này, bạn nên có hiểu biết về cơ chế Serialization/Deserialization trong Java. Tôi có viết về cơ chế này trong series Java Learning, cụ thể là bài này: https://sio.hashnode.dev/java-learning-5-serialization-deserialization Insecure Deserialization là gì ?Khi data được deserialize là data do người dùng có thể kiểm soát (user-controllable data hay untrusted data...
JS
4.7k words
Introduction Category: Web Description: Login as admin to get flag, so easy right? Language: NodeJS TL;DR Idea: You can send a JSON with __proto__ to bypass the username=admin check, and crack md5 by using online rainbow table to get flag. It works because req.body has a null prototype while the {} in Object.assign() doesn’t. Payload: curl http://puzzler7.imaginaryctf.org:5001/login -H 'Content-Type: application/json' --data '{"password":"admin"...
JS
6.3k words
Sau bao nhiêu thử thách PHP của CBJS, mình cũng đã được làm 1 thử thách về JavaScript - ngôn ngữ mình quen thuộc. Khi mà PHP có vấn nạn mang tên Type Juggling, thì JavaScript cũng tồn tại 1 vấn nạn mang tên Type Coercion. Thử thách lần này chính là về Type Coercion trong JavaScript. Challenge 1Goal: RCELink thử thách 1:http://javascript-workshop.cyberjutsu-lab.tech:8000/ Vừa vào ta thấy trang cho ta chức năng tính toán các phép như cộng, trừ, nhân, chia cơ bản. Thử một phép tính cơ bản: “...