MỤC LỤC3 MỞ ĐẦU4 CHƯƠNG 1 : GIỚI THIỆU CHUNG VỀ SQL INJECTION5 1.1 Khái niệm SQL Injection:5 1.2 Quy trình tấn cống6 1.3 Các dạng lỗi thường gặp:6 1.3.1 Không kiểm tra ký tự thoát truy vấn6 1.3.2 Xử lý không dúng kiểu7 1.3.3 Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu8 1.3.4 Blind SQL Injection8 CHƯƠNG 2 : MỘT SỐ DẠNG TẤN CÔNG THƯỜNG GẶP VỚI CÁC ỨNG DỤNG WEB10 2.1 Dạng tấn công vượt qua kiểm tra lúc đăng nhập10 2.2 Dạng tấn công sử dụng câu lệnh SELECT12 2.3 Dạng tấn công sử dụng câu lệnh INSERT13 2.4 Dạng tấn công sử dụng Strored-Procedures14 CHƯƠNG 3 : MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEBSERVER14 3.1 Một số công cụ rò tìm, tấn công lỗ hổng SQL Injection14 CHƯƠNG 4 : HẬU QUẢ CỦA SQL INJECTION VÀ CÁCH PHÒNG CHỐNG SQL26 4.1 Hậu quả:26 4.2 Cách phòng chống:26 KẾT LUẬN29
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
Trang 2KHOA CÔNG NGHỆ THÔNG TIN
Trang 3HÀ NỘI 2020
Trang 4MỤC LỤC
MỤC LỤC 3
MỞ ĐẦU 4
CHƯƠNG 1 : GIỚI THIỆU CHUNG VỀ SQL INJECTION 5
1.1 Khái niệm SQL Injection: 5
1.2 Quy trình tấn cống 6
1.3 Các dạng lỗi thường gặp: 6
1.3.1 Không kiểm tra ký tự thoát truy vấn 6
1.3.2 Xử lý không dúng kiểu 7
1.3.3 Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu 8
1.3.4 Blind SQL Injection 8
CHƯƠNG 2 : MỘT SỐ DẠNG TẤN CÔNG THƯỜNG GẶP VỚI CÁC ỨNG DỤNG WEB 10
2.1 Dạng tấn công vượt qua kiểm tra lúc đăng nhập 10
2.2 Dạng tấn công sử dụng câu lệnh SELECT 12
2.3 Dạng tấn công sử dụng câu lệnh INSERT 13
2.4 Dạng tấn công sử dụng Strored-Procedures 14
CHƯƠNG 3 : MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEBSERVER 14 3.1 Một số công cụ rò tìm, tấn công lỗ hổng SQL Injection 14
CHƯƠNG 4 : HẬU QUẢ CỦA SQL INJECTION VÀ CÁCH PHÒNG CHỐNG SQL 26
4.1 Hậu quả: 26
4.2 Cách phòng chống: 26
KẾT LUẬN 29
Trang 5MỞ ĐẦU
1 Giới thiệu chung
Tại sao SQL Injection lại “thần thánh”?
Những lý do sau đã tạo nên tên tuổi lừng lẫy của SQL Injection:
Cực kỳ nguy hiểm – Có thể gây ra những thiệt hại khổng lồ Với SQL
Injection, hacker có thể truy cập một phần hoặc toàn bộ dữ liệu trong hệ thống.
Rất phổ biến và dễ thực hiện – Lỗ hổng này rất nổi tiếng, từ developer đến
hacker gần như ai cũng biết Ngoài ra, còn có 1 số tool tấn công SQL Injection cho dân “ngoại đạo”, những người không biết gì về lập trình.
Rất nhiều ông lớn từng bị dính – Sony, Microsoft UK Mọi vụ lùm xùm
liên quan tới “lộ dữ liệu người dùng” ít nhiều đều dính dáng tới SQL Injection.
Dễ tấn công, phổ biến, gây ra hậu quả nghiêm trọng, đó là lý dó Inject (Không
chỉ SQL mà OS và LDAP) nằm chễm chễ ở vị trí đầu bảng trong top 10 lỗ hỗng
bảo mật của OWASP
Vậy SQL Injection thực sự “Thần thánh” như thế nào? Bài báo cáo này, nhóm 01 sẽ nói rõ những đặc điểm nổi trội đó.
Trang 6CHƯƠNG 1 : GIỚI THIỆU CHUNG VỀ SQL INJECTION
1.1 Khái niệm SQL Injection:
SQL (Structured Query Language) được sử dụng để truy vấn,
thao tác dữ liệu trong Database
SQL Injection là một kỹ thuật tấn công vào câu lệnh cơ sở dữ liệu
thông qua chèn các đoạn mã độc vào SQL để đánh lạc hướng xử lý vớimục đích phá hủy dữ liệu hoặc ăn cắp
SQL injection có thể cho phép những kẻ tấn công thực hiện các thaotác, delete, insert, update… 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 đếnnhư là một vật trung gian tấn công trên các ứng dụng web có dữ liệu đượcquản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL,Oracle, DB2, Sysbase…
MsAccess: thường dành cho các website tin tức quy mô nhỏ, sử dụng
ngôn ngữ ASP để thiết kế
MSSQL: dùng cho website có quy mô lớn, sử dụng ngôn ngữ ASP,
ASPX (ASP.Net) để thiết kế
MySQL: tất cả các website có thể dùng, sử dụng ngôn ngữ PHP để
thiết kế (MySQL và PHP là 2 anh em song sinh, chúng luôn đi kèm với
Trang 7 Hacker lấy được thông tin mình mong muốn, ví dụ thông tin bài đănghoặc thông tin của một User, hoặc thông tin đăng nhập của SQL
Hacker giải mã password của admin, hoặc thay thế mật khẩu củamình vào rồi đăng nhập bằng tài khoản Admi
Thay đổi nội dung website, đánh cắp dữ liệu…
1.3 Các dạng lỗi thường gặp:
1.3.1 Không kiểm tra ký tự thoát truy vấn
Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữliệu đầu vào trong câu truy vấn SQL Kết quả là người dùng cuối có thểthực hiện một số truy vấn không mong muốn đối với cơ sở dữ liệu của ứngdụng Dòng mã sau sẽ minh họa lỗi này:
statement = "SELECT * FROM users WHERE name = '" +
userName + "';"
Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụthể từ bảng những người dùng Tuy nhiên, nếu biến "userName" đượcnhập chính xác theo một cách nào đó bởi người dùng ác ý, nó có thể trởthành một câu truy vấn SQL với mục đích khác hẳn so với mong muốn của
tác giả đoạn mã trên Ví dụ, ta nhập vào giá trị của biến userNamenhư
sau:
a' or 't'='t
Khiến câu truy vấn có thể được hiểu như sau:
SELECT * FROM users WHERE name = 'a' or 't'='t';
Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụtrên có thể được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ
Trang 8bởi 't'='t' luôn đúng Trong khi hầu hết các SQL server cho phép thực hiệnnhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số SQL APInhư mysql_query của php lại không cho phép điều đó vì lý do bảo mật.Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng các câu lệnhriêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp truy vấn.Các giá trị của biến "userName" trong câu truy vấn dưới đây sẽ gây ra việcxoá những người dùng từ bảng người dùng cũng tương tự như việc xóa tất
cả các dữ liệu được từ bảng dữ liệu (về bản chất là tiết lộ các thông tin củamọi người dùng), ví dụ này minh họa bằng một API cho phép thực hiệnnhiều truy vấn cùng lúc:
a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't
Điều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't';
1.3.2 Xử lý không dúng kiểu
Lỗi SQL injection dạng này thường xảy ra do lập trình viên hay ngườidùng định nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra
và lọc kiểu dữ liệu đầu vào Điều này có thể xảy ra khi một trường số được
sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra
dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào cóphải là số hay không Ví dụ như sau:
statement:= "SELECT * FROM data WHERE id = " + a_variable
+ ";"
Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên
là nhập vào một số tương ứng với trường id - trường số Tuy nhiên, ngườidùng cuối, thay vì nhập vào một số, họ có thể nhập vào một chuỗi ký tự,
Trang 9và do vậy có thể trở thành một câu truy vấn SQL hoàn chỉnh mới mà bỏqua ký tự thoát Ví dụ, ta thiết lập giá trị của biến a_variable là:
1;DROP TABLE users
khi đó, nó sẽ thực hiện thao tác xóa người dùng có id tương ứng khỏi
cơ sở dữ liệu, vì câu truy vấn hoàn chỉnh đã được hiểu là:
SELECT * FROM data WHERE id=1;DROP TABLE users;
1.3.3 Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu
Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở
dữ liệu, như là trường hợp hàm mysql_real_escape_string() của các máychủ MySQL Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộctấn công SQL injection thành công dựa trên những ký tự Unicode khôngthông thường ngay cả khi đầu nhập vào đang được thoát
1.3.4 Blind SQL Injection
Lỗi SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụngweb nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻtấn công Nó có thể gây ra sự sai khác khi hiển thị nội dung của một trangchứa lỗi bảo mật này, hậu quả của sự tấn công SQL injection dạng nàykhiến cho lập trình viên hay người dùng phải mất rất nhiều thời gian đểphục hồi chính xác từng bit dữ liệu Những kẻ tấn công còn có thể sử dụngmột số công cụ để dò tìm lỗi dạng này và tấn công với những thông tin đãđược thiết lập sẵn
a Thay đổi giá trị điều kiện truy vấn
Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiệntrong câu truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này
Trang 10SELECT booktitle from booklist where bookId = 'OOk14cd' AND
1=1;
Sẽ hiển thị một trang một cách bình thường, trong khi:
SELECT booktitle from booklist where bookId = 'OOk14cd' AND
1=2;
Sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụngweb có chứa lỗi SQL injection dạng này Lỗ hổng dạng này còn cho phéptin tặc không chỉ gây ảnh hưởng tới bảng hay dữ liệu hiện tại mà còn ảnhhưởng tới những dữ liệu hay bảng khác phụ thuộc vào nội dung của dữliệu hay bảng hiện tại
b Điều kiện lỗi
Mỗi SQL injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ đượcphép đánh giá khi mà giá trị của câu lệnh WHERE là đúng Ví dụ:
SELECT 1/0 from users where username='Ralph';
Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên
"Ralph" tồn tại trong cơ sở dữ liệu
c Thời gian trễ
Lỗi SQL injection dạng này tồn tại khi thời gian xử lý của một haynhiều truy vấn SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quátrình xử lý truy vấn của SQL engine cần nhiều thời gian Tin tặc có thể sửdụng lỗi SQL injection dạng này để xác định thời gian chính xác mà trangcần tải khi giá trị nhập vào là đúng
Trang 11CHƯƠNG 2: MỘT SỐ DẠNG TẤN CÔNG THƯỜNG GẶP
VỚI CÁC ỨNG DỤNG WEB
2.1 Dạng tấn công vượt qua kiểm tra lúc đăng nhập
Với dạng tấn công này, tin tặc có thể dễ dàng vượt qua các trang đăngnhập nhờ vào lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu củaứng dụng web Thông thường để cho phép người dùng truy cập vào cáctrang web được bảo mật, hệ thống thường xây dựng trang đăng nhập đểyêu cầu người dùng nhập thông tin về tên đăng nhập và mật khẩu Sau khingười dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mậtkhẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiệntiếp Ví dụ, trong trường hợp sử dụng ASP, người ta có thể dùng 2 trang: 1trang HTML để hiển thị Form nhập liệu và 1 trang ASP để xử lý thông tinnhập vào từ phía người dùng như sau:
- Trang nhập liệu: login.htm
<form action="ExecLogin.asp" method="post">
Username: <input type="text" name="fUSRNAME"><br />
Password: <input type="password" name="fPASSWORD"><br /> <input type="submit">
Trang 12strSQL = "SELECT * FROM T_USERS " & _
"WHERE USR_NAME=' " & vUsrName & _
" ' and USR_PASSWORD=' " & vPassword & " ' "
Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS = Nothing %>
Chỗ sơ hở trong đoạn mã xử lý nhập liệu trên nằm ở chỗ dữ liệu nhậpvào từ người dùng được dùng để xây dựng trực tiếp câu lệnh SQL Chínhđiều này cho phép tin tặc có thể điều khiển câu truy vấn sẽ được thực hiện
Ví dụ, nếu người dùng nhập chuỗi trong ngoặc sau vào trong cả hai ô nhập
liệu username/password của trang login.htm là:('OR=') Lúc này, câu truy
vấn sẽ được gọi thực hiện là:
SELECT * FROM T_USERS WHERE USR_NAME =''OR''='' and
USR_PASSWORD= ''OR''=''
Câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi củaT_USERS và đoạn mã tiếp theo xử lý người dùng đăng nhập bất hợp phápnày như là người dùng đăng nhập hợp lệ
Trang 132.2 Dạng tấn công sử dụng câu lệnh SELECT
Dạng tấn công này phức tạp hơn Để thực hiện được kiểu tấn côngnày, kẻ tấn công phải có khả năng hiểu và lợi dụng các sơ hở trong cácthông báo lỗi từ hệ thống để dò tìm các điểm yếu khởi đầu cho việc tấncông Ví dụ, trong các trang tìm kiếm Các trang này cho phép người dùngnhập vào các thông tin tìm kiếm như Họ, Tên, … Đoạn mã thường gặp là:
Set objRS = Nothing %>
Tương tự như trên, tin tặc có thể lợi dụng sơ hở trong câu truy vấnSQL để nhập vào trường tên tác giả bằng chuỗi giá trị:
' UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE ' '=' (*)
Lúc này, ngoài câu truy vấn đầu không thành công, chương trình sẽthực hiện thêm lệnh tiếp theo sau từ khóa UNION nữa Giả sử đoạn mãnhập vào là:
' DROP TABLE T_AUTHORS
Câu truy vấn sẽ thực hiện việc xóa bảng
Trang 142.3 Dạng tấn công sử dụng câu lệnh INSERT
Thông thường các ứng dụng web cho phép người dùng đăng ký mộttài khoản để tham gia Chức năng không thể thiếu là sau khi đăng ký thànhcông, người dùng có thể xem và hiệu chỉnh thông tin của mình SQLinjection có thể được dùng khi hệ thống không kiểm tra tính hợp lệ củathông tin nhập vào Ví dụ, một câu lệnh INSERT có thể có cú pháp dạng:
INSERT INTO TableName VALUES('Value One', 'Value Two', 'Value Three')
Nếu đoạn mã xây dựng câu lệnh SQL có dạng:
<%
strSQL = "INSERT INTO TableName VALUES(' " & strValueOne
& " ', ' " _ & strValueTwo & " ', ' " & strValueThree & " ') "
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN= "
…
Set objRS = Nothing %>
Thì chắc chắn sẽ bị lỗi SQLi, bởi vì nếu ta nhập vào trường thứ nhất
ví dụ như:
' + (SELECT TOP 1 FieldName FROM TableName) + '
Lúc này câu truy vấn sẽ là:
INSERT INTO TableName VALUES(' ' + (SELECT TOP 1 FieldName FROM TableName) + ' ', 'abc', 'def')
Khi đó, lúc thực hiện lệnh xem thông tin, xem như bạn đã yêu cầuthực hiện thêm một lệnh nữa đó là:
Trang 15SELECT TOP 1 FieldName FROM TableName
2.4 Dạng tấn công sử dụng Strored-Procedures
Việc tấn công bằng stored – procedures sẽ gây tác hại rất lớn nếu ứngdụng được thực thi với quyền quản trị hệ thống 'sa' Ví dụ, nếu ta thay
đoạn mã tiêm vào dạng: '; EXEC xp_cmdshell ‘cmdd.exe dir C: ' Lúc này
hệ thống sẽ thực hiện lệnh liệt kê thư mục trên ổ đĩa C:\ cài đặt server.
Việc phá hoại kiểu nào tuỳ thuộc vào câu lệnh đằng sau cmd.exe
Trang 16CHƯƠNG 3: MÔ PHỎNG TẤN CÔNG SQL INJECTION
Trang 18 Thu thập kết quả
Trang 19 Ở đây có một số lỗi như XSS, SQL injection, RFI
Ta dùng SQLmap để khai thác lỗ hổng SQL Injection
Trang 20 Gõ câu lệnh: sqlmap -u
http://testphp.vulnweb.com/product.php?pic=7%20AND
%201=2%20 %20 keep-alive random-agent
-u : url cần quét keep-alive : sử dụng HTTP(s) connections random-agent : sử dụng HTTP User-Agent ngẫu nhiên
sqlmap -u http://testphp.vulnweb.com/product.php?pic=7%20AND
%201=2%20 %20 dbs
Trang 21dbs : liệt kê các databases
Sau khi dung SQLmap thì mình có được thông tin có 2 databases, thử xem databases acuart có gì không
Trang 23Nhập URL Chọn Free Scan Sau đó chọn Light Scan hoặc Full Scan
Demo tấn công lỗ hổng SQL Injection
Trang 24Nhập email: user@email.comPassword: password
Log in
Trang 25Server sẽ trả về kết quả “Unknow email or password” do không tìm thấy
dữ liệu về user này
Nhập lại password là “ password’ ”
Lần này server sẽ trả về kết quả “An unexpected error occurred”
Do Hacker đã nhập thêm ký tự ‘ khiến SQL server trả về kết quả lỗi cúpháp :
Rendering login page: Server sẽ kết xuất trang đăng nhập
Đây là các câu lệnh SQL trong server
Trang 26“ password’ “ được chèn trực tiếp vào chuỗi SQL và kết thúc truy vấn Đây là nguyên nhân gây ra lỗi cú pháp mà chúng ta đã thấy khi server trảvề.
Hành vi trên của hacker chỉ ra rằng website có thể bị tấn công SQLInjection
Tiếp tục nhập password “ ‘ or 1=1 “
Trang 27Hacker đã đăng nhập vào được hệ thống mà không cần mật khẩu, nhờkhai thác lỗ hổng SQL Injection.
Hệ thống đã bị đánh lừa do ký tự “ “ hacker nhập khiến cơ sở dữ liệu
bỏ qua phần còn lại của câu lệnh SQL, cho phép xác thực mà không phảinhập đúng mật khẩu
Trang 28CHƯƠNG 4: HẬU QUẢ CỦA SQL INJECTION VÀ CÁCH
PHÒNG CHỐNG SQL
4.1 Hậu quả:
Hậu quả lớn nhất mà SQL Injection gây ra là: Làm lộ dữ liệu trongdatabase Tuỳ vào tầm quan trọng của dữ liệu mà hậu quả dao động ở mứcnhẹ cho đến vô cùng nghiêm trọng
Nếu lộ dữ liệu credit card, hacker có thể dùng credit card để “mua sắmhộ” hoặc chôm tiền của người dùng Hàng triệu Credit Card chùa tồn tạitrên mạng, do hacker chôm từ các trang bán hàng thông qua SQL Injection
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ụngdịch vụ khác, dẫn đến phá sản v…v
Lỗ hỗng này cũng ảnh hưởng lớn đến khách hàng Do họ thường dùngchung một mật khẩu cho nhiều tài khoản, chỉ cần lộ mật khẩu một tài khoảnthì các tài khoản khác cũng lộ theo
Trong nhiều trường hợp, hacker không chỉ đọc được dữ liệu mà còn có
thể chỉnh sửa dữ liệu Lúc này hacker có thể đăng nhập dưới vai trò admin, lợi dụng hệ thống, hoặc xoá toàn bộ dữ liệu để hệ thống ngừng
hoạt động
4.2 Cách phòng chống:
Hầu hết các mã nguồn mở bây giờ đều không quá lo về lỗi này, tuynhiên plugin hay module được viết bởi nhiều lập trình viên khác nhau lạihay để ra sơ hở tạo điều kiện cho lỗi phát sinh Cách phòng tránh thì cónhiều cách, trong đó:
Mặc dù SQL rất nguy hại nhưng cũng dễ phòng chống Gần đây, hầu
như chúng ta ít viết SQL thuần mà toàn sử dụng ORM (Object-Relational
Mapping) framework Các framework web này sẽ tự tạo câu lệnh