سلام به همه ی غنچه های زیبای وطنم
بعد از مدت ها به نوشتن دوباره گرفتم آنچه تلاش کردم یکی از موقشنگ های آبی یا صورتی فانتزی رو شکار کنم نشد از جاوا هم اینا بد دست ترن...
من مثله بقیه نمیام اول بگم sql injection چیه بیاین باهم کمی دست به کد بشیم تا ببینیم چه اتفاقی میوفته و کجا با این پدیده ی زجرآور از دید ما و از دید هکرا جذاب (زاویه ی دید مهمه) روبه رو میشیم.
خوب بچه ها ما میخوایم خیلی ساده به دیتابیس وصل بشیم اطلاعات چندتا فلک زده ی بدبختو ببینم.
پس ما اول یه پروژه ی maven ای میسازیم حالا باید درایور و دیپندنسیشو اضافه کنیم که بتونیم به کمک اون به دیتابیسمون وصل شیم.
فرض بر اینه شما با ابزار maven آشنایین.
حالا باید یه کد بنویسیم که با استفاده و به کمک این درایور میره میره و اطلاعات کسایی که ما میخوایم برامون میاره.
پس اول یه کلاس به اسم SqlInjection میسازیم که شامل سه فانکشن میشه توضیح میدم هرکدوم چیکار میکنه.
public SqlInjection() { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
در اینجا ما میام توی تابع سازنده یا کانستراکتور درایور مورد نظرمون رو لود میکنیم(البته الان دیگه نیاز به این نیست ولی من برای فهم بیشتر آوردمش.)
public void getUserById(String id) { try ( Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/javase","root",""); Statement statement = connection.createStatement(); ) { String sql = "select * from users where id='"+id+"'; " ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println("id = " + resultSet.getInt("id")); System.out.println("name = " + resultSet.getString("name")); System.out.println("username = " + resultSet.getString("username")); System.out.println("pass = " + resultSet.getString("username")); System.out.println("-------------------------------------------------"); } } catch (SQLException e) { e.printStackTrace(); } }
در اینجا ما میایم به دیتابیس یه کانکشن میزنیم و یه سشن باز میکنیم بهش میگیم دختر خوب mysql جان بیا و به من یوزری که id اینیه که بهت میگم رو بده و اینو هم با این کوئری بهش میگیم:
"select * from users where id='"+id+"'; "
خوب حالا نوبت میرسه که ازین توابع در تابع main خودمون استفاده کنیم و اونارو صدا بزنیم:
public static void main(String[] args) { SqlInjection sqlInjection = new SqlInjection(); sqlInjection.getUserById("1"); }
اینجا ما از کلاس یه شی میسازیم و بعدش خودش تابع سازندشو فراخوانی میکنه و درایور ما لود میشه بعدش بهش میگیم یوزری که id یک هست رو بده.
اینجا یه اکسپشن پرت میکنه توی صورتمون میگه: ای برنامه نویس حواس پرت فراموش کار(قطعا بخاطر دغدغه های زندگی این طوری شدیم نه چیز دیگه ای) جداول هات کو شاسکول...
اینجاس که ما میریم برای ساخت و مقدار دهی جداولمون که من براتون نوشتم آماده(امکانات رو ببینید هزینه کردماااا)
#---------------------------------------create database---------------------------------------
CREATE DATABASE javase DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
#---------------------------------------set database---------------------------------------
USE javase;
#---------------------------------------create table---------------------------------------
CREATE TABLE users
(
id INT NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(200),
username VARCHAR(200),
pass VARCHAR(200)
);
#---------------------------------add users---------------------------------------------
INSERT into users(name,username,pass) VALUES ('mehdi','m77','m1998m');
INSERT into users(name,username,pass) VALUES ('ali','a77','a1998m');
INSERT into users(name,username,pass) VALUES ('javad','j77','j1998m');
INSERT into users(name,username,pass) VALUES ('yasin','y77','y1998m');
خوب بعد از این اتفاق دیگه ران میکنیم تا نتیجه رو ببینیم و اما نتیجه چی میشه....
لبخند موزیانه چرا میزنید بابا دو سه تا خط دیتاس دیگه////:
خوب همون طور که میبینید اطلاعات طرفو نشون داده.
حالا من میام یه فوضولی میکنم دستم اشتباه میخوره و به جای 1 یه عبارت مینویسم به این صورت:
sqlInjection.getUserById("5' or 1=1 ##");
و اینو اجرا میکنم ازتون دعوت میکنم نتیجه رو ببینید مخصوصا اونایی که موهاشون رنگی رنگیه بقیه هم خداشون بزرگه...
چی شد بچه ها؟؟؟
به فنا رفتیم همه ی اطلاعات رو نشون داد با این عبارت بله عزیزای دل به این میگن sql injection ((((((: