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:
<body><style>input[type=text] {width:40%;padding:12px 20px;margin:8px 0;box-sizing:border-box;border:2px solid red;background-color:#ebfff8;border-radius:4px;}button[type=submit] {width:10%;background-color:#F94848;color:white;padding:14px 20px;margin:8px 0;border:none;border-radius:4px;cursor:pointer;}button[type=submit]:hover {background-color:#45a049;}body {background-image:url("money.jpg");}</style><?phpclass Object { var $jackpot; var $enter; }?><?phpinclude('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><fontcolor='white'>CONGRATULATION! You Won JACKPOT PriZe !!! </font></strong></center>". "<br><center><strong><fontcolor='white'size='20'>".$obj->jackpot."</font></strong></center>"; echo "<br><center><strong><fontcolor='green'size='25'>".$flag."</font></strong></center><br>"; echo "<center><imgsrc='http://www.relatably.com/m/img/cross-memes/5378589.jpg' /></center>"; } else { echo "<br><br><center><strong><fontcolor='white'>Wrong! True Six Numbers Are: </font></strong></center>". "<br><center><strong><fontcolor='white'size='25'>".$obj->jackpot."</font></strong></center><br>"; } } else { echo "<center><strong><fontcolor='white'>- Something wrong, do not hack us please! -</font></strong></center>"; }}else{ echo "";}?><center><br><h2><fontcolor='yellow'size=8>-- TSU</font><fontcolor='red'size=8>LOTT --</font></h2><p><p><fontcolor='white'>Input your code to win jackpot!</font><p><form> <inputtype="text"name="input" /><p><p> <buttontype="submit"name="btn-submit"value="go">send</button></form></center><?phpif (isset($_GET['gen_code']) && !empty($_GET['gen_code'])){ $temp = new Object; $temp->enter=$_GET['gen_code']; $code=base64_encode(serialize($temp)); echo '<center><fontcolor=\'white\'>Here is your code, please use it to Lott: <strong>'.$code.'</strong></font></center>';}?><center><fontcolor='white'>-----------------------------------------------------------------------------------------------------------------------------</font><h3><fontcolor='white'>Take code</font></h3><p><p><fontcolor='white'>Pick your six numbers (Ex: 15 02 94 11 88 76)</font><p><form> <inputtype="text"name="gen_code"maxlength="17" /><p><p> <buttontype="submit"name="btn-submit"value="go">send</button></form></center><!-- debug: GET is_debug=1 --><?phpif(isset($_GET['is_debug']) && $_GET['is_debug']==='1'){ show_source(__FILE__);}?></body>
Chúng ta sẽ chú ý tới hai đoạn code PHP như sau:
<?phpclassObject{ var $jackpot;var $enter; }?><?phpinclude('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.