Xây dựng một webservice đơn giản

Một phần của tài liệu Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service (Trang 55 - 66)

e) Kết luận

3.3Xây dựng một webservice đơn giản

 Mục tiêu : xây dựng một web service đơn giản với chức năng cộng 2 số, chuyển xâu kí tự nhập vào thành chuỗi in hoa.

 Tiến hành :

 Xây dựng Web Service :

- Tạo Web Service

 Mở Visual Studio 2008, chọn File\New\Project\

SVTH: Vĩnh Thái Cường - 49THM Page 56

 Chọn ASP.NET Web Service Application ở cột bên phải.

 Đặt tên cho Project là : TEST

Xây dựng đoạn mã sau :

[WebMethod]

public int ADD(int a, int b) {

return a + b; }

[WebMethod]

public string Upcase(string st) {

return st.ToUpper(); }

- Kiểm tra web service vừa tạo :

 Nhấn F5, chương trình sẽ tự động mở trình duyệt tại địa chỉ :

http://localhost:3861/Test.asmx. Trình duyệt hiển thị 2 dịch vụ là ADD và Upcase của web service vừa tạo.

SVTH: Vĩnh Thái Cường - 49THM Page 57

 Kiểm tra từng dịch vụ :

Kết quả : <int>3</int>

Kết quả : <string>SQL INJECTION</string>

 Như vậy 2 dịch vụ của web service ta vừa tạo hoạt động tốt.

 Chú ý : Trang http://localhost:3861/Test.asmx?WSDL là trang chứa thông tin mô tả về web service vừa tạo. Các client phải liên kết đến trang này để lấy dịch vụ.

SVTH: Vĩnh Thái Cường - 49THM Page 58  Xây dựng client để thử khả năng kết nối và hoạt động của web

service :

- Tạo trang TEST.php :

<form method="post" action="xulycong.php"> a <input type="text" name="a_" /> b<input type="text" name="b_" />

<input type="submit" value="Kết quả" /> </form>

<form method="post" action="xulychuoi.php"> Nhập chuỗi<input type="text" name="st_" /> <input type="submit" value="Kết quả" /> </form>

- Tạo trang Xulycong.php (adsbygoogle = window.adsbygoogle || []).push({});

<?php

$a = $_POST["a_"]; $b = $_POST["b_"];

require("libs/nusoap.php");

$client = new nusoap_client ("http://localhost:3861/Test.asmx?WSDL",true); $temp = $client->call("ADD",array("a"=>$a,"b"=>$b));

$kq = $temp["ADDResult"]; echo $kq;

SVTH: Vĩnh Thái Cường - 49THM Page 59 - Tạo trang Xulychuoi.php

<?php

$st = $_POST["st_"]; require("libs/nusoap.php");

$client = new nusoap_client("http://localhost:3861/Test.asmx?WSDL",true); $temp = $client->call("Upcase",array("st"=>$st));

$kq = $temp["UpcaseResult"]; echo $kq;

?>

- Thử kết quả trên CLIENT :

Kết quả : 3 Kết quả : SQL INJECTION

3.4 Tổng kết chương

Ví dụ trên cho ta thấy được sự đơn giản và hiệu quả khi xây dựng web service. Một client viết bằng php vẫn có thể kết nối đến webservice viết bằng ASP.NET ngôn ngữ C#. Tương tự, một client viết bằng JAVA vẫn có thể liên kết được đến webservice viết bằng php … Điều này quả thật rất tiện lợi và hữu ích khi mà internet đang tràn ngập các chuẩn, qui cách không thống nhất với nhau.

SVTH: Vĩnh Thái Cường - 49THM Page 60

CHƯƠNG 4

PHÒNG CHỐNG SQL INJECTION BẰNG WEB SERVICE

4.1 Đặt vấn đề

Trên thực tế, rất nhiều phương pháp đã được áp dụng để phòng chống các cuộc tấn công SQL Injection. Các phương pháp này đều có ưu – nhược điểm riêng. Tuy nhiên, tựu chung lại vẫn chưa giải quyết triệt để được lỗ hổng bảo mật này.

Web Service là một giải pháp được đề xuất để thay thế cho các phương pháp phòng vệ cũ. Với ưu điểm dễ sử dụng, tương thích với mọi loại ngôn ngữ lập trình, web service hứa hẹn sẽ là một giải pháp hoàn hảo để chống lại các cuộc tấn công SQL injection.

4.2 Cơ sở lý thuyết

Kỹ thuật này được sử dụng để phát hiện và ngăn chặn các cuộc tấn công SQL Injection một cách hiệu quả. Điểm cơ bản của kỹ thuật này là đối với mỗi ứng dụng, khi trang đăng nhập thực hiện việc kiểm tra tính đúng đắn của người đăng nhập, nó sẽ phát hiện và ngăn chặn cuộc tấn công SQL Injection mà không làm ảnh hưởng đến những truy cập hợp pháp. Ngoài ra, kỹ thật này đã chứng minh được tính hiệu quả, tính kinh tế khi chỉ tốn một khoản chi phí thấp trên các ứng dụng web.

SVTH: Vĩnh Thái Cường - 49THM Page 61

Hình 4-1. Mô hình phương pháp phát hiện và phòng chống SQL bằng Webservice

Kỹ thuật được đề xuất này bao gồm mô hình lọc 2 tầng để ngăn chặn các cuộc tấn công SQL Injection :

 Mô hình lọc Active Guard :

Mô hình lọc Active Guard ở tầng ứng dụng xây dựng một bộ phát hiện nhạy bén, mục đích là pháp hiện và ngăn chặn các kí tự nhạy cảm hay các siêu kí tự, từ đó ngăn chặn các cuộc tấn công độc hại truy cập cơ sở dữ liệu. Mô hình này gồm 1 dịch vụ là killCharslàm nhiệm vụ trên.

 Mô hình lọc Service Detector :

Mô hình lọc Service Detector ở tầng ứng dụng xác thực dữ liệu đầu vào. Nó bao gồm 2 dịch vụ là DB_2_Xml_generatorXPATH_Validator. (adsbygoogle = window.adsbygoogle || []).push({});

- DB_2_Xml_generator : được sử dụng để tạo ra một lưu trữ riêng tạm thời với định dạng XML từ database chính, có thể xem đây là một database phụ.

- XPATH_Validator : được sử dụng để so sánh dữ liệu người dùng nhập vào (sau khi đã qua bộ lọc) với dữ liệu trong database phụ.

SVTH: Vĩnh Thái Cường - 49THM Page 62

4.3 Nguyên tắc hoạt động

- Người dùng nhập dữ liệu đăng nhập.

- Bộ lọc Active Guard lọc dữ liệu đầu vào từ người dùng, loại bỏ các kí tự đặc biệt (‘ hay ;), các từ nhạy cảm (select, union, order by, xp_ …) - Bộ lọc Service Detector tạo database phụ XML bằng dịch vụ

DB_2_Xml_generator.

- Service Detector so sánh dữ liệu sau khi đã được lọc và dữ liệu trong database phụ bằng dịch vụ XPATH_Validator. Nếu dữ liệu trùng khớp,

XPATH_Validator sẽ trả về cờ mang giá trị 1, ngược lại, nó trả về cờ mang giá trị 0.

- Với cờ mang giá trị 1, người dùng được xác nhận là hợp lệ và được phép truy cập ứng dụng web.

Với cờ mang giá trị 0, người dùng là bất hợp pháp và bị từ chối truy cập.

Nếu script xây dựng một câu truy vấn SQL bằng việc nối các câu lệnh SQL với chuỗi nhập từ người dùng, thì chỉ cần đoạn mã SQL Injection đúng cú pháp, ta không thể pháp hiện ra sự giả mạo này. Việc nối chuỗi là cốt lõi của phương pháp tấn công Injection. Vì vậy, ta so sánh mọi dữ liệu nhập từ người dùng một cách cẩn thận với Service Detector ( Mô hình lọc cấp 2). Nếu dữ liệu người dùng và các dữ liệu nhạy cảm được chứng thực thì ta cho phép thực thi các câu lệnh SQL. Các kỹ thuật chống SQL Injection hiện tại cho phép việc truy cập trực tiếp đến cơ sở dữ liệu sau khi xác thực truy vấn. Kỹ thuật “Xác thực XPATH hướng dịch vụ web” (Web Service Oriented XPATH Authentication) không cho phép điều đó.

SVTH: Vĩnh Thái Cường - 49THM Page 63

4.4 Triển khai thực tế.

Ta xây dựng 3 dịch vụ của webservice :

- Db_2_XML - Xpath_XML_Validation - killChars 4.4.1 Dịch vụ killChars // Bộ lọc Active Guard [WebMethod]

public string killChars(string strWords) {

string[] array = new string[12]; array[0] = "select "; array[1] = "--"; array[2] = "drop "; array[3] = ";"; array[4] = "insert "; array[5] = "delete "; array[6] = "xp_"; array[7] = "'"; array[8] = "union "; array[9] = "order by"; array[10] = "or "; array[11] = "and ";

strWords = strWords.ToLower();

for (int i = 0; i < array.Length; i++)

strWords = strWords.Replace(array[i], ""); return strWords;

}

- Đầu vào : Dữ liệu nhập từ người dùng. - Đầu ra : Dữ liệu sau khi đã được lọc.

SVTH: Vĩnh Thái Cường - 49THM Page 64

4.4.2 Dịch vụ Db_2_XML

// Bộ lọc Service Detector - tạo dữ liệu XML từ database chính + chứng thực thông tin người dùng nhập vào

[WebMethod]

public void Db_2_XML(string db_type, string server_, string

database_, string uid_, string pwd_, string table_, string column_user,

string column_pass) (adsbygoogle = window.adsbygoogle || []).push({});

{

// Kiểm tra loại database

if (db_type == "mysql") db_type = "{MySQL ODBC 5.1 Driver}"; else if (db_type == "sqlserver") db_type = "{sql server}";

// Tạo kết nối tới database

string ConnStr = "Driver=" + db_type + ";server=" + server_ +

";database=" + database_ + ";uid=" + uid_ + ";pwd=" + pwd_ + ";option=3"; OdbcConnection con = new OdbcConnection(ConnStr);

con.Open();

OdbcCommand cmd = new OdbcCommand("select

"+column_user+","+column_pass+" from "+table_+"", con); OdbcDataAdapter da = new OdbcDataAdapter();

da.SelectCommand = cmd;

DataSet dst = new DataSet("database"); da.Fill(dst, "table");

// Tạo thư mục chứa file XML với cấu trúc .\Database\tên server\tên database\

Directory.CreateDirectory(Server.MapPath("Database\\" + server_ + "\\" + database_ + "\\"));

// Tạo file XML_USER.xml vào thư mục đã vừa tạo ở trên dst.WriteXml(Server.MapPath("Database\\" + server_ + "\\" + database_ + "\\XML_TBL_USER.xml"));

}

- Đầu vào :

 db_type : loại cơ sở dữ liệu (mysql, sqlserver …)

 server_ : tên server.

 database_ : tên database.

 uid_ : tên đăng nhập server.

 Pwd_ : mật mã đăng nhập server.

 table_ : tên bảng dữ liệu

SVTH: Vĩnh Thái Cường - 49THM Page 65

 column_pass : tên cột chứa mật khẩu đăng nhập website. - Đầu ra : tạo file XML_USER trong thư mục .\Database\tên server\tên

database\

4.4.3 Dịch vụ XPath_XML_Validation

// Bộ xác thực người dùng XPATH XML VALIDATION [WebMethod(EnableSession = true)]

public int XPath_XML_Validation(string server_, string database_, string column_user, string column_pass, string user, string pwd)

{

// Đọc file XML_USER.xml tại thư mục .\Database\tên server\tên database\ (adsbygoogle = window.adsbygoogle || []).push({});

XPathDocument xpathdoc = new

XPathDocument(Server.MapPath("Database\\" + server_ + "\\" + database_ + "\\XML_USER.xml"));

// Tạo con trỏ chạy

XPathNavigator navi = xpathdoc.CreateNavigator(); // Duyệt tìm dữ liệu thích hợp

XPathExpression expr =

navi.Compile("//database//table["+column_user+"='" + user + "' and "+column_pass+"='" + pwd + "']");

XPathNodeIterator nodes = navi.Select(expr); return nodes.Count;

}

- Đầu vào :

 server_ : tên server.

 database_ : tên database.

 column_user : tên cột chứa tên đăng nhập website.

 column_pass : tên cột chứa mật khẩu đăng nhập website.

 user : tên đăng nhập đã được lọc.

 pwd : mật mã đăng nhập đã được lọc. - Đầu ra : trả về giá trị 1 hoặc 0.

SVTH: Vĩnh Thái Cường - 49THM Page 66

Một phần của tài liệu Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service (Trang 55 - 66)