CyberJutsu - Day 1 - PHP TYPE JUGGLING

 Hello mọi người, hôm nay mình lướt facebook thì bắt gặp một thử thách nho nhỏ liên quan đến CTF do CyberJutsu ra đề. và nay mình sẽ chỉ cho các bạn các mình đã giải nó nha

Đầu tiên chúng ta có một cái web khá là đơn giản như này: 



Và rõ ràng ta thấy được ràng, tiêu đề challenge là PHP TYPE JUGGLING. Vậy chắc chắn là web này sẽ bị dính lỗi liên quan đến cái này, và nhấn vào source để bắt đầu phân tích code nha


Ở đây ta sẽ thấy có hàm eval, và hàm eval có tác dụng thực thi lệnh, và ta sẽ xem bộ phận để thực hiện eval có gì bất thường không nha

Ok, vậy làm sao để chúng ta có thể truy cập được tới eval(), chúng ta chỉ có cách đi qua đoạn code này toàn là if. Và điều kiện tiên quyết để hàm eval thực thi thành công là điều kiện if phải trả vể True

Và trước khi chúng ta kiểm tra cái này thì chúng ta cần phải biết đến khái niệm in_array() là gì? Thì bản chất in_array sẽ kiểm tra xem 1 giá trị có tồn tại trong một array hay không, nếu có thì trả về True, ngược lại thì False. Và ở đây ta có ba điều kiện if, và ta phải tìm cách bypass để cho nó trả về True

Nếu bạn nào chưa biết về PHP TYPE JUGGLING thì có thể đọc bài viết về nó ở đây nha. 

Bây giờ ta sẽ tìm cách để bypass từng cái if một
  • Để in_array(param1, ..) trả về True: 1 + "**string bất kì"
  • Để in_array(param2, ...) trả vể True: tương tự như trên
  • Để if cuối cùng trả về True: thay bằng dấu nhân chia công trừ => True
Trong PHP chúng ta có hàm system(command), câu lệnh cho phép chúng ta thực thi lệnh như ở trên Linux, đồng thời ta đã biết cách để bypass những điều kiện thành True; ta có payload: p1=1%2bsystem("ls%20-l%20/");6&p2=7&op=*

Và ta dễ dàng thấy có một file là DAY_LA_CAI_FLAG_CHUC_MUNG_BAN. Ta chỉ cần thay lệnh trong system => suy ra flag:



Cảm ơn các bạn đã xem bài viết, nếu như có thiếu sót gì mong mọi người hãy góp ý để cho bài viết ngày càng hoàn thiện hơn!!!!

Nhận xét

Đăng nhận xét

Bài đăng phổ biến