[Web]RaRCTF 2021
Last updated
Was this helpful?
Last updated
Was this helpful?
Bài này ta nhận được 1 source code và 1 file solver.py
.
Workflow của bài này như sau:
Điền form gồm title
và link
rồi submit.
Sau submit là một trang có 1 button được tạo bởi title
và link
phía trên.
Report trang này đến admin bot
để lấy flag.
Trước khi report thì phải thực thị proof of work (file solver.py
làm giúp mình việc này)
Admin bot
thực hiện gán flag vào localStorage
click button.
Việc cần làm:
POW.
Gửi trang button bị chèn XSS đến /admin
.
Check webhook nhận flag.
Script exploit:
FLAG: rarctf{th0s3_f4ncy_butt0n5_w3r3_t00_cl1ck4bl3_f0r_u5_a4667cb69f}
Tổng quan bài này là sẽ có một box cho mình nhập nội dung và nội dung này sẽ được ghi vào 1 file ảnh.
Mình có thể kiểm soát nội dung nhập vào để khai thác command injection
.
Có thể sử dụng `ls`
hoặc ${ls}
để list files thành công như vậy mình có thể cat
thoải mái.
Nhưng bài này từ chối nội dung in ra có chứ rarctf
.
Vậy mình chỉ cần repace rarctf
của flag thôi, và payload cuối cùng:
PAYLOAD: sed 's/rarctf/hello/g' /flag.txt
Ơ kìa =)))))))))))))))) Lúc mình làm thì cái leemon tree nó bị lỗi không hiện ra đâu, nhưng cuối giờ admin fix lại nên bài này thêm một bước nữa là phải lấy từng đoạn của flag.
Hoặc là in từng ký tự của flag. Hoặc là replace những ký tự biết rồi bằng rỗng cho đến hết.
Chọn cách 2: sed 's/rarctf{b451c-c0mm4nd//g' /flag.txt
FLAG: rarctf{b451c-c0mm4nd_1nj3ct10n_f0r-y0u_4nd_y0ur-l3m0nth1nk3rs_d8d21128bf}
Tóm tắt workflow:
Upload file
Có dấu .
trong tên file 403
Lưu tên file vào database và lưu file vào folder uploads/
Redirect sang /file/<id>
Query tên file theo id
từ database
Ghép uploads/
và tên file lại với nhau bằng hàm os.path.join
Đọc file này
Có một điều đặc biệt là os.path.join
sẽ bỏ qua các giá trị phía trước nếu giá trị cuối cùng mình cung cấp là một hard link
, ex:
Như vậy khi gửi đi bắt gói tin lại và sửa tên file là /flag
sẽ thành công có flag.
FLAG: rarctf{4lw4y5_r34d_th3_d0c5_pr0p3rly!-71ed16}
Bài này có một source code combo gồm 3 bài. Tóm tắt source của part này là một công cụ Claculator
kiềm tra chẵn lẽ, cộng trừ nhân chia. Nhưng không kiểm tra dữ liệu đầu vào, lại còn eval result và kiểm tra type của eval.
Ta sẽ focus vào phép cộng vì có thể truyền vào 2 chuỗi và phép cộng lúc này lại thành cộng chuỗi. Sau đó kết quả chuỗi được đưa vào eval()
. Chỉ gặp khó 1 chút là kiểm tra type của eval result phải là số:
Giải quyết khó khăn này cũng đơn giản, chỉ sử dụng thêm toán tử điều kiện.
PAYLOAD: 1 if __import__('os').popen('cat /flag.txt').read()[0]=='r' else 'wrongcharacter'
Vậy viết 1 đoạn script để get flag:
FLAG: rarctf{0v3rk1ll_4s_4_s3rv1c3_3fca0faa}
Source của part này là Notes
. Tóm tắt workflow trọng tâm như sau:
Register 1 username
.
Sau khi vào /profile
thì sẽ có những action để làm như addbio
, getbio
,...
Tại /profile
sẽ render bio content, và các data mình add vào (ở challenge này mình bỏ qua).
Mình sẽ focus vào render bio, Lúc lướt sơ qua thấy bio được filter khá kỹ không có cơ hội SSTI. Nhưng sau 7749 lần lướt tới lướt lui mình mới để ý được cái filter này lừa lắm bà con =)))
Sự thật replace()
trên không hề được replace vì biến bio
không hứng kết quả trà về (nói văn vẻ là bio
chỉ đóng vai trò tham chiếu chứ không phải tham trị). Như vậy chỉ cần chèn payload và bio
PAYLOAD: {{config.__class__.__init__.__globals__['os'].popen('cat /flag.txt').read()}}
FLAG: rarctf{wh4t_w4s_1_th1nk1ng..._60a4ee96}
Source code của part này sẽ xoay quanh manager
, mình lướt sơ về luồng của bài này:
Nhập username
và password
để đăng nhập.
Nếu username
là admin thì sẽ có được flag.
Sau khi đăng nhập thì sẽ có chức năng đổi password với 2 params là id
và password
.
Bài này có tí đặc biệt đó là phần server xử lý đổi password sẽ được build bằng GO.
Mục tiêu là sẽ đổi password của admin, để làm được việc này cần bypass được schema.
Bài này căng não, mình suy nghĩ đủ đường để thay đổi json gửi đi =))) lúc đấy không biết do cả ngày dive in ctf hay sao mà việc add thêm key id vào json mà mình cũng suy nghĩ làm như thế nào :v Đi nói chuyện với n3mo hỏi vài ba câu thì mới nhớ ra =)))) ôi trời
Python làm việc vói json thì khi có key trùng nhau thì khi đọc sẽ đọc lấy value cuối cùng. Thế mà Golang lại làm ngược lại, các key trùng nhau sẽ lấy value đầu tiên.
PAYLOAD: {"id":0, "id":1, "password":"0123456789"}
Với json trên sẽ thỏa schema của server, đồng thời lợi dụng sự bất đồng bộ của py và go.
FLAG: rarctf{rfc8259_15_4_b1t_v4gu3_1a97a3d3}
Bài này là phiên bản fixed của MAAS3
, điểm fixed của bài này là 2 lớp validate schema ở sever:
Điều bất ngờ ở đây là mặc dù thêm 1 lớp schema validation nhưng hoàn toàn không effect gì đến payload bài trước =))) Như vậy mình nghĩ rằng đây là exception solution.
Sử dụng lại phương thức exploit của bài trước.
PAYLOAD: {"id":0, "id":1, "password":"0123456789"}
FLAG: rarctf{k33p_n3tw0rks_1s0l4t3d_lol_ef2b8ddc}