Nhóm Wanna.One chia sẻ một số Challenges giải được và việc chia sẻ writeup nhằm mục đích giao lưu học thuật. Mọi đóng-góp ý-kiến bọn mình luôn-luôn tiếp nhận qua mail: wannaone.uit@gmail.com
Tác giả: n3mo
#HPNY
Bài này cung cấp source code, ta thấy eval ở đây, tức là bài này sẽ hướng về bypass blacklist.
Ta thấy ở hàm preg_match chỉ cho phép a-z()_. , ta có thể gọi phpinfo như sau:
Để bypass khi server tự động thêm () phía sau input của mình thì ta chỉ cần gọi hàm như sau là sẽ bypass qua đoạn này
A().b
Phía server sẽ thực thi hàm a() và hàm b() sau đó nối 2 kết quả lại với nhau thông qua toán tử “.”
Ta có thể dễ dàng chạy lệnh ls nhưng vì preg_match không chứa space nên ta không thể thực hiện lệnh cat
Sau một lúc loai hoay mình nhớ ra hàm get_defined_vars()
Vậy ta đã có get và post ở đây, idea tiếp theo của mình là chuyển payload ra một get or post khác
Ta làm như sau, sử dụng next() để access vào array.
Thay thế var_dump bằng system thì ta có thể thoải mái rce
Cần trôn u để đọc flag
#super calc
Vẫn format cũ nhưng lần này là 2 eval lồng nhau, và chỉ được phép sử dụng số với các toán tử, ta để ý thấy được phép sử dụng “^” nên nghĩ ngay tới hướng xor, nhưng ở bài này mình stuck khá lâu cho tới khi có a cho mình cách xor đúng.
Kết hợp các ký tự được phép để xor lại với nhau ta có được các chữ cái
Mình thử xor ra hàm system và kết quả như sau
Nhưng vì payload này khá dài nên mình sẽ phải tối ưu cách gen của mình.
Payload cuối cùng là
Rất ngắn :v
Hướng 2:
Vì 2 eval lồng nhau nên mình có thể sử dụng blacktic ở đây.
Xor ra blacktic khá khó nên mình cần sử dụng 3 ký tự
Có blacktic thì chạy trực tiếp os command luôn
Sử dụng nl * đã gen trước đó
Ta có payload chỉ dài 45 ký tự nên dù a tsu có giảm số ký tự xuống 50 ta vẫn có thể làm được
#SQLLIMIT
Bài này mình làm được nhờ may mắn, mình vẫn chưa hiểu tại sao mình làm được nhưng mà thôi kệ, chờ wu của các pờ rồ khác,
Đầu tiên mình nhận thấy select không bị lọc, tuy lọc substr nhưng vẫn chừa ascii và left right.
Nên hướng đi của mình là blind
`payload="2|(ascii(right(left((select database()),{}),1))in({}))"`
Payload của mình như sau để extract daabasename()
Bước tiếp theo mình tính select table name nhưng mà ngẫm lại table name được show sẵn trong source nên mình chỉ cần extract column name nữa thôi
Nhưng tất cả các cách extract column dựa vào table name đều bị lọc
Quay trở lại fuzz số column name thì mình được lỗi như sau
Wao we have column name here, sau đó mình extract column này thì nhận ra đây là column được show sẵn nên không có tí giá trị gì.
Tiếp theo mình vẫn fuzz theo hướng này
`1 group by id`
Mình vẫn nhận được kết quả như vậy, hmm, tiếp theo mình mạnh dạn thử hẳn
`group by t_fl4g_name_su`
Chờ script chạy xong ta sẽ get được flag, bài này khó ở chỗ how to get column name.
Nhóm tụi mình giải được có 3 bài web thôi :( Hẹn các bạn giải khác nhé :D