Sabtu, 04 September 2010

SQL Injection

Apa itu SQL injection?
SQL injection adalah kegiatan menyisipkan perintah SQL kepada suatu statement SQL yang ada pada aplikasi yang sedang berjalan. Terjadinya SQL injection terlebih dikarenakan security atau keamanan pada level aplikasi (dalam hal ini aplikasi web) masih kurang sempurna. Kurang sempurna bagaimana? Kurang sempurnanya adalah pada cara aplikasi meng-handle inputan yang boleh di proses ke dalam database. Misalnya pada suatu web yang terdapat fasilitas login, terdapat dua buah inputan pada umumnya, yaitu username dan password
Jika karakter yang masuk melalui dua buah inputan tersebut tidak difilter (disaring) dengan baik maka bisa menimbulkan efek SQL injection, ini dikarenakan biasanya inputan tersebut secara sistem akan menjadi bagian dari kriteria dari suatu perintah SQL di dalam aplikasi web-nya. Berbahaya sekali bukan?
Contoh SQL injection sederhana (Bypassing User Authentication System)
Sekarang kita akan membuat contoh mengenai kasus SQL injection yang sampai saat ini dan detik ini juga masih sering kita jumpai pada situs-situs di internet. Salah satu penyalahgunaan bug SQL injection adalah digunakan untuk mem-bypass sistem login pada suatu situs. Contoh kali ini akan kita rancang sendiri sedemikian rupa mulai dari merancang database, membuat script sampai melakukan SQL injection terhadap script yang kita buat tersebut. Kita akan menggunakan MS SQL Server sebagai databasenya, ASP sebagai scripting languange nya dan sembarang HTML editor untuk membuat layar loginnya (penulis disini menggunakan MS FrontPage). Penulis asumsikan Anda menggunakan MS IIS sebagai web server. Siapkan MS IIS Anda dan juga MS SQL Server 2000 Anda.
Pertama-tama kita akan buat dahulu databasenya. Siapkan database dengan nama sqlinject dan buat tabel di dalamnya dengan nama tbUser. Berikut ini adalah struktur dari tabel tbUser melalui perintah SQL CREATE TABLE.
create table tbUser
(username varchar(50),
password varchar(50)
)
Isikan data ke dalam tabel tersebut dengan mengetikkan perintah SQL seperti berikut ini.
insert into tbUser values
('sql','inject')
Sekarang kita sudah mempunyai sebuah database yang bernama 'sqlinject', sebuah tabel yang bernama 'tbUser' dan tabel tersebut sudah diisi dengan satu buah row data. Sekarang kita akan buat sebuah halaman login yang digunakan sebagai interface web-nya. Penulis beri nama filenya yaitu login.asp. Bentuk tampilan dari layar login ini bisa Anda lihat seperti berikut ini.
Setelah itu kita buat script untuk memproses login ini, penulis beri nama login_process.asp. Code pada file login_process.asp adalah sebagai berikut. Untuk koneksi ke database (SQL Server) penulis menggunakan metode SQL Authentication, server pada localhost, username 'sa' dan password 'rahasia'.
<% option explicit %>
<%
dim connstring,conn,recset
connstring = "Provider=SQLOLEDB.1; Password=rahasia; Persist Security Info=True; User ID=sa; Initial Catalog=sqlinject; Data Source=localhost"
set conn = server.createobject("adodb.connection")
set recset = server.createobject("adodb.recordset")
conn.open connstring
recset.open "select * from tbUser where username = '" & request.form("username") & "' and password = '" & request.form("password") & "'",conn,3,2
if not recset.eof then
response.write recset.recordcount
session("username") = request.form("username")
response.redirect "secured_page.asp"
else
response.redirect "login.asp"
end if
%>
Kita lihat pada code diatas terdapat operasi SELECT ke SQL yang mencari username dan password dari tabel tbUser. Jika username dan password yang dimasukkan benar maka akan masuk ke halaman secured_page.asp (ada pada bagian akhir dari tulisan ini). Maksud dari halaman secured_page.asp ini adalah bahwa halaman tersebut hanya bisa diakses jika Anda mengisikan username dan password dengan benar. Anda tidak bisa mengetikkan URL halaman tersebut secara langsung. Gambar contoh halaman secured_page.asp bisa Anda lihat berikut ini.
Pada halaman secured_page.asp di atas terdapat sebuah link logout yang mengarah pada dokumen logout.asp. Ini digunakan untuk melakukan sign-out atau log-out dari halaman secured_page.asp dan menuju ke halaman login.asp kembali. Code dari dokumen logout.asp adalah sebagai berikut.
<%
session.abandon
response.redirect "login.asp"
%>
Sekarang semua file sudah kita buat. Letakkan semua file tadi (login.asp, login_process.asp, secured_page.asp, logout.asp) dalam satu folder dan jadikan sebagai home directory pada MS IIS (web server) Anda. Hasilnya bisa Anda test dengan mengetikkan URL yang mengarah pada web Anda tadi misalnya http://localhost/login.asp.
Sekarang saatnya penulis akan menyajikan contoh SQL injection untuk mem-bypass login. Tampilkan URL yang berisi login.asp tadi (misalnya http://localhost/login.asp). Sekarang coba masukkan username 'a' dan password 'a', program akan kembali lagi ke halaman login.asp karena username dan password tersebut salah. Sekarang coba sekali lagi, kali ini username 'sql' dan password 'inject'. Karena username dan password benar maka Anda akan diarahkan ke halaman secured_page.asp. Anda bisa klik link logout jika ingin logout. Aktivitas tersebut adalah aktivitas normal pada suatu sistem pada login. Bagaimanakah cara tidak normalnya? Kita memeriksa apakah login tersebut bisa di bypass atau tidak dengan cara memberikan inputan tanda ' (single quote) pada bagian inputan username dan masukkan sembarang string pada bagian password. Jika Anda tekan tombol submit maka akan muncul error seperti berikut ini.
Error Type:
Microsoft OLE DB Provider for SQL Server (0x80040E14)
Line 1: Incorrect syntax near 'aku'.
/login_process.asp, line 8
Error di atas merupakan error dari database SQL Server yang sebenarnya menyatakan ada kesalahan pada statement SQL (akibat kita masukkan karakter ' tadi). OK sekarang kita akan mulai bagian yang lebih seru, kembalikan lagi ke halaman login.asp. Coba masukkan string 'or 1=1 -- pada bagian username dan masukkan sembarang string pada bagian password. Apa yang terjadi? Anda akan langsung dibawa ke halaman secured_page.asp tanpa harus mengetahui username dan password yang benar sama sekali. Kenapa hal itu bisa terjadi? Mari kita pelajari pelan-pelan konsepnya berikut ini.
Penyebab utama kejadian di atas adalah karena karakter ' (single quote) yang kita inputkan pada bagian username. Karakter ' (single quote) merupakan karakter pemutus dari statement SQL dan dari sini bisa kita kembangkan untuk membelokkan statement SQL asli menjadi statement SQL sesuai keinginan kita. Mari kita lihat kembali kejadiannya. Misalnya kita masukkan string 'user' dan password 'pass' maka statement SQL yang terjadi adalah sebagai berikut.
select * from tbUser where username = 'user' and password = 'pass'
Jalankan pada MS Query Analyzer maka hasilnya akan menjadi suatu zero recordset dan tidak error.
Sekarang misalnya kita memasukkan karakter ' pada username dan string 'aku' pada bagian password maka statement SQL pada database akan menjadi seperti berikut ini.
select * from tbUser where username = ''' and password = 'aku'
Coba jalankan pada MS Query Analyzer dan akan muncul error seperti berikut ini.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'aku'.
Server: Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string '
'.
Kita lihat error yang pertama persis sama pesannya seperti yg terjadi pada web tadi. Itu terjadi karena Anda melakukan pemotongan statement SQL dengan karakter ' dan belum Anda selesaikan. Efek dari pemotongan ini akhirnya Anda bisa menambahkan statement SQL Anda sendiri setelah karakter ' tadi. Sekarang kita selesaikan pemotongan statement SQL tadi dengan menambahkan string or 1=1 -- setelah karakter ' tadi (jadi pada bagian username Anda ketikkan ' or 1=1 --) sehingga sekarang statement SQL nya akan menjadi seperti berikut ini.
select * from tbUser where username = '' or 1=1 --' and password = 'aku'
Coba Anda jalankan pada MS Query Analyzer. Hasilnya adalah menimbulkan suatu record set yang menampilkan semua data pada tabel tbUser tersebut. Kita lihat lagi pada statement di atas. Karakter -- adalah karakter untuk menandakan bahwa string setelah tanda -- akan di ignore atau dianggap sebagai remark pada suatu statement SQL. Jadi sebenarnya pada statement di atas yang dijalankan adalah sebagai berikut.
select * from tbUser where username = '' or 1=1
Jadi perintah di atas akan men-select username yang berupa blank character dan kemudian di OR dengan suatu kondisi TRUE (dalam hal ini diwakili dengan 1=1). Kondisi apapun jika di OR dengan keadaan TRUE maka hasilnya akan selalu TRUE pula. Itulah inti dari kejadian di atas.
Menanggulangi SQL injection
Cara paling mudah untuk mencegah SQL injection adalah dengan selalu memeriksa setiap karakter inputan yang masuk ke dalam database melalui statement SQL. Misalnya pada kasus di atas kita harus mencegah karakter ' (single quote) untuk di proses ke dalam database atau kita bisa mengganti karakter ' (single quote) yang masuk dengan '' (dua kali single quote). Adapun contoh script login_process.asp yang sudah dimodifikasi agar mencegah SQL injection adalah sebagai berikut.
<% option explicit %>
<%
dim connstring,conn,recset
connstring = "Provider=SQLOLEDB.1; Password=rahasia; Persist Security Info=True; User ID=sa; Initial Catalog=sqlinject; Data Source=localhost"
set conn = server.createobject("adodb.connection")
set recset = server.createobject("adodb.recordset")
conn.open connstring
recset.open "select * from tbUser where username = '" & replace(request.form("username"),"'","''") & "' and password = '" & replace(request.form("password"),"'","''") & "'",conn,3,2
if not recset.eof then
response.write recset.recordcount
session("username") = request.form("username")
response.redirect "secured_page.asp"
else
response.redirect "login.asp"
end if
%>
Kita lihat pada code diatas maka pada inputan username dan password ada sedikit modifikasi dengan mengganti dari request.form("username") menjadi replace(request.form("username"),"'","''"), demikian juga untuk yang bagian password. Sebenarnya masih ada cara lainnya untuk mencegah misalnya dengan penggunaan stored procedure dan lain sebagainya. Hal tersebut akan disajikan pada kesempatan yang lain.

Sabtu, 04 September 2010 by Shinta Kirei Na · 0

Cara Membuat Wireless Security Dengan Packet Tracer

Keamanan merupakan factor terpenting pada jaringan Nirkabel karena Sinyal komunikasi pada jaringan system tersebut secara terbuka merambat melalui udara. Perusahaan dan individu yang menggunakan jaringan nirkabel harus menyadari persoalan yang mungkin dihadapi serta tindakan balasan yang dapat dipakai.
Wireless Security Merupakan suatu Pengamanan terhadap Ancaman pada jaringan nirkabel yang akan menggangu operasi jaringan



2.1 Alat yang dibutuhkan
Alat yang di butuhkan pada pembuatan packet tracer dengan menggunakan wireless adalah:
3 buah Server, yang masing-masing di beri nama server 0, server 1, dan server 2.
2 buah switch, dengan tipe jenis switch 2950-24
1 buah Router, dengan tipe jenis 2811
8 buah PC (personal computer)
3 buah wireless , dengan nama Linksys-WRT300N.
Kabel otomatis (connections Automatic)

by Shinta Kirei Na · 0

Rabu, 01 September 2010

Penyebab Error Dalam Pemrograman PHP

Ketika kita terutama seorang programmer membuat suatu program,,dan banyak menemukan beberapa error atau kesalahan script tentunya akan pusing 10 keliling (hmmm..kurus..kurus dah tuh...ahay)
nah berikut ini ada beberapa kesalahan atau error dalam pemrograman PHP beserta solusinya...
silahkan dibaca agan dan aganwati....cekidot (tapi awas kejedot...hahaha...)

1. Error :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in.
atau
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in

Penyebab:

Error di atas disebabkan ada query SQL yang salah. Bisa jadi karena sintaks perintah query SQL nya salah, misalnya kurang tanda petik untuk menyatakan string dll. Selain itu bisa juga terjadi karena nama field dan tabel yang salah penulisannya.

Solusi:

Coba cek kembali statement query SQL Anda. Pastikan tidak ada lagi kesalahan dalam penulisannya. Untuk proses debugging query SQL (mengetahui letak kesalahannya), Anda bisa menambahkan statement die(mysql_error()) pada perintah mysql_query() nya. Contoh:
$query = ".....";
mysql_query($query) or die(mysql_error());

2. Error:

Warning: session_start() [function.session-start]:
Cannot send session cookie - headers already sent by
(output started at ... ) in ... on line ...
atau
Warning: session_start() [function.session-start]:
Cannot send session cache limiter - headers already sent
(output started at ...) in ... on line ...

Penyebab:

Error di atas biasanya terjadi pada penggunaan session. Sewaktu memberikan perintah session_start(), terdapat baris perintah di atasnya yang menampilkan string atau kode html ke browser. Sebagai contoh, perhatikan script berikut ini:
echo "Hallo...";
session_start();
?>
atau


....

session_start();
?>
Bila kamu perhatikan script di atas, maka terdapat string yang di-echo-kan atau terdapat kode html yang diletakkan sebelum session_start(). Nah… inilah yang menyebabkan error. Selain contoh di atas, error juga bisa muncul dari script yang berbentuk seperti ini
include "header.php";
session_start();
?>
Meskipun sebelum session_start() tidak ada echo atau kode html, namun error akan tetap muncul apabila isi dari script header.php terdapat echo atau kode html juga, misalnya
header.php
echo "hallo";
?>

Solusi:
Pastikan sebelum perintah session_start() tidak terdapat perintah echo atau kode html apapun.

3. Error:

Warning: Cannot modify header information – headers already sent by
(output started at ...) in ...

Penyebab:
Peringatan di atas biasanya muncul ketika kamu melakukan redirecting menggunakan perintah
header("Location: ...");
Seharusnya, sebelum perintah header("Location: ...") tidak boleh ada string apapun yang ditampilkan di browser, meskipun itu kode HTML (sama seperti penyebab error di session_start() sebelumnya). Sebagai contoh perhatikan script berikut ini:
echo "

Hallo Apa kabar?

";
header("Location: test.php");
?>
Pada script di atas, sebelum perintah header() terdapat string yang ditampilkan ke browser. Inilah yang mengakibatkan muncul peringatan tsb. Lantas bagaimana dengan script berikut ini?
$a = 10;
if ($a < 0) echo "Nilai A negatif";
else header("Location: test.php");
?>
Kira-kira muncul Warning nya gak ya? Jika kamu coba, maka tidak muncul Warning nya meskipun sebelum header() terdapat string yang ditampilkan ke browser. Mengapa demikian? ya.. meskipun di situ terdapat perintah untuk menampilkan string ke browser, namun perintah tersebut tidak pernah dijalankan karena nilai $a nya positif.

Solusi:
Pastikan sebelum perintah header("Location: ...") tidak ada kode HTML atau perintah echo apapun. Jika kamu mengincludekan suatu script di atas header("Location: ...") pastikan dalam script yang diincludekan tersebut tidak ada kode HTML atau echo.

4. Error:
Warning: mysql_connect() [function.mysql-connect]:
Access denied for user ‘root’@'localhost’ (using password: YES) in ...

Penyebab:
Error di atas disebabkan karena koneksi yang gagal ke MySQL. Penyebab gagalnya bisa jadi disebabkan nama user atau password yang salah.

Solusi:
Pastikan username dan password koneksi ke MySQL Anda sudah benar ketika menggunakan perintah koneksi mysql_connect("namahost", "namauser", "passworduser");

5. Error:
Parse error: syntax error, unexpected T_STRING,
expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in ...

Penyebab:
Penyebab biasanya ini terjadi karena penggunaan versi PHP yang rendah (versi di bawah PHP 5) untuk menjalankan script PHP yang menggunakan OOP.

Solusi:
Coba upgrade versi PHP kamu, atau gunakan PHP dengan versi yang lebih tinggi.

6. Error:
Parse error: syntax error, unexpected T_ELSE in ...

Penyebab:
Error tersebut muncul sebagai akibat penulisan sintaks IF … ELSE yang tidak sesuai aturan. Perhatikan contoh penggunaan IF ELSE yang salah di bawah ini
$a = 5;
if ($a > 0) $status = "A lebih besar dari 0"
else ($a < 0) $status = "A lebih kecil dari 0"
else $status = "A sama dengan 0"
?>
Contoh di atas terdapat kesalahan yaitu setiap akhir statement tidak diberikan tanda titik koma (;), dan pada bagian else ($a < 0) kurang IF, seharusnya
$a = 5;
if ($a > 0) $status = "A lebih besar dari 0";
else if ($a < 0) $status = "A lebih kecil dari 0";
else $status = "A sama dengan 0";
?>

Solusi:
Pastikan struktur statement yang kamu gunakan berbentuk seperti ini
if (syarat1) statement1;
else if (syarat2) statement2;
else if (syarat3) statement3;
.
.
else statementX;
?>
atau
if (syarat1)
{
statement;
statement;
.
.
}
else if (syarat2)
{
statement;
statement;
.
.
}
.
.
else
{
statement;
statement;
.
.
}
?>

7. Error:
Fatal error: Call to undefined function: ...

Penyebab:>
Error tersebut disebabkan karena nama function yang digunakan tidak ada atau tidak dikenal oleh PHP. Jika function tersebut adalah built in function, misalnya str_split() bisa jadi hal ini disebabkan pada versi PHP yang digunakan belum ada function tersebut. Jika function tersebut adalah function buatan sendiri, bisa jadi kamu lupa menyisipkan ke dalam script atau meng-include-kannya.

Solusi:
Jika function yang tidak dikenal adalah built in function, maka lakukan upgrade versi PHP yang lebih tinggi. Sedangkan jika function yang tidak dikenal adalah buatan sendiri, pastikan kamu sudah meng-includekan di dalam scriptnya sehingga bisa dikenal.
Contohnya:
function.php
function jumlah($a, $b)
{
return $a + $b;
}
?>
script.php
include "function.php";
echo jumlah(9, 10); // akan menghasilkan 19
?>
atau
script.php
function jumlah($a, $b)
{
return $a + $b;
}

echo jumlah(9, 10); // akan menghasilkan 19
?>

8. Error:
Parse error: parse error, unexpected $end

Penyebab:
Error di atas disebabkan karena kurangnya tanda penutup kurung kurawal. Contohnya:
if ($a > 1)
{
echo "Nilai A lebih dari 1";
?>
atau
while ($a > 1)
{
.
.
.
?>
Selain itu, bisa pula error tersebut disebabkan karena efek perbedaan penggunaan tanda pembuka PHP Contohnya:
if (syarat)
{
statement1;
statement2;
?>

statement3;
statement4;
}
?>

Perhatikan contoh script di atas, bahwa pada blok statement IF oleh si programmer dipecah menjadi 2 blok, namun perhatikan bahwa untuk blok kedua, tanda pembukanya menggunakan
Solusi:
Pastikan tanda kurung kurawal penutup tidak lupa menuliskannya. Jika ternyata kasus yang Anda hadapi sama seperti contoh kasus terakhir (perbedaan tanda pembuka script PHP), konsistenkan penulisan tanda pembukanya menggunakan
9. Error:
Parse error: syntax error, unexpected T_STRING

Penyebab:
Error tersebut disebabkan karena penggunaan tanda petik (double quote atau single quote) yang tidak tepat untuk menyatakan suatu string. Sebuah string harus diapit oleh dua buah tanda petik.
Sebagai contoh:
$a = "ini sebuah string";
?>
atau
$a = 'ini sebuah string';
?>
Namun... jika dalam string tersebut terdapat tanda petik lagi, misalkan
$a = "ini sebuah " string";
?>
atau
$a = 'ini sebuah ' string';
?>
maka akan terdapat error di atas. Hal yang sama jika Anda menggunakan single quote (tanda petik tunggal).

Solusi:
Pastikan di dalam sebuah string, anda mengapitnya dengan hanya 2 buah tanda petik saja. Jika kamu bermaksud menyisipkan tanda petik dalam sebuah string, gunakan tanda \" atau \', contoh
$a = "ini sebuah \" string";
?>
atau
$a = 'ini sebuah \' string';
?>

10. Error:
Notice: Undefined index: ...
atau
Notice: Undefined variable: ...

Penyebab:
Sebenarnya itu bukan error, namun sekedar peringatan saja bahwa ada variabel atau index array yang belum terdefinisi sebelumnya. Di beberapa versi PHP peringatan tersebut muncul, namun di versi yang lain tidak muncul.
Berikut ini contohnya:
if ($a > 0)
{
....
}
?>
Jika kita perhatikan script di atas, variabel $a langsung diberikan statement pengecekan IF, padahal nilai $a ini tidak ada sebelumnya. Nah... di beberapa versi PHP, akan muncul peringatan
Notice: Undefined variable: a
Namun, bila nilai $a ini sudah didefinisikan sebelumnya misalnya
$a = 10;
if ($a > 0)
{
....
}
?>
maka peringatan di atas tidak akan muncul lagi. Peringatan yang hampir sama juga bisa muncul untuk contoh berikut ini
if ($_GET['test'] == 0)
{
....
}
?>
yang dikarenakan nilai $_GET['test'] belum terdefinisi sebelumnya atau belum ada nilainya (belum ada request GET untuk parameter 'test').

Solusi:
Sebenarnya peringatan di atas bisa saja diabaikan karena tidak berpengaruh pada kinerja script atau proses yang terjadi di dalamnya. Namun, jika kamu ingin menghilangkan peringatan tersebut caranya adalah dengan memodifikasi parameter
error_reporting = ...
pada file konfigurasi php.ini
Tambahkanlah nilai "& ~E_NOTICE" pada nilai parameternya, contoh:
error_reporting = E_ALL & ~E_NOTICE
Maksud dari parameter di atas adalah, PHP akan menampilkan bunyi error kecuali NOTICE. Jika sudah, silakan merestart Apache nya.

11. Error:
Fatal error: Maximum execution time of ... seconds exceeded in ...

Penyebab:
Error di atas disebabkan karena lama eksekusi sebuah script PHP telah mencapai batas maksimumnya. Jika kamu menggunakan AppServ atau XAMPP, default maximum execution time nya diset 30 detik. Jika lama eksekusi script yang kamu buat melebihi 30 detik, maka akan muncul error di atas.

Solusi:
kamu dapat meningkatkan atau menambah max execution time pada file php.ini, dengan cara carilah parameter
max_execution_time = ...
Tambahlah nilainya, misalnya menjadi 9999 detik, sehingga nilai parameternya menjadi
max_execution_time = 9999
Selanjutnya, simpan kembali php.ini nya, lalu restart Apachenya.
Kalau perlu, lakukan analisis algoritma pada script kamu apabila dirasa tidak efisien sehingga mengakibatkan running time yang lama.

12. Error:
Bukan Error sih, tapi kegagalan dalam proses upload file ketika kamu membuat script upload file.

Penyebab:
Kegagalan dalam proses upload file itu disebabkan oleh ukuran file yang terlalu besar melebihi batas maksimum yang diperbolehkan oleh PHP sesuai di file php.ini.

Solusi:
kamu dapat mengubah batas maksimum file size untuk upload ini dengan mengubah parameter
upload_max_filesize = ...
dan
post_max_size = ...
pada file php.ini
Berikut ini contoh pengubahan batas maksimum upload file hingga 80 Mb.
upload_max_filesize = 80M
dan
post_max_size = 80M
Jika sudah melakukan pengubahan, lakukan restart Apache nya. Oya, jangan lupa pula untuk menambah komponen input

pada form upload nya.


okeh segitu dulu ya....semoga bermanfaat....

Rabu, 01 September 2010 by Shinta Kirei Na · 0