- XSS là gì?
- Các loại XSS phổ biến
- Tại sao XSS cực kỳ nguy hiểm trong WordPress?
- Ví dụ lỗi XSS trong WordPress
- 1. Echo dữ liệu người dùng mà không escape
- 2. In dữ liệu từ database mà không filter
- Escape output đúng cách trong WordPress
- Ví dụ code WordPress an toàn
- 1. Output HTML an toàn
- 2. Output attribute an toàn
- 3. Output URL an toàn
- Sử dụng wp_kses() khi cho phép HTML
- DOM XSS trong WordPress
- Cách hacker khai thác XSS trong WordPress
- Checklist chống XSS cho WordPress developer
- Luồng dữ liệu an toàn trong WordPress
- Ví dụ thực tế trong WordPress
- Phòng thủ nâng cao
- Output JSON an toàn
- Kết luận
XSS là gì?
XSS cho phép attacker chèn mã JavaScript độc hại vào website. Đoạn script này chạy trong trình duyệt của nạn nhân và có thể:
- Đánh cắp cookie hoặc local storage
- Chiếm session
- Chèn nội dung lừa đảo
- Thực hiện hành động trái phép bằng quyền của nạn nhân
- Tải mã độc, spam, hoặc chuyển hướng
Các loại XSS phổ biến
- Stored XSS: Payload được lưu trong database và chạy mỗi khi có người xem trang.
- Reflected XSS: Payload nằm trong URL và bị server “phản chiếu” lại mà không lưu.
- DOM XSS: Lỗi xảy ra hoàn toàn ở JavaScript phía frontend, không qua server.
Tại sao XSS cực kỳ nguy hiểm trong WordPress?
WordPress thường có admin đăng nhập để quản trị site. Nếu XSS chạy được trong phiên admin, attacker có thể:
- Tạo tài khoản admin mới cho hacker
- Cài plugin backdoor
- Chỉnh sửa theme/plugin
- Chèn link spam hoặc mã độc vào toàn site
Vì vậy, trong WordPress, XSS đôi khi còn nguy hiểm hơn cả SQL Injection.
Ví dụ lỗi XSS trong WordPress
1. Echo dữ liệu người dùng mà không escape
<?php
// Ví dụ dễ bị XSS
echo $_GET['name'];
2. In dữ liệu từ database mà không filter
<?php
// Ví dụ dễ bị XSS
echo get_option( 'my_custom_title' );
Escape output đúng cách trong WordPress
WordPress cung cấp nhiều hàm escape theo từng ngữ cảnh:
esc_html()– escape khi in nội dung HTMLesc_attr()– escape bên trong thuộc tính HTMLesc_url()– escape URLesc_js()– escape trong JavaScriptwp_kses()– lọc HTML theo allowlist
Ví dụ code WordPress an toàn
1. Output HTML an toàn
<?php
echo esc_html( $_GET['name'] );
2. Output attribute an toàn
<input type="text" value="<?php echo esc_attr( $value ); ?>">
3. Output URL an toàn
<a href="<?php echo esc_url( $url ); ?>">Truy cập</a>
Sử dụng wp_kses() khi cho phép HTML
Nếu chức năng cần cho user nhập HTML (ví dụ custom field), hãy dùng wp_kses() để lọc:
<?php
$allowed = array(
'strong' => array(),
'em' => array(),
'a' => array( 'href' => array(), 'target' => array() )
);
echo wp_kses( $input, $allowed );
DOM XSS trong WordPress
DOM XSS xảy ra trong JavaScript:
// Dễ bị DOM XSS
document.getElementById('box').innerHTML = location.hash.substring(1);
Cách fix:
document.getElementById('box').textContent = location.hash.substring(1);
Cách hacker khai thác XSS trong WordPress
- Nhúng script vào comment, post meta, custom fields
- Lợi dụng shortcode không escape
- Chèn payload vào admin notice
- Khai thác form AJAX trả HTML thẳng
- Dùng URL để bắn reflected XSS vào trang search, filter
Checklist chống XSS cho WordPress developer
- Escape mọi output
- Sanitize mọi input
- Dùng đúng hàm cho đúng ngữ cảnh
- Không tin user input (kể cả user đã đăng nhập)
- Không dùng input type=”text” nếu không cần
- Dùng nonce để chống CSRF kết hợp XSS
- Hạn chế dùng
innerHTMLtrong JavaScript
Luồng dữ liệu an toàn trong WordPress
User Input → sanitize_*() → save → retrieve → esc_*() → output
Ví dụ thực tế trong WordPress
- XSS trong comment do không escape tên tác giả
- XSS trong shortcode attributes
- XSS trong AJAX trả về HTML trực tiếp
- XSS trong meta box hoặc Gutenberg block tự custom
Phòng thủ nâng cao
- Content Security Policy (CSP)
- Cookie SameSite
- Strict sanitization cho custom fields
- Lọc HTML bằng allowlist server-side
- Escape JSON output đúng cách
Output JSON an toàn
<script>
const data = JSON.parse('<?php echo wp_json_encode( $data ); ?>');
</script>
Kết luận
XSS là một trong những lỗ hổng nguy hiểm nhất trong WordPress. Chỉ cần làm đúng nguyên tắc escape và sanitize, bạn có thể chặn hơn 90% lỗi XSS thường gặp. Với developer WordPress, mastering XSS là điều bắt buộc nếu muốn viết plugin/theme an toàn, sạch, và chuyên nghiệp.
Bình luận