TetCTF

**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.

Để 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à

Mình sẽ chỉ còn 19 ký tự để gen ra một câu lệnh đọc file nên mình phải tìm câu lệnh nào ngắn nhất, xor ít tốn ký tự nhất, sau một hồi tìm thì mình nhận thấy ”nl *” là khả thi nhất nên mình sẽ đi theo hướng đó.

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`

Bất ngờ chưa mình có tên một column còn lại, mình vẫn chưa hiểu tại sao lại có thể extract kiểu này, thôi kệ cơ mà có column name rồi thì blind lấy flag thôi

Chờ script chạy xong ta sẽ get được flag, bài này khó ở chỗ how to get column name

Last updated