Bỏ qua

Apriti sesamo

Introduction

PicoCTF 2025

Category: Web Exploitation

Write-up date: 19/03/2025

Question: I found a web app that claims to be impossible to hack! Try it here!

Hint 1: Backup files

Hint 2: Rumor has it, the lead developer is a militant emacs user

Point: Medium

Vulnerability

Recon

Dựa vào hint của đề bài, ta biết được rằng emacs backup bằng cách thêm giấu ngã vào cuối file, từ đó khi vào trang login, ta hoàn toàn có thể vào http://verbal-sleep.picoctf.net:50765/impossibleLogin.php~ để lấy được source code của php

Source code analytics

<?php
if (isset($_POST[base64_decode("\144\130\x4e\154\x63\155\x35\x68\142\127\125\x3d")]) && isset($_POST[base64_decode("\143\x48\x64\x6b")])) {
    $yuf85e0677 = $_POST[base64_decode("\144\x58\x4e\154\x63\x6d\65\150\x62\127\x55\75")];
    $rs35c246d5 = $_POST[base64_decode("\143\x48\144\153")];
    if ($yuf85e0677 == $rs35c246d5) {
        echo base64_decode("\x50\x47\112\x79\x4c\172\x35\x47\x59\127\154\163\132\127\x51\x68\111\x45\x35\166\x49\x47\132\163\131\127\x63\x67\x5a\155\71\171\111\x48\x6c\166\x64\x51\x3d\x3d");
    } else {
        if (sha1($yuf85e0677) === sha1($rs35c246d5)) {
            echo file_get_contents(base64_decode("\x4c\151\64\166\x5a\x6d\x78\x68\x5a\x79\65\60\145\110\x51\75"));
        } else {
            echo base64_decode("\x50\107\112\171\x4c\x7a\65\107\x59\x57\154\x73\x5a\127\x51\x68\x49\105\x35\x76\111\x47\132\x73\131\127\x63\x67\x5a\155\71\x79\x49\110\154\x76\x64\x51\x3d\75");
        }
    }
} ?>

Code trên đã bị obfuscated, nhưng dựa vào giao diện cũng như cách login của web ta hoàn toàn có thể đoán được là web đang lấy giá trị từ hai param usernamepwd, rồi đem chúng so sánh với nhau, nếu so sánh không bằng nhau đúng thì tiếp tục sánh hai mã sha1 với nhau và cuối cùng nếu hai mã sha1 của usernamepwd bằng nhau thì trả về file flag.

Nhưng nếu như đọc kĩ hơn nữa thì ta phát hiện trong lúc so sánh usernamepwd, không kiểm tra đầu vào của hai hàm sha1 dẫn đến khi người dùng gửi một mảng vào thì câu lệnh sha1 sẽ bị crash và trả về giá trị null, từ đó hai xâu so sánh bằng nhau và trả về giá trị là true.

Exploit

Tư những kết luận trên, ta hoàn toàn có thể gửi lệnh post tới imposible_login.php với lệnh body là

username[]=1&pwd[]=2

và hệ thống sẽ trả về flag tương ứng.