Web - Ping 0x01 & Ping 0x02 (OS Command Injection)

Hello các bạn, chào mừng các bạn đến bài writeup Ping 0x01 và Ping 0x02 của mình. Hai lab này khá là cơ bản nhưng cũng khá là tricky để tìm ra cách tìm flag. Trước khi xem cả bài viết, mình sẽ gợi ý một vài thứ. Mong các bạn sẽ tìm ra flag.

Đây là một vài gợi ý của mình:

  • Xem PHP source code của app để hiểu về cách filter của từng lab.

  • Ping 0x01 source code:

  • Ping 0x02 source code:

  • Nếu hầu hết các kí tự đều bị filter, có kí tự nào mà chưa bị filter ra không?

  • Nếu dùng cách xuống hàng (new line) thì còn bị filter không?

Chúng ta bắt đầu nào!!! Cả hai lab khá giống nhau, Ping 0x02 có thêm một số điều kiện khi filter nên là mình sẽ giải quyết lab Ping 0x01 truớc, sau đó mình tin các bạn sẽ tìm ra đáp án của lab 2.

Ping 0x01

Như đã thấy ở source code ở trên, chúng ta không thể nào dùng các kí tự cơ bản của OS Command Injection. Nếu sử dụng, các kí tự đó sẽ chuyển thành blankspace. Mình dùng BurpSuite để dễ dàng thực hiện attack.

Chúng ta sẽ dùng newline trong BurpSuite để kiểm tra. Các bạn chỉ cần ấn “Enter” xuống dòng để nhập command khác vào. Có vẻ như chúng ta đã tìm ra lỗ hỏng rồi. Kakakaka!

Đã đến lúc tìm ra flag rồi. Thay vì whoami, chúng ta sẽ dùng cat ../flag.txt để tìm flag.

Yeahhh! Cùng nhau đến Ping 0x02 nào

Ping 0x02 thật sự là có hơi thử thách hơn vì có nhiều điệu kiện đuợc thêm vào filter.

  • Wildcard (*) đã bị cấm sử dụng
  • Blankspace (space) cũng bị luợt đi
  • Từ flag cũng bị luợt đi. Mệt mỏi đây!!!

Cũng như Ping 0x01, vì chúng ta đã biết đuợc sourcecode, mình sẽ đi thằng đến vấn đề. Mình sẽ dùng newline, như cách mà chúng ta giải Ping 0x01 để giải Ping 0x02.

Bây giờ mới là sự khác biệt, chúng ta không thể dùng cách như trên để tìm flag bởi vì bộ lọc đã đuợc thay đổi. Chữ ‘flag’ của tôi mất tiêu rồi. Bớ làng nuớc ơi!

Trong Linux có các cách để chúng ta đọc file mà không cần phải viết ra tên hoàn chỉnh. Tuy nhiên mình chỉ cung cấp cho các bạn cách mình hay dùng nhất.

  • Dùng '. cat fl''ag hoặc fla''g.txt. Kết quả là cat flag.txt

Đến đây, chỉ còn một buớc nữa thôi là chúng ta có thể tìm flag. Chúng ta phải tìm cách bypass blankspace. Đó chính là dùng kí tự <. Mình dùng PayloadsAllTheThings: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Command%20Injection/README.md.

Mình dùng hai dấu single quote fl''ag

Và thế là chúng ta đã tìm đuợc flag cho 2 lab Ping 0x01 và Ping 0x02. Nếu có cách nào khác, các bạn vui lòng góp ý thêm để mình cũng nhau học hỏi nhé. Thank you!