Hạn chế tấn công pingback bằng HAPROXY
Vừa rồi bên mình dính chưởng bị trẻ trâu ddos, phương thức tấn công là sử dụng lỗ hổng của các site wordpress để tấn công pingback.
Chi tiết về tấn công pingback các bạn có thể tham khảo tại đây: https://www.acunetix.com/blog/web-security-zone/wordpress-pingback-vulnerability/
Đại để nó cho phép attacker ra lệnh từ xa cho hàng trăm nghìn đến hàng triệu các máy chủ wordpress mắc lỗi thực hiện request tới victim. Site của victim đột nhiên đón nhận lượng truy cập gấp vài trăm lần thông thường thì sụp là tất yếu.
Khi phân tích log access trên máy chủ web, đều nhận thấy các request này đều có đặc điểm chung đại để như:
WordPress/4.3.3; http://168.63.218.68; verifying pingback from 185.130.5.209
Thông tin nằm trong trường http-user-agent, vì vậy ta cần viết rule chặn tất cả các request cho từ khóa wordpress trong trường http-user-agent là được
Rule cho nginx:
server {
listen 1945 default_server;
listen [::]:80 default_server;
server_name _;
# root /usr/share/nginx/html;
if ($http_user_agent ~* "WordPress") {
return 444;
}
Chi tiết về tấn công pingback các bạn có thể tham khảo tại đây: https://www.acunetix.com/blog/web-security-zone/wordpress-pingback-vulnerability/
Đại để nó cho phép attacker ra lệnh từ xa cho hàng trăm nghìn đến hàng triệu các máy chủ wordpress mắc lỗi thực hiện request tới victim. Site của victim đột nhiên đón nhận lượng truy cập gấp vài trăm lần thông thường thì sụp là tất yếu.
Khi phân tích log access trên máy chủ web, đều nhận thấy các request này đều có đặc điểm chung đại để như:
WordPress/4.3.3; http://168.63.218.68; verifying pingback from 185.130.5.209
Thông tin nằm trong trường http-user-agent, vì vậy ta cần viết rule chặn tất cả các request cho từ khóa wordpress trong trường http-user-agent là được
Rule cho nginx:
server {
listen 1945 default_server;
listen [::]:80 default_server;
server_name _;
# root /usr/share/nginx/html;
if ($http_user_agent ~* "WordPress") {
return 444;
}
Rule cho haproxy: Viết trên section Frontend
acl wp_user_agent hdr_sub(User-Agent) -m sub -i wordpress
http-request deny if METH_GET or METH_POST or METH_OPTIONS wp_user_agent
Việc chặn như thế này cũng chỉ chịu được phần nào thôi, tuy nhiên có cũng hơn không. Chia sẻ thêm case của bên mình:
Sơ đồ hệ thống:
Với mô hình trên, khi bị tấn công lên đến hơn 100k connections, web bên mình hoàn toàn tê liệt, do hạn chế về tốc độ xử lý của máy chủ nginx, sau đó đã thay máy chủ khác mạnh hơn thì cân tốt :)
Đối với một trường hợp khác, sử dụng haproxy làm reserve proxy thay cho nginx, thì hiệu quả không tốt lắm, do haproxy chỉ có cơ chế deny request (trả về mã lỗi http 403).
Nhận xét
Đăng nhận xét