/blog

> Blog Kỹ thuật

Tổng hợp các bài viết chuyên sâu về an toàn thông tin của thành viên N3m3s1s: từ Web Security, Network Security đến Reverse Engineering, được đúc kết từ nghiên cứu thực chiến và thi đấu CTF.

Tại đây bạn sẽ tìm thấy writeup chi tiết, kiến thức bảo mật mới và các chiến thuật phòng thủ thực tế.

2 bài viết

Prisma Blogs

This is challenge prisma type ORM database. Target is a API, have two api, /api/posts and /api/all. Let’ go!!!! I. Recon Create DB Challenge have code by Nodejs, focus index.js, seed.js. You can see, challenge use file schema.prisma to create DB, before use typeORM prisma to query. Prisma is a typeORM, you can build database by prisma: Install Prisma CLI : npm install prisma --save-dev Install driver SQLite ( vì challenge dùng SQLite) : npm install @prisma/client Run file schema.prisma to build : npx prisma db push Function: a. seed.js You can see seed.js, it’s create record of users and posts. There are two points to note: In this file, you can that the flag is located in the Posts table, but the Flag has the published attribute set to false. Each user will random password, and each user will be the author of a random post (the post itself is also generated randomly). So, if want to read all posts, you should have all users. b. index.js Server is running on http://localhost:${PORT} File index.js handle two endpoint is two API": /api/posts will receive a variable query, before the attribute to set published = true. So the flag not read because attribute to set published = true. /api/login, if you have user and password. You can login, and read all post of user. II. Analysis The path I think is to somehow obtain the passwords of the accounts. Howerer, bruce force is impossible because thet are generated using this functions generateString() The number of possible casses is enormous. However, you can see /api/post, parameter query can inserted directly, it’s inserted dircetly in query. We can think SQLi, but prisma filltered SQLi so exploiting SQLi is very unlikely to occur. Foucs model Post, you can see in model Post have atribute author, it’s relation of model User.\n Therefore, we can query using atribute author. Example:\n We can query using name, password, howerver atributed published is set true, so the flag is not view. At this point, there is way to solve this problem. Bruce force or anything, impossbile. Before search, i know prisma have atribute gte (greater than or equal to) or lt (less than). It’s can way to solve this problem. Here, i have set up a localhost and create a database. I will demonstrate it for you. I have also written an endpoint /api/all to display all user. You can see, the password of White is “6nO7H…“. Now, I can query using author[name]=White, and author[password][gte]=1. Because gte is greater than or equal to so, result query OK, return record is all Posts of White ( published is true) because 6>1 is True. Howere, if query author[name]=White, and author[password][gte]=7. result query [] because 6>7 is False Bsed on the differences of two request, we bruce force password of users. III. POC

Administrator04/03/2026

Set up debug Java on IntelliJ

Trong các cuộc thi CTF, mình mất nhiều thời gian và loay hoay với Java. Nhiều bài tưởng chừng writebox nhưng cũng như blackbox vì cơ bản source không mô tả được nhiều hành vi của Challenge. Với Java theo mình thấy các thư viện hỗ trợ rất nhiều, mỗi thư viện sẽ khác nhau với phiên bản, rồi phiên bản gốc của Java, vậy nên để hiểu được code và luồng thực thi thì setup debug có vẻ là một con đường đúng đắn. Đây là cách mình mới tìm hiểu, có phần thủ công, nếu sau này tìm hiểu thêm được cách mới mình sẽ update. Yêu cầu: IntelliJ IDEA: IDEA phù hợp để debug Java, hỗ trợ nhiều công cụ, luồng đi code rõ ràng, tên biến, giá trị biến dễ nhìn. IntelliJ hỗ trợ cho sinh viên với email sinh viên được miễn phí 2 năm. Java: Bạn sẽ không thể biết được Challenge hay project bạn chạy build bằng phiên bản Java bao nhiêu. Vậy nên bạn có thể chọn một tools có thể linh hoạt đổi phiên bản Java như nvm của NodeJS. Ở đây mình khuyên dùng, …. Recaf: Phần mềm dịch ngược Java. <https://github.com/Col-E/Recaf> File CFR: ở đây chính là CFR Java Decompiler. Nó là một công cụ dịch ngược (decompile) các file hoặc trong Java về lại mã nguồn Java gần giống ban đầu. Có thể tham khảo CFR ở đây: https://www.benf.org/other/CFR/ I. Java được build bằng file .jar hoặc .war Về cơ bản file và là hai loại file dùng để nén project Java lại, bao gồm các file … Đọc thêm Nếu một challenge chỉ được bạn một file .jar hoặc .war và build lên qua Dockerfile dạng như: Về cơ bản, với dạng này, file sẽ bao gồm các file (đã được compile của Java) nên không thể debug được. Các bước làm như sau: Dịch ngược code từ các file sang dạng code bằng : Ở bước này, về cơ bản các file s trong source sẽ được dịch ngược lại, tuy nhiên vì nó dịch ngược lại toàn bộ, nên các file trong cũng bị dịch ngược ra luôn. Giải nén file để lấy các file ở trong lib: Debug với InteliJ: Sau khi hoàn thiện việc lấy mã nguồn bao gồm các file source code và các hỗ trợ. Đầu tiên, build lại file để ứng với các giống với source code bên ngoài. Tạo một project Java mới trên InteliJ: Chọn Maven cho dễ. Copy source code qua ứng với code: Vào → → : Kéo các file của vào, chọn phiên bản phù hợp: Sau đó, với Maven, mình phải viết một file pom.xml để tiến hành build lại, tìm ra copy qua thôi: Sử dụng để build lại source, lưu ý chuyển version Java phù hợp với project cũ: Sau khi build ta được một file hoạt động giống với file của challenge, tuy nhiên khác là có thể debug được: Thay thế file trong challenge, và build docker lại. Với InteliJ, chọn: → → : Chọn Port và nhấn → : Copy phần string debug: Thêm vào trong Dockerfile: Trước: Sau: Nhớ Expose cổng debug ra nữa nhé: Sau khi build docker lên, tiến hành bật debug trong IntelliJ, đặt breakpoint: Lưu ý, phải hiện connected to target và khi đặt breakpoint có dấu tích, là thành công. Nếu đặt breakpoint không có dấu tích là chưa khớp từ source code với file .jar. II. Java build bằng Tomcat Với kiểu này, các bước cũng như trên tuy nhiên vì Tomcat sử dụng catalina.sh nên mình phải thêm các biến Env kiểu khác trong Dockerfile để có thể debug được: Trước: Sau: III. Tổng kết Về cơ bản, đây là kiến thức chủ quan của mình nên nếu có sai sót hoặc còn thủ công quá hay gửi mail cho mình qua gmail: Theo mình thấy, khi dịch ngược bằng sẽ có những hàm bị sai, nên cố gắng sửa tay lại làm sao k bị thay đổi ý nghĩa code. Nếu khi copy các file qua IntelliJ để tạo project mới, cảm thấy không biết nên copy như nào có thể dùng để xem cấu trúc thư mục dễ hơn: Với các bài có source code thì tất nhiên không cần làm các bước trên chỉ cần Open Project trên IntelliJ rồi setup Debug thôi. Với các file của lib, IntelliJ có thể gợi ý bạn dowload source để rõ ràng hơn. IV. Tài liệu: <https://viblo.asia/p/java-remote-debugging-debug-ung-dung-java-chay-tren-may-tinh-khac-vlZL9NQDVQK> \ \

Phạm Hoàng Tuấn Thành25/02/2026