[Cookie Hân Hoan] Final Exam Blind Hacking 0x02

Đến hẹn lại lên, sau mỗi lớp học được Cookie Hân Hoan mở ra thì sẽ có một bài test dành cho các học viên và sau khi thời gian làm bài của các bạn hết thì các chall sẽ được public cho mọi người. Rất rất cảm ơn Cookie Hân Hoan đã public những bài này để cho mọi người có thể vào ôn lại kiến thức cũng như học được những điều mới mẻ. Và giờ thì vào nội dung chính thôi.
Bài thi này có tổng cộng 5 bài tương ứng với 5 lỗi (chắc là vậy). Mình sẽ làm lần lượt chall 1 → 5 để nó theo chiều từ dễ đến khó cho đỡ ngộp. Nhưng trước khi vào thì mình nên dạo quanh cái web trước đã nhỉ:
Đây là giao diện web
Có một dashboard để xem các report public này, chi tiết của 1 report sẽ như này
Ngoài ra trang sẽ có login và register. Vậy là sương sương các chức năng thế rồi. Và khác với các bài writeup trước thì giờ mình sẽ chỉ hướng đến cách confirm nó là lỗi :v tức là sẽ không đưa ra cái payload nào để lấy flag luôn. Giờ thì bắt đầu thôi nào
Chall1: K02FE Flag 1
Với các chức năng trên thì mình có thể xem các report public. Vậy dựa vào đâu để mình lấy được nội dung các report. Nhìn trên URL thì sẽ có một số nào đó mà vô tình thế nào nó lại bằng chính cái số của vuln
Thì mình đoán chắc chắn đây là ID của vuln report này rồi. Giờ thì đổi số xem. Và bùmmm
Giờ thì mình có thể xem được cả report private nữa. Công việc giờ là thay số cho đến cái report chứa flag thôi.
Ngược lại quá khứ, thì năm vào năm 2013, lỗi IDOR này được nằm riêng một mâm trên TOP 10 OWASP
Và đến năm 2021, nó đã được xếp vào chủng lỗi Broken Access Control và vẫn đứng ở top 1
Thế mới thấy cái lỗi IDOR này vẫn còn rất phổ biến trên thế giới. Anh mình cũng đã từng bảo “Đừng chỉ thấy thay số là dễ, tìm được chỗ để thay mới quan trọng!” - Duongli.
Chall2: K02FE Flag 2
Đọc tên xong thì có vẻ là đi bruteforce password rồi nhưng cái username thì ở đâu. Quay ngược lại thì mình có thể tạo luôn một tài khoản mới để xem hệ thống có ai nhưng vì thế sẽ không vui nhiều lắm nên mình sẽ rà soát lại để xem bây giờ mình sẽ có những cái username nào nhé. Thì có đúng 1 cái username ở trong cái report kìa thôi mà :v
Đăng nhập với pentester1
nào, giờ thì mình lấy password ở đâu??? Thì mình đi search top 10 password trên google thôi. Thử login với cái đầu tiên phát được luôn. Nhưng đề bài nói là của staff, dựa vào tài khoản đã lấy này thì mình tìm ra 2 staff
Hoặc bạn có thể không login vào cũng được, dựa vào lỗi IDOR trên để tìm ra các staff này cũng là một cách. Sau khi lấy được username các staff rồi thì mình sẽ bruteforce password tiếp thôi. Giờ mình mình sẽ dùng Intruder trong Burp Suite luôn. Wordlists thì mình lấy ở đây. Sau khi thử với username staff1
không có kết quả thì với staff2
mình đã thấy cái này
Giờ thì login vào thôi là có flag 2 này rồi.
Theo TOP 10 OWASP thì lỗi này đang nằm trong chủng lỗi Identification and Authentication Failure, top 7 năm 2021.
Chall3: K02FE Flag 3
Bài này cho luôn là ở /backup
rồi mà chức năng này lại chỉ được truy cập ở localhost
, vậy thì khả năng đây là SSRF rồi. Vào thử chức năng này thì thấy nó sẽ redirect về http://localhost:1337/backup
. Giờ mình sẽ phải quay ngược lại để tìm ra các mảnh ghép nào. Sau khi lướt một vòng các report thì mình thấy có cái này
Như trên ảnh thì con bot này sẽ đi vào cái target trong report, nếu không được thì nó sẽ báo lại qua note, cũng hợp lý với cái đề bài này rồi. Giờ thì mình sẽ tạo một report để thử thôi
Khi submit một report có target về http://localhost
hay 127.0.0.1
thì sẽ có thông báo như này. Nhưng đâu chỉ có 2 địa chỉ này là đại diện cho localhost
đâu đúng không, còn nhiều địa chỉ khác mà. Mình sẽ thử địa chỉ http://127.0.1:1337/backup
](http://127.0.1:1337/backup) vì nó cũng tương tự như localhost thì web đã chấp nhận. Các bạn có thể tìm thêm một số địa chỉ ở đây hoặc bạn nào muốn vui vui hơn chút thì tạo một server redirect về localhost (cái này mình chưa thử nhưng sau writeup này mình sẽ thử :v)
Sau khi submit xong thì sẽ ngồi đợi con bot đến thăm và lấy flag thôi. Để ý lại thì thấy conbot này sẽ đi 3 phút một lần nên là các bạn cứ đợi nó thôi.
Cái lỗi SSRF này thì được nằm 1 mâm top 10 luôn trên TOP 10 OWASP 2021 là cũng đủ để hiểu nó dư lào rồi :v
Chall4: K02FE Flag 4
Như đề bài thì nó nằm trong database. Vậy thì chức năng nào lưu dữ liệu trực tiếp vào database??? Mình sẽ liệt kê mấy chức năng mà mình đã tìm thấy ở đây:
Register/Login ⇒ Đã thử nhưng không thành công
Tạo report
Note
Sương sương thì cũng chỉ có như này, giờ mình đi tạo cái report nữa để test thôi
Chức năng tạo report
Thử với dấu nháy đơn thì chưa được này, giờ sang dấu nháy kép
Cũng không thấy có error message gì luôn. Đến đây thì chưa thể chắc chắn là nó không có lỗi SQLi nhưng mà mình sẽ chuyển hướng sang note vì đang bế tắc ở chức năng này mà
Chức năng note
Với chức năng này thì sau khi staff thực hiện triage 1 report mới có thể note nhé.
Khi mình thử với dấu nháy đơn thì bùmm
Nó đã có lỗi và dựa vào error message này thì mình thấy được câu query và DBMS đang được sử dụng là SQLite3. Cái này nó khá giống với các bài SQLi cũng trên Cookie Arena luôn
Nếu bạn nào chưa làm thì có thể làm mấy bài này trước để thử.
Với câu query mình nhận được như này:
INSERT INTO `note` VALUES (NULL, 23, 4, '<cai_minh_inject>', CURRENT_TIMESTAMP);
Vậy thì mình sẽ tạo ra một câu query để nó kèm thêm cả cái nội dung mình muốn nữa bằng cách nối chuỗi trong SQLite đó là sử dụng ||
vậy giờ mình inject 1 cái như này:
'||(SELECT 'BC_abcabcxyzxyz')||'
Thì khi nó vào xử lý, câu query ở server sẽ trở thành
INSERT INTO `note` VALUES (NULL, 23, 4, ''||(SELECT 'BC_abcabcxyzxyz')||'', CURRENT_TIMESTAMP);
Nó sẽ nối 1 chuỗi rỗng với kết quả câu SELECT
rồi sẽ nối tiếp với một chuỗi rỗng nữa
Đây là request mình gửi
Và sau khi xử lý nó sẽ được xuất hiện ra thành
Giờ là lấy luôn kết cấu của database cho nhanh nhỉ, mình sẽ dùng
'||(SELECT group_concat(sql) FROM sqlite_schema)||'
Thì nó sẽ ra toàn câu lệnh để tạo các bảng trong database đang được sử dụng
Giờ thì tìm cột và bảng nào chứa flag mà lấy thôi
Chall5: K02 Start Me Now
Để ý thì thấy lần này đã được hint hết chỗ gây ra lỗi rồi nên nó đã bớt vui đi một chút :v Nhưng không sao, vẫn vui. Giờ thì vào xem chức năng export này nào
Ví dụ mình export một target có title là “1” thì sẽ được export ra 2 file
File .txt
sẽ chứa nội dung của cả cái report đó
File .pdf
thì không tồn tại :v Đến đây dù biết là CMDi nhưng mình vẫn chưa hình dung ra được cách xử lý trên server là gì. Giờ sẽ phải đi tìm cách ký tự bị filter đi mất. Thế thì mình sẽ submit một report có title là các ký tự có thể in ra như này để xem cái nào sẽ bị mất
Sau khi export ra thì
Như vậy là file .txt
sẽ chỉ chấp nhận các ký tự 0-9a-z, còn .pdf
sẽ chấp nhận hết. Giờ thì mình thử payload này, đây là Command Substitution mà mình đã giới thiệu ở writeup trước đây:
`ls -la /`
Như vậy thì dấu space đã bị thay thành dấu -
. Trong linux có nhiều ký tự thay thế dấu space này mà. Ví dụ như %09
(tab) chẳng hạn. Nhưng khi đổi space thành %09
thì
Mình đoán là nó đã bị encode đi lần nữa rồi vào Burp Suite thì thấy rõ luôn
Giờ mình sẽ gửi request bằng Burp Suite luôn để cho nó đỡ bị encode
Thành công thì là đã không bị encode nhưng nó không hiện gì, thì có thể là out-of-band. Lúc này để confirm nó là OOB không thì mình sẽ curl đến host của mình:
Sau khi export thì nó đã có những cú request :v
Vậy giờ có thể dùng OOB này để thực hiện rồi. Với curl
thì các bạn có thể tham khảo options -d
và -F
để gửi file ra bên ngoài, còn wget
thì có thể tham khảo --post-file
. Vì mình vẫn chưa hiểu nghiệp vụ của chức năng này lên sẽ đi tìm source để đọc để hiểu hơn. Trong file run.py
trên server, thì chỗ này chính là chỗ gây ra lỗi CMDi này
Vậy là đã hiểu, cách untrusted data đi vào và nó rơi vào sink nào và tiếp tục nó được xử lý như nào. Khi bạn khai thác xong thì có thể dựa vào lỗi này để lấy source code về nghiên cứu sâu hơn :v
Tổng kết
Vậy là đã hêt 5 challenge của bài thì này, giờ mình xin tổng kết các lỗi của bài này là:
IDOR
Identification and Authentication Failures
SSRF
SQL Injection
Command Injection
Với mỗi lỗi thì ảnh hưởng của nó sẽ còn khủng khiếp hơn nhiều so với việc chỉ dùng để lấy flag :v Nếu bạn nào chưa hiểu về phần nào thì có thể cố gắng làm Command Injection rồi lấy source về nghiên cứu đó cũng là một cách học hay 😂 Đùa thôi, nếu ai mà đọc source vẫn chưa hiểu thì có thể comment xuống phần dưới để mình hoặc các anh mình có thể giải đáp giúp các bạn. Trải qua 5 lỗi trong bài writeup này, hi vọng mọi người có thể hiểu hơn hoặc có thể là khai phá được kiến thức gì đó. Và cũng hi vọng Cookie Hân Hoan có nhiều lớp hơn cũng đồng nghĩa với việc là sẽ có nhiều bài tốt nghiệp như này hơn nữa 😎 để giúp cho mọi người phần nào đó ôn lại kiến thức cũng như là học hỏi được điều gì đó qua những bài như này (với cá nhân mình thì vẫn mong có nhiều bài XSS hơn vì mình gà XSS vcl). Cảm ơn mọi người đã đọc đến đây, nếu có phần gì chưa hiểu, góp ý hay bất kỳ thắc mắc nào thì có thể comment xuống dưới nhé để mình có thể cải thiện trong những lần viết sau. Tạm biệt và hẹn gặp lại trong những bài sau!
Subscribe to my newsletter
Read articles from Nguyễn Đức Tùng directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
