Advertisement

Responsive Advertisement

Advent of Cyber 2 [2020] - Tryhackme - Write Up - Day 5

 

Task 10  [Day 5] Web Exploitation Someone stole Santa's gift list!

Sau cuộc tấn công năm ngoái, ông già Noel và đội bảo vệ đã làm việc chăm chỉ để hồi sinh cổng thông tin cá nhân của ông già Noel. Do đó, 'Diễn đàn của ông già Noel 2' đã hoạt động.

Sau cuộc tấn công, nhật ký đã tiết lộ rằng ai đó đã tìm thấy bảng điều khiển của ông già Noel trên trang web và đăng nhập vào tài khoản của anh ta! Sau khi làm như vậy, họ có thể kết xuất toàn bộ cơ sở dữ liệu danh sách quà tặng, nhận tất cả các món quà năm 2020 trong tay. Một kẻ tấn công đã đe dọa sẽ xuất bản một tệp tin wishlist.txt, chứa tất cả thông tin, nhưng thật hạnh phúc, đối với chúng tôi, anh ta đã bị CBI (Cục Điều tra Giáng sinh) bắt trước đó. Trên MACHINE_IP:8000 bạn sẽ tìm thấy bản sao của trang web và mục tiêu của bạn là tái tạo các hành động của kẻ tấn công bằng cách bán hết danh sách quà tặng!

Tác vụ được tạo bởi Swafox

https://i.imgur.com/ec9T8ya.png

SQL Injection là gì?

Một cuộc tấn công SQL injection (SQLi) bao gồm việc đưa một truy vấn SQL vào ứng dụng web từ xa. Khai thác SQL injection thành công có thể đọc dữ liệu nhạy cảm từ cơ sở dữ liệu (tên người dùng và mật khẩu), sửa đổi dữ liệu cơ sở dữ liệu (Thêm / Xóa), thực hiện các hoạt động quản trị trên cơ sở dữ liệu (chẳng hạn như tắt cơ sở dữ liệu) và trong một số trường hợp, thực thi các lệnh trên điều hành hệ thống.

Nền tảng SQL

SQL là một ngôn ngữ được sử dụng trong lập trình để nói chuyện với cơ sở dữ liệu. Đó là một ngôn ngữ cực kỳ tiện dụng giúp các nhà phát triển dễ dàng tổ chức dữ liệu theo nhiều cấu trúc khác nhau. Thật không may, lợi ích luôn đi kèm với một nhược điểm; thậm chí một chút cấu hình sai trong mã SQL có thể dẫn đến một lỗi SQL tiềm năng.

Tôi khuyên bạn nên nhanh chóng xem qua hướng dẫn lệnh SQL này để làm quen với chúng:

List of SQL Commands | Codecademy

Trong mọi trường hợp, trong cuộc tấn công SQL Injection, chúng tôi chủ yếu chỉ sử dụng 4 lệnh: SELECT, FROM, WHERE, và UNION.

SQL CommandDescription
SELECTUsed to select data from a database.
FROMUsed to specify which table to select or delete data from.
WHEREUsed to extract only those records that fulfil a specified condition.
UNIONUsed to combine the result-set of two or more SELECT statements.

Điều quan trọng cần đề cập là 1 = 1 trong SQL là viết tắt của True (ngay sau đây bạn sẽ thấy lý do tại sao tôi đề cập đến điều này).

Tấn công SQLi hoạt động như thế nào?

SQLi được thực hiện thông qua việc lạm dụng tham số PHP GET (ví dụ: ?username=, hoặc ?id=) trong URL của một trang web dễ bị tấn công, chẳng hạn như những tham số được đề cập trong Ngày 2. Những tham số này thường nằm trong các trường tìm kiếm và trang đăng nhập , vì vậy với tư cách là một người kiểm tra thâm nhập, bạn cần phải ghi lại những điều đó.

Đây là một ví dụ về trường nhập tên người dùng được viết bằng PHP:

<?php $username = $_GET['username']; $result = mysql_query("SELECT * FROM users WHERE username='$username'"); ?>

Sau biến  username nhập vào mã, PHP tự động sử dụng SQL để chọn tất cả người dùng có tên người dùng được cung cấp. Chính xác thực tế này có thể bị lạm dụng bởi kẻ tấn công.

Giả sử một người dùng độc hại cung cấp dấu ngoặc kép (') làm đầu vào tên người dùng. Sau đó, mã SQL sẽ giống như sau:

SELECT * FROM users WHERE username='''

Như bạn có thể thấy, dấu đó tạo ra dấu thứ ba và tạo ra lỗi vì tên người dùng chỉ nên được cung cấp hai. Chính xác thì lỗi này được sử dụng để khai thác SQL injection.

Nói một cách tổng quát, SQL injection là một cuộc tấn công trong đó mục tiêu của bạn là phá vỡ logic thực thi mã SQL, đưa vào của chính bạn và sau đó 'sửa chữa' phần bị hỏng bằng cách thêm nhận xét vào cuối.https://i.imgur.com/U5Eyw5z.png

Diễn giải đồ họa

Lệnh kiểm tra được sử dụng phổ biến nhất cho tấn công SQLi:

--+ // /*

 Bypass Đăng nhập với SQL Injection

Một trong những ứng dụng mạnh mẽ nhất của SQL injection chắc chắn là bỏ qua đăng nhập. Nó cho phép kẻ tấn công truy cập vào BẤT KỲ tài khoản nào miễn là chúng biết tên người dùng hoặc mật khẩu của nó (thông thường nhất là bạn sẽ chỉ biết tên người dùng).

Trước tiên, chúng ta hãy tìm hiểu lý do đằng sau khả năng làm như vậy. Giả sử, ứng dụng đăng nhập của chúng tôi sử dụng PHP để kiểm tra xem tên người dùng và mật khẩu có khớp với cơ sở dữ liệu với truy vấn SQL sau:

SELECT username,password FROM users WHERE username='$username' and password='$password'

Như bạn thấy ở đây, truy vấn đang sử dụng tên người dùng và mật khẩu đã nhập để xác thực nó với cơ sở dữ liệu.

Điều gì xảy ra nếu chúng ta nhập ' or true -- vào trường username  đó? Điều này sẽ là  truy vấn trên thành sau:

SELECT username,password FROM users WHERE username='' or true -- and password=''

Dấu -- trong trường hợp này đã comment ra phần kiểm tra mật khẩu, khiến ứng dụng quên kiểm tra mật khẩu đã chính xác chưa. Thủ thuật này cho phép bạn đăng nhập vào bất kỳ tài khoản nào bằng cách đặt tên người dùng và tải trọng ngay sau đó.

Lưu ý rằng một số trang web có thể sử dụng một truy vấn SQL khác, chẳng hạn như:

SELECT username,pass FROM users WHERE username=('$username') and password=('$password')

Trong trường hợp này, bạn sẽ phải thêm một dấu ngoặc đơn vào trọng tải của mình như sau: ') hoặc true-- để làm cho nó hoạt động.

Bạn có thể thực hành bỏ qua đăng nhập trên một máy được triển khai, cổng 3000 (Đầu tiên duyệt đến MACHINE_IP: 3000/init.php và sau đó đến MACHINE_IP: 3000). Tôi đã đặt một bài tập tương tác bổ sung ở đó. Nó sẽ hiển thị cho bạn tất cả đầu ra back end, cho phép bạn thử nghiệm và thực hành với các lệnh SQL.

Blind SQL Injection

Trong một số trường hợp, các nhà phát triển trở nên đủ thông minh để giảm thiểu SQL Injection bằng cách hạn chế một ứng dụng hiển thị bất kỳ lỗi nào. Thật đáng mừng, điều này không có nghĩa là chúng tôi không thể thực hiện cuộc tấn công.

Blind SQL Injection dựa trên những thay đổi trong ứng dụng web, trong quá trình tấn công. Nói cách khác, một lỗi trong truy vấn SQL sẽ dễ nhận thấy ở một số dạng khác (tức là đã thay đổi nội dung hoặc dạng khác).

Vì trong tình huống này, chúng tôi chỉ có thể xem liệu có lỗi được tạo ra hay không, SQLi mù được thực hiện thông qua việc đặt câu hỏi 'Có' hoặc 'Không' cho cơ sở dữ liệu (Error = 'No', No Error = 'Yes').

Thông qua hệ thống đó, kẻ tấn công có thể đoán tên cơ sở dữ liệu, đọc các cột, v.v. Blind SQLi sẽ mất nhiều thời gian hơn các loại khác nhưng có thể là loại phổ biến nhất trong tự nhiên.

Bắt đầu với việc tìm cách gây ra lỗi SQL và sau đó sửa lỗi đó.

https://i.imgur.com/CxxUthP.png

Phá vỡ ứng dụnghttps://i.imgur.com/mpYUwOS.png

Khắc phục sự cố - Lưu ý cách ứng dụng không xuất ra bất kỳ lỗi nào, mặc dù rõ ràng tôi đã gây ra lỗi SQL.

Để đặt câu hỏi, bạn có thể sử dụng hàm SUBSTR() SQL. Nó trích xuất một chuỗi con từ một chuỗi và cho phép chúng tôi so sánh chuỗi con với một ký tự ASCII tùy chỉnh.

substr((select database()),1,1)) = 115

Đoạn mã trên đang hỏi cơ sở dữ liệu nếu chữ cái đầu tiên của tên nó bằng 155 ('s' trong bảng ASCII).

Bây giờ hãy đặt nó vào một payload:

?id=1' AND (ascii(substr((select database()),1,1))) = 115 --+

Tải trọng là câu hỏi. Nếu ứng dụng không tạo ra bất kỳ thay đổi nào, thì câu trả lời là 'Có' (chữ cái đầu tiên của cơ sở dữ liệu là 's'). Bất kỳ lỗi hoặc thay đổi = 'No'.

https://i.imgur.com/f1C2aWx.png

Lưu ý: Bạn cũng có thể sử dụng kỹ thuật chèn SQL mù trong tình huống 'mở'.

UNION SQL Injection

UNION SQLi chủ yếu được sử dụng để liệt kê cơ sở dữ liệu nhanh chóng, vì toán tử UNION cho phép bạn kết hợp các kết quả của nhiều câu lệnh SELECT cùng một lúc.

UNION SQLi tấn công bao gồm 3 giai đoạn:

  1. Tìm số cột
  2. Kiểm tra xem các cột có phù hợp không
  3. Tấn công và lấy một số dữ liệu thú vị.

Xác định số lượng cột được yêu cầu trong một cuộc tấn công SQL injection UNION

Có hai cách chính xác để phát hiện một:

Cách thứ nhất liên quan đến việc đưa một loạt các truy vấn ORDER BY cho đến khi xảy ra lỗi. Ví dụ:

' ORDER BY 1-- ' ORDER BY 2-- ' ORDER BY 3-- # and so on until an error occurs

(Giá trị cuối cùng trước lỗi sẽ cho biết số cột.)

Cách thứ hai (phổ biến và hiệu quả nhất), sẽ liên quan đến việc gửi một loạt các trọng tải UNION SELECT với một số giá trị NULL:

' UNION SELECT NULL-- ' UNION SELECT NULL,NULL-- ' UNION SELECT NULL,NULL,NULL-- # until the error occurs

Không có lỗi = số NULL khớp với số cột.

  • Tìm các cột có kiểu dữ liệu hữu ích trong cuộc tấn công SQL injection UNION

Nói chung, dữ liệu thú vị mà bạn muốn lấy sẽ ở dạng chuỗi. Sau khi đã xác định số lượng cột cần thiết, (ví dụ 4) bạn có thể thăm dò từng cột để kiểm tra xem nó có thể chứa dữ liệu chuỗi hay không bằng cách thay thế một trong các trọng tải UNION SELECT bằng một giá trị chuỗi. Trong trường hợp 4 bạn sẽ nộp:

' UNION SELECT 'a',NULL,NULL,NULL-- ' UNION SELECT NULL,'a',NULL,NULL-- ' UNION SELECT NULL,NULL,'a',NULL-- ' UNION SELECT NULL,NULL,NULL,'a'--

Không có lỗi = kiểu dữ liệu hữu ích cho chúng tôi (chuỗi).

  • Sử dụng một cuộc tấn công SQL injection UNION để truy xuất dữ liệu thú vị

Khi bạn đã xác định số lượng cột và tìm thấy cột nào có thể chứa dữ liệu chuỗi, cuối cùng bạn có thể bắt đầu truy xuất dữ liệu thú vị.

Giả sử rằng:

  • Hai bước đầu tiên hiển thị chính xác hai cột hiện có với kiểu dữ liệu hữu ích.
  • Cơ sở dữ liệu chứa một bảng được gọi là người dùng với các cột tên người dùng và mật khẩu.

Trong trường hợp này, bạn có thể truy xuất nội dung trong bảng của người dùng bằng cách gửi đầu vào:

' UNION SELECT username, password FROM users --

Đây là danh sách nhỏ những thứ bạn muốn lấy:

  1. cơ sở dữ liệu ()
  2. người sử dụng()
  3. @@phiên bản
  4. tên tài khoản
  5. mật khẩu mở khóa
  6. tên_bảng
  7. tên cột dọc

SQLMap

SQLMap là một công cụ kiểm tra thâm nhập mã nguồn mở tự động hóa quá trình phát hiện và khai thác các lỗ hổng SQL injection và tiếp quản các máy chủ cơ sở dữ liệu. Đó là một công cụ đáng kinh ngạc có thể được học trong vòng vài phút. Nó đã được bao gồm trong AttackBox của THM hoặc bạn có thể cài đặt nó cục bộ bằng cách chạy:

git clone --depth 1 <https://github.com/sqlmapproject/sqlmap.git> sqlmap-dev

Dưới đây là một số tùy chọn phổ biến nhất mà bạn sẽ cấu hình khi sử dụng SQLMap:

Command
--urlCung cấp URL cho cuộc tấn công
--dbmsCho SQLMap biết loại cơ sở dữ liệu đang chạy
--dumpKết xuất dữ liệu trong cơ sở dữ liệu mà ứng dụng sử dụng
--dump-allKết xuất TOÀN BỘ cơ sở dữ liệu
--batchSQLMap sẽ chạy tự động và không yêu cầu người dùng nhập


Hãy xem một ví dụ về lệnh SQLMap. Giả sử chúng ta có một biểu mẫu đăng nhập dễ bị tấn công tại "http://tbfc.net/login.php". (Lưu ý, đây chỉ là một ví dụ, vui lòng không SQLMap trang web này vì chưa có sự đồng ý của chủ sở hữu.) Chúng ta sẽ sử dụng điều này cùng với --url để cho SQLMap biết nơi tấn công. i.e. sqlmap --url http://tbfc.net/login.php

Sau đó, chúng ta có thể tiến hành liệt kê dữ liệu nào trong cơ sở dữ liệu của ứng dụng với các tùy chọn như --tables và --columns. Để SQLMap cuối cùng của chúng tôi trông giống như vậy: sqlmap --url http://tbfc.net/login.php --tables --columns

Một lần nữa, tbfc.net được lấy làm ví dụ, vui lòng không thực hiện bất kỳ cuộc tấn công nào vào trang web này.

  • Bạn có thể tìm bảng cheats để biết thêm các đoạn lệnh SQLMap tại đây

SQLMap & BurpSuite

Tính năng có lợi nhất của sqlmap là tích hợp với BurpSuite.

Với BurpSuite, bạn có thể nắm bắt và lưu thông tin đăng nhập hoặc tìm kiếm để sử dụng với SQLMap. Điều này được thực hiện bằng cách chặn một yêu cầu. Bạn sẽ cần định cấu hình trình duyệt của mình để sử dụng BurpSuite làm proxy cho yêu cầu này được thực hiện. AttackBox đã giúp bạn điều này trở nên đơn giản bằng cách sử dụng tiện ích mở rộng FoxyProxy trong Firefox.

  1. Đầu tiên, hãy khởi động BurpSuite nằm trong "Ứng dụng -> Web -> BurpSuite Community Edition" trên AttackBox
  2. Sử dụng Firefox để truy cập ứng dụng mà chúng tôi nghi ngờ là dễ bị tấn công
  3. Bật FoxyProxy trong Firefox:
  4. Gửi yêu cầu trên ứng dụng web mà chúng tôi nghi ngờ là có thể dễ bị tấn công
  5. Gửi yêu cầu từ tab "Proxy" đến bộ lặp bằng cách nhấp chuột phải và nhấn "Gửi tới bộ lặp"
  6. Lưu ý rằng yêu cầu của chúng tôi hiện nằm trong tab "Bộ lặp":
  7. Cuối cùng, lưu yêu cầu này bằng cách nhấp chuột phải và nhấn "Lưu mục"

    Câu lệnh sử dụng với SQLMap:

    sqlmap -r filename

    SQLMap sẽ tự động dịch yêu cầu và khai thác cơ sở dữ liệu cho bạn.

    Thử thách

    Truy cập ứng dụng dễ bị tấn công trong Firefox, tìm bảng đăng nhập bí mật của ông già Noel và bỏ qua đăng nhập. Sử dụng một số lệnh và công cụ được đề cập trong suốt nhiệm vụ hôm nay để trả lời các Câu hỏi từ # 3 đến # 6.

    Ông già Noel đọc một số tài liệu mà ông đã viết khi thiết lập ứng dụng, nó có nội dung:

    VIỆC CẦN LÀM: Xem xét các hệ thống cơ sở dữ liệu thay thế tốt hơn sqlite. Ngoài ra, đừng quên rằng bạn đã cài đặt Tường lửa ứng dụng web (WAF) sau cuộc tấn công năm ngoái. Trong trường hợp bạn quên lệnh, bạn có thể yêu cầu SQLMap thử và bỏ qua WAF bằng cách sử dụng --tamper=space2comment

    Tài nguyên

    Check out this cheat sheet: swisskyrepo/PayloadsAllTheThings

    Payload list: payloadbox/sql-injection-payload-list

    In-depth SQL Injection tutorial: SQLi Basics

    Answer the questions below

    Without using directory brute forcing, what's Santa's secret login panel?


    Sử dụng công cụ tìm kiếm path URL 

    gobuster dir -u http://ip:8000/ -w pathwordlist -t 50  -b 404,403




    Visit Santa's secret login panel and bypass the login using SQLi

    Thực hiện vượt qua trình login bằng cách nhập vào trường username  ' or true --


    Sử dụng burpsuit thu thập thông tin khi thực hiện search


    Mình lưu lại một file mà thực hiện dùng tools sqlmap để tấn công

    sqlmap -r filename

    How many entries are there in the gift database?


    What did Paul ask for?

    What is the flag?

    What is admin's password?


    ---Còn Tiếp---

    Post a Comment

    0 Comments