Trao đổi với tôi

http://www.buidao.com

7/28/09

[Hacking] Ngôn Ngữ Web và Các Vấn Đề Bảo Mật

Ngôn Ngữ Web và Các Vấn Đề Bảo Mật


Link:http://thegioimang.org/forum/bao-mat-cho-microsoft/257-ngon-ngu-web-va-cac-van-de-bao-mat.html

web trích thông tin của một người dùng khi nhận tên đăng nhập và mật khẩu của người đó, bằng cách cung cấp thông tin đặc biệt đánh lừa hệ thống, người dùng có thể trích thông tin của tất cả các user khác.




<form action> - Thuộc tính Action. Ta dùng thuộc tính này để chỉ định một trình thực thi trên web server cho đối tượng form. Ví dụ: <form action = "/login.cgi"> ... Khi biết được tên chương trình, ta có thể tìm hiểu thêm các thông tin có giá trị về web server, về thư mục hiện hành của chương trình.


<form method> - Phương thức của form, định nghĩa cách thức dùng để gửi thông tin người dùng nhập vào đến web server cho chương trình xử lý. Khi hiểu được cách thức gửi thông tin (POST và GET), hacker có thể theo dõi và bắt các thông tin đựơc gửi trên mạng, thậm chí có thể thay đổi chúng và gửi đi với giá trị khác để tạo ra những kết quả khó lường.



<script language=<variable>>: Biến truyền vào là ngôn ngữ script phía client, chẳng hạn như: javascript, vbscript, XML.. Khi thay đổi loại ngôn ngữ, hacker có thể vượt qua các bộ lọc kiểm tra.








<input> - Edit control để nhập thông tin. Nếu ứng dụng web không xử lý tốt các thông tin nhập vào, hacker có thể lợi dụng nhập vào các giá trị đặc biệt đánh lừa hệ thống và tạo nên những kết quả không mong muốn. Những giá trị username và password dùng trong kĩ thuật SQL Injection là ví dụ điển hình.







<input type=hidden> - Kiểu đối tượng input. Một số trang web dùng đối tượng input với thuộc tính hidden để chứa giá trị định trước như giá mua hàng ở các trang shopping card. Lợi dụng đặc điểm này, hacker có thể thay đổi giá trị này thành giá trị mong muốn và gửi đến web server. Ở các trang web buôn bán, nếu không có những xử lý giá trị phía server, hacker có thể mua được những món hàng với giá giảm đáng kể.








<input maxlength=<variable>>: Giá trị maxlength xác định chiều dài của giá trị nhập vào đối tượng input. Hacker có thể thay đổi giá trị maxlength cho phép nhập vào những giá trị hoặc chuỗi rất dài. Nếu chúng không được xử lý thích hợp, chúng có thể gây nên những lỗi như tràn bộ đệm, thậm chí có thể làm hỏng web server.





<input size=<variable>>: Tương tự như giá trị maxlength.





<applet> - Java applet. Thuộc tính này dùng để hiện và chạy thẻ java applet. Java chạy và gửi thông tin thường dưới dạng plain text nên có thể dùng các chương trình theo dõi gói tin để bắt các thông tin này. Java byte-code có thể dịch ngược để xem mã nguồn.






<object> Thuộc tính này dùng để thể hiện các đối tượng ActiveX và Java applet. Lợi dụng thuộc tính này, hacker có thể gửi email có nhúng HTML và đánh lừa người dùng chạy các ActiveX control có thể đoạt quyền điều khiển hệ thống. Đây cũng là một trong những cách tốt nhất người ta lợi dụng để lan truyền virus trên mạng.





<embed> Thuộc tính này được dùng phối hợp với thẻ <object> để nhúng các đối tượng ActiveX...





2. DHTML (Dynamic HTML)




DHTML là phiên bản mở rộng của HTML có phần mở rộng dạng .dhtml. Nó giúp tăng cường tính tương tác của các đối tượng điều khiển trong trang HTML tĩnh bằng cách cho phép người ta dùng các script vbscript hoặc javascript điều khiển chúng. Ví dụ một thẻ image để nhúng ảnh vào trang web có thể nhận biết khi nào người dùng di chuyển chuột trên nó bằng cách cài đặt hàm xử lý sự kiện OnMouseOver, khi đó thông qua những xử lý thích hợp sẽ làm đối tượng hình ảnh trở nên sống động hơn. Nhìn chung, bên cạnh những mở rộng như tạo những hiệu ứng MouseOver, chuỗi chữ di chuyển động, thay đổi màu sắc..., các khía cạnh bảo mật của DHTML tương tự như HTML vì nó dựa trên nền tảng HTML. Tuy nhiên hiện nay các lập trình viên web ít chọn DHTML vì có một số trình duyệt không hỗ trợ tốt cho nó, điển hình như Netscape.







3. XML (Extensible Markup Language) - Ngôn ngữ đánh dấu mở rộng



Ngôn ngữ XML mới phát triển trong thời gian gần đây và có thể sẽ được phổ biến rộng rãi trong tương lai, chẳng hạn như ở các ngôn ngữ .NET. Không giới hạn và định nghĩa sẵn như HTML, XML cho phép người dùng tự định nghĩa ra các thành phần riêng và mở rộng tuỳ ý. Tệp dữ liệu XML có phần mở rộng dạng .xml.



Bộ phận quan trọng nhất trong ngôn ngữ XML là bảng định nghĩa DTD (Document Type Definitions). DTD dùng để định nghĩa các thẻ mở và đóng của một tệp XML, giúp người xem có một cái nhìn tổng quát về dữ liệu đang lưu trữ.



Ví dụ ta cần định nghĩa cấu trúc dữ liệu Danh Sách Sinh Viên, ta tạo một tệp DTD dssv.dtd như sau:








<!ELEMENT DSSV (SV*)>



<!ELEMENT SV(MASV, TEN, NS, LOP*)>



<!ELEMENT MASV(#PCDATA)>



<!ELEMENT TEN(#PCDATA)>



<!ELEMENT NS(#PCDATA)>




<!ELEMENT LOP(#PCDATA)>







Đây là ví dụ dữ liệu trong tệp XML:







<?xml version="1.0" ?>



<!DOCTYPE DSSV PUBLIC "." "dssv.dtd">




<DSSV>



<SV>



<MASV>95001</MASV>



<TEN>W_Hat</MASV>



<NS>19/11/1077</MASV>




<LOP>TH95</MASV>



</SV>



<SV>



.....



</SV>




</DSSV>







Dữ liệu trên thể hiện thông tin của một sinh viên với mã số, tên, ngày sinh và lớp. Kí hiệu * nằm sau SV và LOP chỉ định dữ liệu có thể chứa nhiều sinh viên, mỗi sinh viên có thể có nhiều lớp.







4. Perl (Pratical Extraction and Report Language)



Perl là ngôn ngữ lập trình cấp cao được phát triển từ năm 1987. Rất mạnh, tiện dụng và đồng thời là ngôn ngữ được phổ biến miễn phí, hỗ trợ cho hầu hết các hệ thống từ Winđowsx/NT/2k/XP, các phiên bản biến thể của Unix đến hệ thống AS/400, MacOS, Novell NetwarePerl...Perl đã và đang được sử dụng rộng rãi hiện nay trên internet.




Perl được dùng chủ yếu cho các xử lý phía server, tuy nhiên ta cũng có thể dùng perl để viết các ứng dụng client, thậm chí có thể tạo nên ứng dụng chạy độc lập để thực hiện một tác vụ tính toán nào đó.



Trên web server, perl thường được thực thi với CGI tạo nên cơ chế xuất thông tin ra trình duyệt web. Hãy xem ví dụ dùng perl để xử lý các thông tin nhập vào từ người dùng trong đoạn html dưới đây:







<form method=POST action="/admin/login.pl"></form>



<html>



Username:




<input value="" size=80 maxlength=80 name="username">



Password:



<input value="" size=80 maxlength=80 name="password">



<input type=submit value="Login">



</html>








Sau khi người dùng nhập tên, mật khẩu và nhấn nút Login những thông tin này sẽ được gửi đến chương trình perl có tên login.pl nằm ở thư mục /admin/ trên web server. Chương trình login.pl sau khi xử lý sẽ gửi kết quả ngược về web client.







Khi sử dụng perl để thực hiện các xử lý phía server, ta cần lưu ý một số điểm quan trọng sau có khả năng gây nên những nguy cơ về bảo mật nghiêm trọng:







a - Tránh thực thi các web server dưới quyền quản trị (root trong Unix và adminitrator trong Windows). Khi các script ở web server được chạy có quyền quản trị sẽ rất nguy hiểm nếu ai đó dùng nó để thực hiện các lệnh điều khiển hệ thống. Các bạn có thể thấy script cgi-telnet là một ví dụ cụ thể.



b - Luôn thực hiện tiền xử lý các thông tin người dùng nhập vào, như các giá trị tên người dùng, mật khẩu, giá cả...Tạo một chuỗi các kí tự hợp lệ tương ứng với thông tin cần nhập và lọc ra những kí tự được nhập không chính xác. Chẳng hạn với tên và mật khẩu người dùng, ta có thể giới hạn ở các kí tự hợp lệ sau: "0..9", "a..z", "A..Z"; không cho phép hoặc lọc bỏ các kí tự đặc biệt như: "/\+)({}[]'-_=.|" ... Một ví dụ khác về việc dùng perl thực hiện tiền xử lý với email người dùng, với yêu cầu email phải có kí hiệu @ và dấu chấm "." ở ít nhất là phần sau dấu @:








if ($email !~ /^[\w-]+\@[\w.-]+$/)



{



print "<br>#Error in your email. Please re-enter<br>";



}else




{



# thực hiện xử lý đối với thông tin email hợp lệ;



}







c - Hạn chế không cho phép thực thi các lệnh hệ thống (shell command) như open(), fork(), system(), exec() hoặc cho thực hiện sau khi đã kiểm tra chặt chẽ các tham số truyền vào. Ở các hệ thống bảo vệ lỏng lẻo, hacker có thể lợi dụng truyền các tham số không thích hợp vào các hàm trên để thực hiện các lệnh xem thông tin và điều khiển hệ thống.



d - Trên các hệ thống Unix, cần thiết lập các thông số $PATH và $IFS bằng các giá trị chính xác cụ thể, tránh dùng các biến môi trường.




Ví dụ ta đặt như sau:







$ENV{"PATH"}="/bin:/usr/bin:/opt";



$ENV{"IFS"}="/";







Việc chỉ định không rõ ràng các thông tin trên có thể tạo điều kiện cho hacker sửa đổi chúng và bắt các chương trình của chúng ta phải thực thi một chương trình nguy hiểm nào đó ở nơi khác thay vì tại vị trí ta mong muốn.




e - Kiểm tra kích thước và chiều dài của các thông tin người dùng nhập vào hoặc dùng biến $ENV{CONTENT_LENGTH} để hạn chế chiều dài của chuỗi dữ liệu cho các yêu cầu GET/POST. Nếu không được kiểm tra chính xác, hacker có thể gửi đi một lượng dữ liệu có giá trị rất lớn hoặc rất dài có thể gây nên các lỗi tràn bộ đệm, hỏng web server và thậm chí tìm được các điều kiện phát sinh lỗi tràn bộ đệm và thực thi các lệnh nguy hiểm từ xa.



f - Tránh cho phép chỉ định đường dẫn cụ thể ở các trường dữ liệu hoặc ở các tham số truyền vào các chương trình. Chỉ nên cho phép các đường dẫn mang tính tương đối, cắt bỏ các giá trị có dạng dot dot ".." hoặc slash "/\". Ở rất nhiều chương trình web không kiểm tra đúng đã cho phép người dùng nhập các tham số ví dụ như /../../../../etc/passwd (Unix) hoặc /../../../winnt/repair/sam._ (NT/2k) và dễ dàng lấy được các thông tin về mật khẩu.



g - Sử dụng khả năng taint checking của perl để theo dõi và kiểm tra giá trị của các biến.



h - Các chương trình perl được lưu trữ dưới dạng text đơn giản do đó có thể dễ dàng bị xem mã nguồn và lấy các thông tin có giá trị khác tên, mật khẩu truy cập cơ sở dữ liệu...nếu hacker đoạt được quyền điều khiển hệ thống hoặc có quyền xem hệ thống file. Ta có thể dùng một số chương trình ví dụ như perl2exe cho phép chuyển đổi các tệp perl dạng text sang dạng chương trình thực thi .exe, như vậy có thể tránh được việc bị xem mã nguồn và không còn cần trình thông dịch perl khi chạy.







5. PHP (Personal Home Page)




Được phát triển từ năm 1995 và dần được bổ sung qua một số phiên bản, cho đến nay PHP trở thành một trong những ngôn ngữ script phía server phổ biến nhất bên cạnh Perl và ASP (Active Server Pages). Tương tự như Perl, PHP có dạng cú pháp, câu lệnh đơn giản, dễ hiểu - đặc biệt thích hợp với các lập trình viên có hiểu biết về ngôn ngữ C/C++ - đồng thời có ưu điểm là thực thi rất nhanh và có thể chạy ở máy client hoặc như một ứng dụng độc lập. Hiện nay người ta thường dùng PHP để thực hiện các tác vụ xử lý phía server ở các web server trên nền Unix, điển hình như Apache. Các chương trình PHP thường có phần mở rộng là .php, .php3, .php4; mã PHP cũng có thể nhúng vào một trang HTML. Hãy xem ví dụ sau thực hiện in lên trình duyệt một chuỗi kí tự:







<!-- PHP Example in HTML



<html>



<?php



echo "<br>Hello World!<br>";




?>



</html>







Chú ý thẻ <? và ?> dùng để đánh dấu nơi bắt đầu và kết thúc mã PHP.



Cho đến nay, những điểm yếu của PHP được phát hiện tương tự như ở ngôn ngữ Perl. Đặc biệt khi sử dụng PHP để nhận các thông tin nhập từ người dùng thông qua trình duyệt và xử lý cơ sở dữ liệu bên dưới; hoặc thực thi các lệnh hệ thống như system(), shellexec(), exec(), passthru()...ta cần chú ý thực hiện việc kiểm tra và lọc những dữ liệu truyền vào không hợp lệ để tránh trường hợp người dùng nhập dữ liệu sai, đánh lừa hệ thống sinh ra những kết quả không mong muốn, thậm chí thực thi các lệnh từ xa.




Ví dụ sau thực hiện việc kiểm tra đơn giản trên chuỗi $value có kiểu số, dùng hàm định nghĩa sẵn preg_match():







if (preg_match("/^[0-9]+$/i", $value))



echo "Invalid number!\n";



return 1;



break;








Các bạn tham khảo thêm các thông tin về PHP tại http://www.php.net/







6. ColdFusion



ColdFusion (CF) là hệ thống phát triển ứng dụng web của công ty Allaire (http://www.allaire.com) với phiên bản mới nhất hiện nay là 5.0. CF có 3 thành phần chính bao gồm: Application Server, Markup Language và Studio. Chúng ta sẽ tìm hiểu sơ lược qua từng thành phần này.








Application Server (Máy chủ ứng dụng) - Đây là thành phần chính của ColdFusion có thể chạy trên các nền Windows và Unix. Application Server chạy trên web server và xử lý các yêu cầu từ các trang mã ColdFusion.







Markup Languge (CFML) - Là ngôn ngữ web phía server được phát triển tuân theo quy ước HTML bao gồm các thẻ và thuộc tính của thẻ. CFML được dùng kết hợp với Application Server tạo nên các các ứng dụng web như các shopping card, quản lý tài khoản ngân hàng trực tuyến...Chương trình ColdFusion có phần mở rộng bắt buộc là .CFM.



Tương tự như Perl và PHP, các tệp CFM được lưu trữ ngầm định dưới dạng text đơn giản do đó chúng có thể dễ dàng bị xem mã nguồn dẫn đến lộ những thông tin quan trọng. Về mặt cấu trúc CFM giống như HTML ở chổ dùng các thẻ tag để thực hiện hầu hết các tác vụ chẳng hạn như kết nối cơ sở dữ liệu, hỗ trợ POP (Post Office Protocol) và SMTP (Simple Mail Transfer Protocol), COM (Component Object Model). Ngoài ra, có rất nhiều third-party add-ons được viết ra để tăng cường các tính năng của ColdFusion, tuy nhiên chúng thường không được cung cấp miễn phí.



Ví dụ sau dùng CFM để mô tả một câu lệnh rút trích dữ liệu:








<CFQUERY DATASOURCE="QLSV" NAME="SV">



SELECT MaSV, NameSV, BD



FROM DSSV WHERE MaSV = #URL.MaSV#



</CFQUERY>







Thuộc tính DATASOURCE của thẻ <CFQUERY> xác định một ODBC data source (nguồn dữ liệu). Thuộc tính NAME được dùng sau này khi cần trình bày kết quả lên browser.




Khi thực hiện trên browser, URL có dạng như sau:



http://www.anysite.com/cfm/getdata.cfm?MaSV=TH001



Như vậy, nếu các tham số truyền vào không được kiểm tra và lọc tốt, người dùng có thể truyền vào các giá trị không chuẩn làm thay đổi điều kiện của câu lệnh SELECT, dẫn đến việc họ có thể lấy được toàn bộ dữ liệu của các sinh viên khác.



Để trình bày kết quả của câu lệnh SELECT trên, hãy tham đoạn mã sau:







<HEAD>Thong Tin Sinh Vien</HEAD>




<CFOUTPUT QUERY="SV">



<LI>#NameSV#, #BD#, (#MaSV#)</LI><BR>



</CFOUTPUT>












Studio - Cung cấp một môi trường cho người dùng phát triển các ứng dụng web.







Cho đến nay, có 2 vấn đề bảo mật thường gặp với CFM là việc lọc không tốt các tham số truyền vào và cung cấp sẵn nhiều script ví dụ (như openfile.cfm, exprcalc.cfm) mà hacker có thể lợi dụng để dùng cho mục đích của mình như upload file, xem nội dung file, điều khiển các dịch vụ web hoặc thậm chí thực thi các lệnh nguy hiểm khác.



Giải pháp đơn giản để giảm nguy cơ bị tấn công là xóa bỏ các script cung cấp sẵn không cần thiết hoặc cập nhật các bản sửa lỗi cho các script và lọc kĩ các giá trị truyền vào.







7. ASP (Active Server Pages)



ASP là môi trường ngôn ngữ script phía server của Microsoft phát triển chủ yếu phục vụ cho các web server IIS (Internet Information Server). ASP có thể được dùng kết hợp với HTML, mã script và các thành phần ActiveX phía server tạo nên các trang thông tin có nội dung động; thực thi các lệnh hệ thống, kết nối cơ sở dữ liệu, COM...




Ngôn ngữ ngầm định dùng cho ASP là VBScript, đây là phiên bản script của ngôn ngữ Visual Basic quen thuộc. Tương tự một số ngôn ngữ script khác, có 2 dạng VBScript dùng cho ASP. Với script phía server, ta đặt mã lệnh trong thẻ <%@ và %>; phía client, ta dùng thẻ HTML <script>

(sưu tầm )