SQL injection là một hình thức tấn công mà trong đó truy vấn SQL của ứng dụng bị chèn thêm vào các tham số đầu vào “nguy hiểm” từ form người dùng nhập và sau đó các tham số này sẽ được chuyển đến máy chủ cơ sở dữ liệu để phân tích cú pháp và thực thi.
Trang 1
MỤC LỤC Danh mục hình vẽ 2
LỜI NÓI ĐẦU 3
CHƯƠNG 1 TỔNG QUAN VỀ SQL INJECTION 4
1.1 Cách thức hoạt động của ứng dụng web 4
1.2 Hiểu về SQL injection 5
1.3 Các dạng tấn công SQL injection 6
1.3.1 Lỗi dựa trên tiêm vào truy vấn SQL (Error based SQL Injection)6 1.3.2 Blind SQL Injection 10
CHƯƠNG 2 BỘ CÔNG CỤ HỖ TRỢ THỰC HÀNH TẤN CÔNG 12
CHƯƠNG 3 KIỂM THỬ SQL INJECTION 13
3.1 Xác định lỗ hổng trong việc kiểm tra thông tin đầu vào 13
3.2 Xác định điểm yếu SQL Injection dựa trên phản hồi 15
CHƯƠNG 4 CÁC KỸ THUẬT TẤN CÔNG SQL INJECTION 18
4.1 Tấn công khai thác dữ liệu thông qua toán tử UNION 18
4.2 Tấn công sử dụng mệnh đề điều kiện 19
4.2.1 Tấn công dựa trên độ trễ phản hồi 19
4.2.2 Tấn công dựa trên thông báo lỗi 20
CHƯƠNG 5 CÁCH PHÒNG TRÁNH TẤN CÔNG SQL INJECTION 22
Chương 6 Hướng dẫn một số tấn công SQL Injection với BWapp 24
6.1 SQL Injection (Login Form/Hero) 24
6.2 SQL Injection (GET/Search) 26
TÀI LIỆU THAM KHẢO 33
Trang 2Danh mục hình vẽ.
Hình 1 Kiến trúc 3 tầng đơn giản 6
Hình 2 Giao diện bộ công cụ bWAPP 14
Hình 3 Các ký tự chú thích thường gặp 17
Hình 4 Các kiểu SQL Injection có trong Bwapp 26
Hình 5 Chọn SQL Injection (GET/Search) 27
Hình 6 Giao diện đăng nhập SQL Injection (Login Form/Here) 27
Hình 7 Kết quả SQL Injection (Login Form/Hero) 28
Hình 8 Chọn option SQL Injection (GET/Search) 28
Hình 9 Giao diện SQL Injection (GET/Search) 29
Hình 10 Kết quả tìm kiếm tên phim 29
Hình 11 Thông báo của website khi có lỗi trong lệnh truy vấn 30
Hình 12 Kiểm tra với ORDER BY 7 31
Hình 13 Kiểm tra với ORDER BY 8 31
Hình 14 Các cột có thể khai thác dữ liệu 32
Hình 15 Một số thông tin về hệ thống 32
Hình 16 Các bảng trong database 33
Hình 17 Các thông trong bảng users 34
Hình 18 Thông tin người dùng 34
Trang 3LỜI NÓI ĐẦU
Một trong những phương pháp tấn công lên các ứng dụng Web hiện nay khôngthể không nói tới SQL injection Dựa trên các lỗ hổng trong việc kiểm tra dữ liệu đầuvào (ví dụ từ form đăng nhập hay form tìm kiếm), kẻ tấn công có thể chèn thêm(inject) các đoạn mã nguy hiểm để thực thi các câu lệnh SQL trái phép Các đoạn mãnày có thể là các thao tác xóa, hiệu chỉnh, gây rò rỉ, mất mát thông tin, thay đổi cấutrúc hệ thống tin của website
Để có thể phòng chống tấn công SQL injection một cách hiểu quả, đảm bảo antoàn cho ứng dụng thì buộc các nhà phát triển phải hiểu rõ được cơ chế hoạt động,cách thức tấn công của nó Vì vậy nhóm em đã chọn đề tài: tìm hiểu về tấn công SQLInjection trên BWapp để có thể tìm hiểu và đưa ra các biện pháp phòng chống loạitấn công nguy hiểm này
Trang 4
CHƯƠNG 1 TỔNG QUAN VỀ SQL INJECTION 1.1 Cách thức hoạt động của ứng dụng web
Hình 1 Kiến trúc 3 tầng đơn giảnTầng trình diễn (presentation) là tầng ở mức cao nhất của ứng dụng, hiện thịthông tin của website cho người dùng Tầng logic chứa các mã nguồn được đặt sautầng trình diễn, kiểm soát chức năng của ứng dụng, thực hiện các quá trình xử lý.Tầng lưu trữ (storage) chứa máy chủ cơ sở dữ liệu để lữu trữ và tìm kiếm thông tin
Web browser (tầng trình diễn) gửi các yêu cầu đến tầng giữa (tầng logic) Tầnglogic sẽ gửi các truy vấn đến cơ sở dữ liệu để lấy thông tin Tầng lưu trữ xử lý truyvấn, sau đó trả lại các thông tin cho tầng logic Cuối cùng, tầng logic xử lý các yêucầu và trả về kết quả cho tầng trình diễn
Một nguyên tắc cơ bản trong kiến trúc 3 tầng đó là tầng trình diến không baogiờ được truyền thông trực tiếp với tầng lưu trữ Tất cả truyền thông đều phải thôngqua tầng trung gian (tầng logic)
Trong hình 1, người dùng mở trình duyệt web và kết nối đến địa chỉhttp://www.victim.com Web server nằm trên tầng logic sẽ tải các kịch bản từ các tệptin hệ thống và chuyển các tệp tin này đến công cụ để phân tích và thực thi Các kịchbản mở một kết nối đến tầng lưu trữ bằng cách sử dụng bộ kết nối cơ sở dữ liệu(database connector) và thực thi truy vấn SQL Cở dữ liệu trả dữ liệu về cho bộ kết
Trang 5nối, bộ kết nối nằm trong tầng logic Tầng logic thực hiện xử lý các yêu cầu trước khitrả về trang web trong định dạng HTML tới trình duyệt của người dùng trong tầngtrình diễn Trình duyệt sẽ hiện thị thông tin cho người dùng có thể đọc và hiểu.
1.2 Hiểu về SQL injection
SQL injection là một hình thức tấn công mà trong đó truy vấn SQL của ứngdụng bị chèn thêm vào các tham số đầu vào “nguy hiểm” từ form người dùng nhập vàsau đó các tham số này sẽ được chuyển đến máy chủ cơ sở dữ liệu để phân tích cúpháp và thực thi.[ CITATION Cla09 \l 1033 ]
Như đã đề cập trong phần trước, người dùng không thể tương tác trực tiếp với
cơ sở dữ liệu Như vậy, các lệnh SQL mà cơ sở dữ liệu phải thực thi do tầng logic gửiđến, không có sự can thiệp của người dùng Vậy làm thế nào để người dùng có thểthực thi được các truy vấn SQL theo chủ ý của họ? Đó chính là các tham số đầu vào
mà người dùng nhập được kết hợp với câu lệnh SQL trên tầng logic Sự kết hợp nàytạo thành một câu lệnh SQL nguy hiểm mà nó sẽ được thực thi trên cơ sở dữ liệu Kẻtấn công xây dựng các đoạn mã thích hợp sẽ tạo ra các lệnh truy vấn theo ý muốn
SQL Injection thường là kết quả của những sai sót trong ứng dụng web hoặctrang web chứ không phải vấn đề ở cơ sở dữ liệu Nguyên nhân thông thường của lỗhổng này là dữ liệu đầu vào không hợp lệ hoặc vắng mặt, các truy vấn truyền vào cóthể vượt qua mà không cần kiểm tra Chính vì thế bất cứ thành phần nào của ứngdụng mà người dùng có thể tương tác được để điều khiển nội dung (ví dụ: các Form,tham số URL, cookie, user-agent,…) đều có thể được sử dụng để tiến hành chèn truyvấn có hại
Trên cơ sở ứng dụng và cách xử lý dữ liệu người dùng cung cấp, SQL Injection
có thể được sử dụng để thực hiện các cuộc tấn công sau:
- Vượt qua xác thực (Authentication bybass): Bằng cách sử dụng tấn côngnày, kẻ tấn công có thể đăng nhập vào ứng dụng mà không cần tên đăngnhập và mật khẩu hợp lệ, và lấy được quyền quản trị
- Tiết lộ thông tin (Information disclosure): Bằng cách tấn công này, kẻ tấncông có thế có được thông tin nhạy cảm (như thông tin cá nhân của kháchhàng: tên, địa chỉ, số điện thoại, chứng minh thư, ) được lưu trong cơ sở dữliệu
Trang 6- Xâm phạm tính toàn vẹn dữ liệu (Compromised data integrity): Kẻ tấn công
sử dụng tấn công này để phá hủy, chèn nội dung độc hại vào trang webhoặc thay đổi nội dung được lưu trong cơ sở dữ liệu
- Xâm phạm tính sẵn có của dữ liệu (Compromised availability of data): bằngcách tấn công này, kẻ tấn công có thể xóa các thông tin cơ sở dữ liệu, hoặcthông tin kiểm toán được lưu trong cơ sở dữ liệu
- Thi hành lệnh từ xa (Remote code execution): Nó hỗ trợ cho kẻ tấn cônglàm nguy hại cho hệ điều hành máy chủ lưu trữ
1.3 Các dạng tấn công SQL injection
1.3.1 Lỗi dựa trên tiêm vào truy vấn SQL (Error based SQL Injection)
Dạng tấn công này, ứng dụng web sẽ hiển thị thông báo lỗi khi có truy vấn giảmạo, kẻ tấn công sẽ dựa vào lỗi này để tiếp tục tấn công
Thông thường các website thường có một trang nhận ID của tin cần hiển thị rồi
sẽ truy vấn nội dung của tin có ID này
Ví dụ như http://www.example.com/product.php?id=10, để thực hiện được
chức năng này ứng dụng web sử dụng truy vấn SQL sau: SELECT * FROM products WHERE id_product = $id_product Thông thường, sau khi thực hiện truy vấn này
ứng dụng web sẽ trả về thông tin tương ứng với ID được truyền vào Kẻ tấn công cóthể thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác, và từ đó khởi đầucho một cuộc tấn công bất hợp pháp
Ví dụ, kẻ tấn công nối giá trị ID với kết quả của hàm
http://www.example.com/product.php?id=10||
UTL_INADDS.GET_HOST_NAME((SELECT user FROM DUAL) ) ) Chức năng của
hàm này là sẽ trẻ về tên máy chủ của tham số được truyền cho nó, ở đây chính là têncủa người dùng- kết quả của truy vấn được truyền vào Khi đó cơ sở dữ liệu sẽ tìmkiếm tên một máy chủ với tên người dùng trong cơ sở dữ liệu, thực thi này sẽ bị lỗi,
và trả về một thông báo như sau: ORA-292257: host SCOTT unknown
a Tấn công sử dụng toán tử UNION (UNION SQL Injection)
Trang 7Các cuộc tấn công dựa trên UNION cho phép kẻ tấn công dễ trích suất thôngtin từ cơ sở sữ liệu Toán tử UNION trong SQL được sử dụng để kết hợp kết quả củahai hay nhiều lệnh SELECT mà không trả về bất cứ bản sao nào của bản ghi Bởi vìtoán tử UNION chỉ có thể được sử dụng nếu cả hai truy vấn có cùng cấu trúc, kẻ tấncông phải tạo một câu lệnh SELECT giống với truy vấn ban đầu Để thực hiện đượcviệc này thì cần phải biết được tên bảng hợp lệ và xác định số cột và kiểu dữ liệutrong truy vấn đầu tiên Cách đơn giản nhất để lấy được tên bảng là đoán, vì thôngthường trong các ứng dụng tên bảng thường được đặt giống nhau để thuận tiện chongười dùng.
Ví dụ như truy vấn: SELECT Name, Phone, Address FROM Users WHERE Id
= $id Kẻ tấn công sẽ thay thế một ID hợp lệ bằng một giá trị khác để thực hiện cuộc tấn công Chẳng hạn, kẻ tấn công gán ID bằng giá trị sau $id = 1 UNION ALL SELECT creditCardNumber, 1, 1 FROM CreditCardTable Khi đó ứng dụng web sẽ thực hiện câu truy vấn sau: SELECT Name, Phone, Address FROM Users WHERE Id
= 1 UNION ALL SELECT creditCardNumber, 1, 1 FROM CreditCardTable Kết quả
của truy vấn giả mạo sẽ được kết hợp với truy vấn ban đầu cho ra kết quả cuối cùng
là tên, số điện thoại, địa chỉ và số thẻ tín dụng của người dùng
b Tấn công sử dụng công thức hằng đúng (Tautology SQL Injection attack)[
CITATION Sea16 \l 1033 ]
Trong cuộc tấn công sử dụng công thức hằng đúng, mã được tiêm vào bằngcách sử dụng toán tử điều kiện OR sao cho truy vấn luôn luôn đánh giá đúng Tấncông này thường được dùng để vượt qua tính xác thực người dùng và trích suất dữliệu bằng cách chèn thêm một công thức hằng đúng trong mệnh đề WHERE của mộttruy vấn SQL Một dạng điển hình của công thức hằng đúng là “OR <biểu thức sosánh>”, trong đó biểu thức so sánh sử dụng một hoặc nhiều toán tử quan hệ để sosánh các toán hạng và tạo ra một điều kiện luôn đúng Nếu kẻ tấn công nhập ID
người dùng là abcd và mật khẩu là anything’ or ‘x’ = ‘x’ thì truy vấn có dạng sau: SELECT * FROM Users WHERE Id_user = ‘abcd’AND password = ‘anything’ or
‘x’ = ‘x’;
c Tấn công sử dụng truy vấn không chính xác, không hợp lệ (Illegal/Logically Incorrect query)
Trang 8Dạng tấn công này cho phép kẻ tấn công thu thập thông tin về loại và cấu trúccủa cơ sở dữ liệu của ứng dụng Cuộc tấn công này được coi là một bước thu thậpthông tin sơ bộ hỗ trợ cho cuộc tấn công khác Lỗ hổng được tạo ra bởi cuộc tấn côngnày là trang lỗi mặc định được trả về bởi ứng dụng thường là thông tin thu được vềlược đồ cơ sở dữ liệu Khi thực hiện cuộc tấn công này, kẻ tấn công tiêm những câulệnh gây ra cú pháp, chuyển đổi kiểu, hoặc lỗi logic trong cơ sở dữ liệu Các lỗi nàyđược dùng để suy luận kiểu dữ liệu của một số cột nhất định Lỗi cú pháp được sửdụng để xác định các thông số tiêm Lỗi logic có thể tiết lộ tên của các bảng và cộtgây ra lỗi.
Ví dụ, truy vấn gây ra lỗi chuyển đổi kiểu có thể tiết lộ dữ liệu liên quan sau
đây Kẻ tấn công sẽ gán password một giá trị sau: AND ‘pin: “convert(int, (select top
1 name from sysobjects where xtype = ‘u’)) Khi đó cơ sở dữ liệu sẽ thực hiện truy vấn sau: SELECT name FROM Authors where username = ‘’ AND password = ‘’ AND ‘pin: “convert(int, (select top 1 name from sysobjects where xtype = ‘u’));
Truy vấn này trích xuất bảng người dùng đầu tiên (xtype = ‘u’) từ bảng siêu dữliệu của cơ sở dữ liệu (giả sử ứng dụng đang sử dụng Microsoft SQL Server, mà bảngsiêu dữ liệu được gọi là sysobjects) Sau đó truy vấn cố chuyển đổi tên bảng nàythành một số nguyên Bởi vì đây là một hành động không hợp pháp nên cơ sở dữ liệu
sẽ ném một thông báo lỗi Đối với Microsoft SQL Server, lỗi mặc định là “MicrosoftOLE DB Provider for SQL Server (0x80040E07) Error converting nvarchar value
‘creditcards’ to a column of data type int.” Kẻ tấn công cố sử dụng thông tin này đểbiết được giản đồ của cơ sở dữ liệu
d Dạng tấn công sử dụng Stored-Procedure
Trong dạng tấn công này, kẻ tấn công cố gắng thi hành trên các thủ tục lưu trữ
có trong cơ sở dữ liệu Hầu hết các doanh nghiệp đều gửi cơ sở dữ liệu qua một thủtục lưu trữ tiêu chuẩn để mở rộng các chức năng của cơ sở dữ liệu và cho phép tươngtác với hệ điều hành Vì vậy, một khi kẻ tấn công xác định được ứng dụng đang sửdụng cơ sở dữ liệu back-end nào, các cuộc tấn công sẽ được tạo ra để thi hành trêncác thủ tục lưu trữ đã được cung cấp bởi cơ sở dữ liệu vừa xác định Ngoài ra, vì cácthủ tục lưu trữ được viết trên một ngôn ngữ kịch bản đặc biệt, chúng có thể còn tồntại các lỗ hổng khác, chẳng hạn như tràn bộ đệm; lỗ hổng này cho phép kẻ tấn công
Trang 9thự thi câu lệnh từ xa hoặc thực thi với quyền quản trị của hệ thống Việc tấn cốngnày sẽ gây tác hại rất lớn nếu ứng dụng bị thực thi với quyền quản trị hệ thống.
Ví dụ: nếu ta thay đoạn mã tiêm vào dạng: ' ; EXEC xp_cmdshell ‘cmd.exe dirC: ' 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 Nếu cài SQLServer ở chế độ mặc định thì SQL Server chạy trên nền SYSTEM, tương đương mứctruy cập ở Windows
Dưới đây là một số extended stored procedure mà hacker thường hay sử dụng
để thực thi những câu lệnh xem nội dung thông tin trong máy nạn nhân:
- Xp_availablemedia: Hiển thị những ổ đĩa hiện hành trên máy
- Xp_dirtree: Hiển thị tất cả các thư mục kể cả thư mục con
- Xp_loginconfig: Lấy thông tin về chế độ bảo mật trên server
- Xp_makecab: Cho phép người sử dụng tạo các tập tin lưu trữ trên Server(hay bất cứ tập tin nào mà server có thể truy xuất)
- Xp_ntsec_enumdomain: liệt kê những domain mà server có thể truy vấn
1.3.2 Blind SQL Injection
Blind SQL Injection là một phương pháp thực hiện tấn công SQL Injection trong điềukiện các thông tin khai thác không được trình bày trực tiếp trên nội dung phản hồi từdatabase Cuộc tấn công này không phụ thuộc vào sự có mặt của các thông báo lỗi,
mà dựa vào việc sử dụng các mệnh đề điều kiện để thực hiện suy luận thông tin cầnkhai thác Cụ thể, Blind SQL Injection sử dụng chính xác các thông tin cần khai tháclàm mệnh đề điều kiện (mệnh đề suy luận) và sử dụng các phương pháp khác nhau đểđánh dấu trường hợp đúng/sai của mệnh đề đó Giống như bất kỳ tấn công SQLInjection nào, Blind SQL Injection cũng được sử dụng để khai thác, phá hủy thông tin
và trích xuất dữ liệu
Không giống như các cuộc tấn công SQL Injection thông thường, các cuộc tấncông Blind SQL Injection tốn nhiều thời gian hơn bởi vì mỗi khi có thông tin mới thìcác câu lệnh mới phải được tạo ra mà không có sự phản hồi từ ứng dụng
a Tấn công Blind SQL Injection dựa trên độ trễ phản hồi (Time-based Blind Injection)
Trang 10Các kỹ thuật tấn công dựa trên độ trễ phản hồi thường được dùng để kiểm trakhi không có cách nào khác để lấy được thông tin từ cơ sở dữ liệu Kẻ tấn công sẽchèn một đoạn mã SQL chứa các hàm của hệ quản trị cở dữ liệu hoặc một truy vấnlớn nhằm tạo ra sự chậm trễ Kẻ tấn công nhận được thông tin từ cơ sở dữ liệu bằngcách quan sát thời gian cần để có phản hồi từ máy chủ Kẻ tấn công đưa truy vấn vàocâu lệnh IF/THEN Bằng cách đo thời gian phản hồi của cơ sở dữ liệu, kẻ tấn công cóthể suy ra loại tấn công nào cần thực hiện.
Giả sử trong trường hợp ứng dụng sử dụng SQL Server làm hệ quản trị cơ sở
dữ liệu Để chèn một thời gian trễ trong câu lệnh được thực thi bởi SQL Server, kẻ
tấn công phải sử dụng các truy vấn Stack Kẻ tấn công sẽ thử thực thi câu lệnh IF EXIST (SELECT * FROM users) WAITFOR DELAY ‘0:0:10’ Đầu tiên câu lệnh này
sẽ kiểm tra cơ sở dữ liệu users có tồn tại hay không Nếu không thì sẽ hiển thị “We are unable to process your request Please try back later.” Nếu cơ sở dữ liệu này tồn tại, ứng dụng sẽ tạm dừng trong 10 giây Sau 10 giây, hiển thị thông báo “We are unable to process your request Please try back later.” Dựa vào đây kẻ tấn công sẽ
biết được cần phải làm gì tiếp theo
b Boolean-based Blind Injection
Boolean-based Blind Injection là một kỹ thuật tấn công SQL Injection suy luậndựa trên việc gửi một truy vấn SQL tới cơ sở dữ liệu, buộc ứng dụng phải trả về mộtkết quả khác nhau tùy thuộc truy vấn trả về một kết quả đúng hay sai Tùy thuộc vàokết quả, nội dung trong phản hồi HTTP sẽ thay đổi hoặc vẫn như cũ Bằng cách sosánh trang phản hồi giữa các điều kiện mà kẻ tấn công có thể suy luận truy vấn chènvào có thành công hay không
Trang 11CHƯƠNG 2 BỘ CÔNG CỤ HỖ TRỢ THỰC HÀNH TẤN CÔNG
bWAPP viết tắt của Buggy Web Application, được viết bởi Malik Mesellem,
là một phần mềm mã nguồn mở miễn phí và chứa bộ mã nguồn mô phỏng các lỗhổng không an trên ứng dụng web Nó cung cấp cho những người đam mê bảo mật,những nhà phát triển và cả học sinh, sinh viên một môi trường để khám phá và ngănngừa lỗ hổng web
bWAPP chứa hơn 100 lỗ hổng, tập hợp các lỗi phổ biến trên ứng dụng web.bWAPP được viết bằng ngôn ngữ lập trình PHP và sử dụng hệ quản trị cơ sở dữ liệuMySQL Nó có thể được cài đặt trên các nền tảng phổ biến như hiện nay nhưWindow/Linux
Hình 2 Giao diện bộ công cụ bWAPP
Trang 12CHƯƠNG 3 KIỂM THỬ SQL INJECTION 3.1 Xác định lỗ hổng trong việc kiểm tra thông tin đầu vào
Tham số được nhập vào sẽ được sử dụng để xây dựng các truy vấn SQL nên nó
sẽ cần thỏa mãn các ràng buộc cú pháp với thành phần trước và sau trong truy vấn gốc Xét đoạn mã PHP xử lý đăng nhập sau:
<?php
$uname = isset($_POST[‘uname’]) ? $_POST[‘uname’]: “”;
$passwd = isset($_POST[‘passwd’]) ? $_POST[‘passwd’]: “”;
$query = “SELECT * FROM tbl_uers WHERE username = “ ” +
$uname + “” AND password = “” +$passwd + “”;
$qr = @mysql_query($query);
?>
Xâu truy vấn SQL được sinh ra trong trường hợp trên sử dụng trực tiếp giá trịngười dùng nhập vào, do đó mô hình xây dựng truy vấn dạng này được gọi chung làxây dựng truy vấn động (dynamic query) Truy vấn thu được sẽ có dạng như sau:
SELECT * FROM tbl_users WHERE username = ‘$uname’ AND passwd =
‘$passwd’;
Trong đó hai giá trị $uname và $passwd do người dùng nhập vào Khi thực
hiện nhập giá trị username là admin’ OR ‘1’ = ‘1 , password là 1234’ OR ‘1’ = ‘1 truy vấn động thu được sẽ như sau: SELECT * FROM tbl_users WHERE username =
‘admin’ OR ‘1’ = ‘1’ AND passwd = ‘123’ OR ‘1’ = ‘1’;Trường hợp này việc xác
thực đã thành công vì mệnh đề WHERE luôn đúng
Tùy thuộc vào câu truy vấn gốc mà các tham số được chèn vào sẽ có vị trí khácnhau trong truy vấn đó Ứng với từng trường hợp đó, có các mô hình chèn tham sốsau:
- Chèn vào giữ truy vấn: là mô hình chỉ đơn thuần thao tác với các tham
số, không hề tác động đến cấu trúc và các thành phần của truy vấn gốc
Trang 13- Chèn và ngắt truy vấn: là mô hình chèn truy vấn phổ biến nhất, truy vấn
được chèn vào sẽ bao gồm thêm ở cuối các ký tự chú thích nhằm ngắttruy vấn tại đó, vô hiệu hóa các phần từ trong truy vấn gốc nằm ở phíasau vị trí tham số Đoạn mã PHP được cải tiến như sau:
<?php
$uname = isset($_POST[‘uname’]) ? $_POST[‘uname’]: “”;
$passwd = isset($_POST[‘passwd’]) ? $_POST[‘passwd’]: “”;
OR đầu tiên Ví dụ trường password để trống, truy vấn có thể là SELECT * FROM tbl_users WHERE username = ‘admin’ OR ‘1’ = ‘1 ’ AND passwd = ‘’;
Một số ký tự chú thích hay được sử dung:
Trang 143.2 Xác định điểm yếu SQL Injection dựa trên phản hồi
Ứng dụng Web là một ví dụ sử dụng kiến trúc Client/Server Trình duyệt củangười dùng (Client) gửi tới máy chủ một yêu cầu và chờ đợi phản hồi Máy chủ nhậnđược yêu cầu, và tạo ra một phản hồi gửi lại cho người dùng Rõ ràng phải có một sựthống hiểu biết nào đó giữa hai bên, nếu không người dung gửi một yêu cầu lên máychủ sẽ không biết đó là yêu cầu gì để phản hồi Ở đây ứng dụng sẽ dùng một giaothức để dùng làm trao đổi giữa hai bên, trong trường hợp này sử dụng giao thứcHTTP Hai phương thức thông điệp yêu cầu phổ biến nhất là GET và POST
Cấu trúc thông điệp GET và POST có nhiều điểm khác nhau, song khi tiếnhành sửa đổi và chènn nội dung cần chú ý tới vị trí của chuỗi truy vấn Chuỗi truy
vấn này chứa các tham số được gửi lên máy chủ, chuỗi này có dạng sau: ?var_1 = val_1 and var_2 &…&var_n = val_n.
Trang 15Trong thông điệp GET chuỗi truy vấn nằm ở đầu thông điệp, còn trong POST
nó nằm ở cuối thông điệp
Xet một trang thông tin có đường dẫn:
http://www.victim.com/showproducts.php?category=bike
Trang showprodcts.php sẽ nhận được một tham số category khi bạn nhấp vàođường link này Ứng dụng Web sẽ dựa vào tham số này để phản hồi lại cho ngườidùng, tùy thuộc vào tham số category ứng dụng sẽ trả về các sản phẩm khác nhau.Giả sử, khi truyền vào một tham số category là attacker mà trong ứng dụng không có,đường dẫn lúc này là :
http://www.victim.com/showproducts.php?category=attacker
Phản hổi của máy chủ lúc này là:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/victim.com/showproducts.php on line 34
Một cách khác để phát hiện Web có mắc lỗi SQL Injection hay không là thêmcác siêu ký tự vào câu truy vấn trong hệ quản trị cơ sở dữ liệu, chẳng hạn dấu nháyđơn (‘), các ký tự chú thích ( , #, /**?)… và chờ sự phản hồi của ứng dụng
Sau khi thử thêm dấu nháy đơn (‘) vào cuối giá trị tham số category, máy chủphản hồi lại như sau:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''attacker''' at line 1