Web Pentest - Bài 3: Thu thập thông tin của ứng dụng

bobby13689

VIP Members
27/04/2017
44
46 bài viết
Web Pentest - Bài 3: Thu thập thông tin của ứng dụng
upload_2021-5-22_22-53-50.jpeg
Chào các bạn,

Ở trong các bài trước, mình đã giới thiệu các bạn về các bước cơ bản ban đầu của pentest, bao gồm:

  • Giới thiệu về web pentest. Giới thiệu về Burp suite, một công cụ tuyệt vời hỗ trợ chúng ta trong quá trình pentest (Bài 1).
  • Thu thập thông tin: Dò tìm các đường dẫn trong hệ thống bằng Gobuster, ứng dụng Intruder để brutce-force mật khẩu, cũng như các đường dẫn trong ứng dụng (Bài 2)
Ở trong bài 3 này, chúng ta sẽ cùng nhau đi tiếp quá trình tìm hiểu ứng dụng chúng ta cần pentest.


Tại sao quá trình thu thập thông tin của ứng dụng lại quan trọng? Những thông tin nào cần được thu thâp trong quá trình này?

  • Chức năng chính của ứng dụng này là gì?
  • Các cơ chế bảo vệ đang có trên ứng dụng này là gì? (Được xác thực như thế nào, phân quyền ra sao, có bao nhiêu cấp phân quyền, có được bảo vệ bởi tường lửa ứng dụng nào hay không, ...)
  • Những công nghệ/framework nào được sử dụng ở phía client (ví dụ như Java applets, ActiveX controls, Flash, Angular, ...)
  • Tất cả những vị trí nào mà ứng dụng nhận input từ người dùng và xử lý nó
  • Những công nghệ được sử dụng ở phía server? (Web server software, SSL, các tương tác với database, email, ...)
Do phần 1,2 sẽ phụ thuộc vào đặc thù của ứng dụng, và phần do đó hôm nay của chúng ta sẽ tập trung vào 3 phần cuối của các mục trên

  1. Nhận diện tất cả những input mà ứng dụng nhận từ người dùng
Mã:
POST /search.php?test=query HTTP/1.1
Host: testphp.vulnweb.com
Content-Length: 23
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://testphp.vulnweb.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://testphp.vulnweb.com/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close

searchFor=a&goButton=go


Với mỗi request như trên, thì đây là tất cả những vị trí các bạn có thể xem xét​
  • Bất kì chuỗi ký tự nào đến dấu ? trong URL (dấu ? này là phần phân tách query với URL)
    Ở ví dụ trên thì /search.php cũng được xem là 1 dạng param (thực ra nó là endpoint).
  • Bất kì param nào được gửi đến ứng dụng (phía sau dấu ?) của GET request
    Ở ví dụ phía dưới trên, một số param có thể kể đến như test=query, searchFo=a, goButton=go.
    Còn ở ví dụ phía dưới thì có thể kể đến như foo=bar, foo2=bar2, ...
Mã:
/dir/file;foo=bar&foo2=bar2
/dir/file?foo=bar$foo2=bar2
/dir/file/foo%3dbar%26foo2%3dbar2
/dir/foo.bar/file
/dir/foo=bar/file
/dir/file?param=foo:bar
/dir/file?data=%3cfoo%3ebar%3c%2ffoo%3e%3cfoo2%3ebar2%3c%2ffoo2%3e
  • Bất kì param nào được gửi đến ứng dụng trong body của POST request Tương tự với ví dụ ở phía trên, tuy nhiên nó nằm ở body của request thay vì ở phía trên URL Ví dụ:
  • Bất kì HTTP header nào trong request (một số phổ biến như User -Agent, Referer, Accept, Accept-Language, Host)
    Mã:
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
    Mã:
    Host: testphp.vulnweb.com
    Mã:
    Referer: http://testphp.vulnweb.com/
2. Nhận diện các công nghệ được sử dụng ở Backend​
  • Banner Grabbing
Một số web server vô tình để lộ thông tin về các phần mềm được sử dụng, thậm chí phiên bản của chúng, dưới đây là một ví dụ (thông tin này nằm trong Server header của response):

Mã:
Server: Apache/1.3.31 (Unix) mod_gzip/1.3.26.1a mod_auth_passthrough/
  1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 PHP/4.3.9 FrontPage/
  5.0.2.2634a mod_ssl/2.8.20 OpenSSL/0.9.7a
  • File Extensions
    Một cách dễ dàng nhất để nhất để nhận biết được ngôn ngữ lập trình được sử dụng khi xây dựng ứng dụng:
    • asp - Microsoft Active Server
    • aspx - Microsoft ASP.NET
    • jsp - Java Server
    • cfm - Cold Fusion
    • php - PHP
    • d2w - WebSphere
    • p1 -Perl
    • py - Python
    Kể cả ứng dụng không sử dụng extension nào cả, chúng ta cũng có thể dự đoán được bằng kinh nghiệm quan sát các lỗi của ứng dụng.

    Ví dụ: Khi truy cập một ứng dụng, chúng ta vào 1 trang không tồn tại, trả về code 404 và có hình như sau, thì khả năng rất cao, đó chính là ASP.NET
    upload_2021-5-22_22-46-56.png

    Hoặc lỗi với hình như sau:
    upload_2021-5-22_22-47-11.png

    Thì nó chính là Java + Spring Boot.
    Tương tự như thế, sẽ có nhiều dấu hiệu để nhận biết ngôn ngữ bằng cách quan sát các trang lỗi, phụ thuộc vào việc bạn đã từng làm việc với ngôn ngữ đó hay chưa.
  • Một dấu hiệu cũng cần được lưu ý khác, đó là Session token.
    Việc sử dụng sẵn cơ chế xác thực của các platform giúp lập trình viết tiết kiệm được rất nhiều thời gian khi phát triển sản phẩm, và một số framework/ngôn ngữ có đặc điểm nhận dạng khi tạo session token như sau:
    • JSESSIONID - Java
    • ASPSESSIONID - Microsoft IIS Server
    • ASP.NET_SessionId - Microsoft ASP.NET
    • CFID/CFTOKEN - Cold Fusion
    • PHPSESSID - PHP
Các thông tin được thu thập trong quá trình này, sẽ là tiền đề cho chúng ta có những hướng đi phù hợp, cũng như tiết kiệm thời gian trong quá trình pentest, ví dụ:
  • Khi bạn nhận thấy ứng dụng có thể tồn tại lỗ hổng Deserialization, thì việc khai thác được lỗi này đòi hỏi chúng phải chọn đúng payload cho đúng ngôn ngữ đang được sử dụng. Java, PHP, Python sẽ có các cách khai thác khác nhau, nếu chọn sai thì có thể chúng ta sẽ bỏ sót lỗ hổng, hoặc mất quá nhiều thời gian vì phải thử toàn bộ.
  • Khi bạn nhận định ứng dụng có lỗ hổng XSS, nhưng vẫn mãi không thể làm sao để cho lỗ hổng này có thể thực thi JS code (có thể bị filter). Thì việc có thông tin về framework sử dụng sẽ cho chúng ta biết được cách filter, và tìm ra hướng vượt qua filter này.
  • Và còn rất nhiều ví dụ khác.

Vì sự quan trọng, cần thiết của các thông tin này, bạn hãy note lại một cách đày đủ, theo một hệ thống mà bạn thấy phù hợp nhất, để dễ dàng tìm, tham khảo đến nó nhé.

Dưới dây là một ví dụ về cách mình note cho các thông tin khi mình thu thập được cho 1 target:

Mã:
- Server side
    - Webserver: Tomcat 7.0.70
    - Language: Java
    - Framework: Spring Boot
- Client Side
    - Framework: Angular
    - BootStrap
    - ...
- Protection:
    - WAF: Cloudflare (Block mode)
    - Input validation: Yes
    - Google Recaptcha
    - ...
Trong quá trình pentest, nếu mình tìm ra thêm thông tin nào khác, mình sẽ thêm vào đoạn note trên để tổng hợp lại.

Đến đây là đã hết bài 3 rồi.

Các bài khác trong cùng chủ đề:
Bài 1: https://whitehat.vn/threads/web-pentest-bai-1-burp-academy-va-gioi-thieu-ve-burp-suite.14724/
Bài 2: https://whitehat.vn/threads/web-pen...-force-de-do-tim-duong-dan-va-password.14754/


Cảm ơn các bạn đã đọc bài.


Hẹn gặp các bạn ở bài tiếp theo.


M.

Happy Hacking.
 
Chỉnh sửa lần cuối:
bài của bác hay thật sự
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  • Thích
Reactions: bobby13689
Comment
Thẻ
.net information gathering java pentest php programing language
Bên trên