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 username và pwd, 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 username và pwd 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 username và pwd, 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à
và hệ thống sẽ trả về flag tương ứng.