NenTang.vn |
Chương 12-Bài 2. Cách hacker chèn các đoạn mã độc vào Hệ thống bằng cách sử dụng XSS (Cross site scripting) và Cách phòng chống của Quản trị Trang web |
||
Tác giả: Dương Nguyễn Phú Cường | Ngày đăng: 18/4/2025, 14:40 | Lượt xem: 2756 |
Tấn công XSS (cross-site scripting)2.1. XSS là gì
2.2. Cách thức hoạt động của XSS
2.2.1. Stored-XSS
2.2.2. Reflected-XSSCó đến 75% kỹ thuật XSS dựa trên Reflected XSS. Gọi là reflected(phản xạ) bởi vì trong kịch bản khai thác loại này, hacker phải gửi cho nạn nhân một URL có chứa đoạn mã nguy hiểm(thường là javascript). Nạn nhân chỉ cần request đến URL này thì ngay lập tức hacker sẽ nhận được respond chứa kết quả mong muốn(tính phản xạ thể hiện ở đây). Ngoài ra nó còn được biết đến với tên gọi first-order XSS.
Kịch bản khai thác trong thực tếCó nhiều hướng để khai thác thông qua lỗi Reflected XSS, một trong những cách được biết đến nhiều nhất là chiếm phiên làm việc (session) của người dùng, từ đó có thể truy cập được dữ liệu và chiếm được quyền của họ trên website. Chi tiết được mô tả theo các bước như sau:
2.3. Các phòng tránh XSS
Thực hànhTạo trang Thêm mới và hiển thị danh sách Hình thức thanh toán
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>XSS Stored và cách phòng chống - Nền tảng .vn</title> </head> <body> <a href="index.php">Danh sách HTTT</a> <form name="frmHinhThucThanhToan" id="frmHinhThucThanhToan" method="post" action=""> Tên Hình thức thanh toán: <input type="text" name="httt_ten" id="httt_ten" /><br /> <input type="submit" name="btnSave" id="btnSave" value="Lưu dữ liệu" /> </form> <?php // Hiển thị tất cả lỗi trong PHP // Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development) // Không nên hiển thị lỗi trên môi trường Triển khai (Production) ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); if (isset($_POST['btnSave'])) { // 1. Liên kết Database include_once(__DIR__ . '/../../../dbconnect.php'); // Phân tách thông tin từ người dùng gởi đến qua Request POST // Sử dụng hàm htmlentites để mã hóa các ký tự có khả năng thực thi JavaScript trước khi lưu trữ $tenhinhthucthanhtoan = htmlentities( $_POST['httt_ten'] ); // 2. Chuẩn bị QUERY $sql = "INSERT INTO `hinhthucthanhtoan`(httt_ten) VALUES('$tenhinhthucthanhtoan');"; // print_r($sql);die; // 3. Thực thi mysqli_query($conn, $sql); echo 'Lưu thành công'; }; ?> </body> </html> <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>XSS Stored và cách phòng chống - Nền tảng .vn</title>
</head>
<body>
<a href="index.php">Danh sách HTTT</a>
<form name="frmHinhThucThanhToan" id="frmHinhThucThanhToan" method="post" action="">
Tên Hình thức thanh toán: <input type="text" name="httt_ten" id="httt_ten" /><br />
<input type="submit" name="btnSave" id="btnSave" value="Lưu dữ liệu" />
</form>
<?php
// Hiển thị tất cả lỗi trong PHP
// Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development)
// Không nên hiển thị lỗi trên môi trường Triển khai (Production)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (isset($_POST['btnSave'])) {
// 1. Liên kết Database
include_once(__DIR__ . '/../../../dbconnect.php');
// Phân tách thông tin từ người dùng gởi đến qua Request POST
// Sử dụng hàm htmlentites để mã hóa các ký tự có khả năng thực thi JavaScript trước khi lưu trữ
$tenhinhthucthanhtoan = htmlentities( $_POST['httt_ten'] );
// 2. Chuẩn bị QUERY
$sql = "INSERT INTO `hinhthucthanhtoan`(httt_ten) VALUES('$tenhinhthucthanhtoan');";
// print_r($sql);die;
// 3. Thực thi
mysqli_query($conn, $sql);
echo 'Lưu thành công';
};
?>
</body>
</html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>XSS Stored và cách phòng chống - Nền tảng .vn</title> </head> <body> <a href="index.php">Danh sách HTTT</a> <form name="frmHinhThucThanhToan" id="frmHinhThucThanhToan" method="post" action=""> Tên Hình thức thanh toán: <input type="text" name="httt_ten" id="httt_ten" /><br /> <input type="submit" name="btnSave" id="btnSave" value="Lưu dữ liệu" /> </form> <?php // Hiển thị tất cả lỗi trong PHP // Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development) // Không nên hiển thị lỗi trên môi trường Triển khai (Production) ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); if (isset($_POST['btnSave'])) { // 1. Liên kết Database include_once(__DIR__ . '/../../../dbconnect.php'); // Phân tách thông tin từ người dùng gởi đến qua Request POST // Sử dụng hàm htmlentites để mã hóa các ký tự có khả năng thực thi JavaScript trước khi lưu trữ $tenhinhthucthanhtoan = htmlentities( $_POST['httt_ten'] ); // 2. Chuẩn bị QUERY $sql = "INSERT INTO `hinhthucthanhtoan`(httt_ten) VALUES('$tenhinhthucthanhtoan');"; // print_r($sql);die; // 3. Thực thi mysqli_query($conn, $sql); echo 'Lưu thành công'; }; ?> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>XSS Stored và cách phòng chống - Nền tảng .vn</title> </head> <body> <?php // Hiển thị tất cả lỗi trong PHP // Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development) // Không nên hiển thị lỗi trên môi trường Triển khai (Production) ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Truy vấn database // 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn include_once(__DIR__ . '/../../../dbconnect.php'); // 2. Câu lệnh SELECT $sqlSelect = <<<EOT SELECT * FROM hinhthucthanhtoan EOT; // 3. Thực thi SELECT $result = mysqli_query($conn, $sqlSelect); // 4. Khi thực thi các truy vấn dạng SELECT, dữ liệu lấy về cần phải phân tích để sử dụng // Thông thường, chúng ta sẽ sử dụng vòng lặp while để duyệt danh sách các dòng dữ liệu được SELECT // Ta sẽ tạo 1 mảng array để chứa các dữ liệu được trả về $ds_hinhthucthanhtoan = []; while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { $ds_hinhthucthanhtoan[] = array( 'httt_ma' => $row['httt_ma'], 'httt_ten' => $row['httt_ten'], ); } ?> <a href="create.php">Thêm mới HTTT</a> <table border="1" width="800px"> <tr> <th>Mã HTTT</th> <th>Tên HTTT</th> </tr> <?php foreach($ds_hinhthucthanhtoan as $httt): ?> <tr> <td><?= $httt['httt_ma'] ?></td> <td><?= $httt['httt_ten'] ?></td> </tr> <?php endforeach; ?> </table> </body> </html> <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XSS Stored và cách phòng chống - Nền tảng .vn</title>
</head>
<body>
<?php
// Hiển thị tất cả lỗi trong PHP
// Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development)
// Không nên hiển thị lỗi trên môi trường Triển khai (Production)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Truy vấn database
// 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
include_once(__DIR__ . '/../../../dbconnect.php');
// 2. Câu lệnh SELECT
$sqlSelect = <<<EOT
SELECT *
FROM hinhthucthanhtoan
EOT;
// 3. Thực thi SELECT
$result = mysqli_query($conn, $sqlSelect);
// 4. Khi thực thi các truy vấn dạng SELECT, dữ liệu lấy về cần phải phân tích để sử dụng
// Thông thường, chúng ta sẽ sử dụng vòng lặp while để duyệt danh sách các dòng dữ liệu được SELECT
// Ta sẽ tạo 1 mảng array để chứa các dữ liệu được trả về
$ds_hinhthucthanhtoan = [];
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$ds_hinhthucthanhtoan[] = array(
'httt_ma' => $row['httt_ma'],
'httt_ten' => $row['httt_ten'],
);
}
?>
<a href="create.php">Thêm mới HTTT</a>
<table border="1" width="800px">
<tr>
<th>Mã HTTT</th>
<th>Tên HTTT</th>
</tr>
<?php foreach($ds_hinhthucthanhtoan as $httt): ?>
<tr>
<td><?= $httt['httt_ma'] ?></td>
<td><?= $httt['httt_ten'] ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>XSS Stored và cách phòng chống - Nền tảng .vn</title> </head> <body> <?php // Hiển thị tất cả lỗi trong PHP // Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development) // Không nên hiển thị lỗi trên môi trường Triển khai (Production) ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Truy vấn database // 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn include_once(__DIR__ . '/../../../dbconnect.php'); // 2. Câu lệnh SELECT $sqlSelect = <<<EOT SELECT * FROM hinhthucthanhtoan EOT; // 3. Thực thi SELECT $result = mysqli_query($conn, $sqlSelect); // 4. Khi thực thi các truy vấn dạng SELECT, dữ liệu lấy về cần phải phân tích để sử dụng // Thông thường, chúng ta sẽ sử dụng vòng lặp while để duyệt danh sách các dòng dữ liệu được SELECT // Ta sẽ tạo 1 mảng array để chứa các dữ liệu được trả về $ds_hinhthucthanhtoan = []; while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { $ds_hinhthucthanhtoan[] = array( 'httt_ma' => $row['httt_ma'], 'httt_ten' => $row['httt_ten'], ); } ?> <a href="create.php">Thêm mới HTTT</a> <table border="1" width="800px"> <tr> <th>Mã HTTT</th> <th>Tên HTTT</th> </tr> <?php foreach($ds_hinhthucthanhtoan as $httt): ?> <tr> <td><?= $httt['httt_ma'] ?></td> <td><?= $httt['httt_ten'] ?></td> </tr> <?php endforeach; ?> </table> </body> </html> Ví dụ nhập liệuNhập các mẫu hack sau:<script>alert("Xin chào, tôi là XSS hack");</script> <script>alert("Xin chào, tôi là XSS hack");</script> <script>alert("Xin chào, tôi là XSS hack");</script>
<script>var div = document.createElement("div"); var img = document.createElement("img"); img.src = "https://nentang.vn/storage/uploads/2019/06/logo-nentang.jpg"; document.querySelectorAll('body')[0].appendChild(img); div.innerHTML = "<h1>Xin chào, hacked by NenTang.vn ;P</h1>"; document.querySelectorAll('body')[0].appendChild(div);</script> <script>var div = document.createElement("div"); var img = document.createElement("img"); img.src = "https://nentang.vn/storage/uploads/2019/06/logo-nentang.jpg"; document.querySelectorAll('body')[0].appendChild(img); div.innerHTML = "<h1>Xin chào, hacked by NenTang.vn ;P</h1>"; document.querySelectorAll('body')[0].appendChild(div);</script> <script>var div = document.createElement("div"); var img = document.createElement("img"); img.src = "https://nentang.vn/storage/uploads/2019/06/logo-nentang.jpg"; document.querySelectorAll('body')[0].appendChild(img); div.innerHTML = "<h1>Xin chào, hacked by NenTang.vn ;P</h1>"; document.querySelectorAll('body')[0].appendChild(div);</script> |
Sản phẩm của Nền tảng | NenTang.vn - Hành trang tới Tương lai |