Skip to content
Suzu
3 min read

【30天學習新語言-Ruby】Day 5:基本 HTML 解析找出潛在攻擊點

找到 Web 服務之後,下一步就是分析網頁內容了。

View the complete series →
On this page

💡 為什麼要解析 HTML?

找到 Web 服務之後,下一步就是分析網頁內容了。 但手動看 HTML 原始碼應該蠻累的 XD,而且容易漏東西, 這時候就可以用自動化工具來幫忙。

今天要用 Ruby 的 nokogiri 算是一個很強大的 HTML 解析器, 它可以幫我們快速找出網頁中的表單、連結、註解等等, 這些都會是滲透測試的重要目標。

p.s. Nokogiri 這個名字是日文「鋸」的意思, 猜測應該是這個工具可以把 HTML 鋸開來才這樣取名w

🎯 大綱

  • 安裝並使用 nokogiri gem
  • 解析 HTML 找出所有表單
  • 提取所有超連結
  • 搜尋 HTML 註解(可能有敏感資訊)
  • 找出所有 JavaScript 檔案

📚 知識點

  • gem install nokogiri — 安裝第三方套件
  • Nokogiri::HTML() — 解析 HTML 字串
  • doc.css() — 使用 CSS selector 查詢
  • doc.xpath() — 使用 XPath 查詢
  • element['attribute'] — 取得元素屬性
  • element.text — 取得元素文字內容

💻 實作

require 'nokogiri'
require 'open-uri'
require 'uri'

def analyze_webpage(url)
  begin
    # 開啟網頁並解析
    html = URI.open(url)
    doc = Nokogiri::HTML(html)

    puts "\nAnalyzing: #{url}"
    puts "=" * 50

    # 1. 找出所有 Form
    forms = doc.css('form')
    if forms.any?
      puts "\nFound #{forms.count} form(s):"
      forms.each_with_index do |form, i|
        puts "  Form ##{i+1}:"
        puts "    Action: #{form['action'] || 'N/A'}"
        puts "    Method: #{form['method'] || 'GET'}"

        # 列出所有 input 欄位
        inputs = form.css('input')
        if inputs.any?
          puts "    Inputs:"
          inputs.each do |input|
            puts "      - #{input['name']} (type: #{input['type']})"
          end
        end
      end
    end

    # 2. 提取所有連結
    links = doc.css('a[href]')
    if links.any?
      puts "\nFound #{links.count} link(s):"
      unique_links = links.map { |link| link['href'] }.uniq
      unique_links[0..9].each do |link|  # 只顯示前10個
        puts "  - #{link}"
      end
      puts "  ... and #{unique_links.count - 10} more" if unique_links.count > 10
    end

    # 3. 搜尋 HTML 註解
    comments = doc.xpath('//comment()')
    if comments.any?
      puts "\nFound #{comments.count} HTML comment(s):"
      comments.each do |comment|
        content = comment.text.strip
        next if content.empty?
        puts "  <!-- #{content[0..100]}#{content.length > 100 ? '...' : ''} -->"
      end
    end

    # 4. 找出所有 JavaScript 檔案
    scripts = doc.css('script[src]')
    if scripts.any?
      puts "\nFound #{scripts.count} JavaScript file(s):"
      scripts.each do |script|
        puts "  - #{script['src']}"
      end
    end

    # 5. 找出可能的 API endpoint
    api_patterns = ['/api/', '/v1/', '/v2/', '/graphql', '/rest/']
    all_urls = (links.map { |l| l['href'] } + scripts.map { |s| s['src'] }).compact
    api_endpoints = all_urls.select { |url| api_patterns.any? { |p| url.include?(p) } }

    if api_endpoints.any?
      puts "\nPossible API endpoints:"
      api_endpoints.uniq.each do |endpoint|
        puts "  - #{endpoint}"
      end
    end

  rescue => e
    puts "Error: #{e.message}"
  end
end

# 測試目標
targets = [
  'http://example.com',
  'http://testphp.vulnweb.com'  # 測試用的脆弱網站
]

targets.each do |target|
  analyze_webpage(target)
end

🚀 執行方式

  1. 先安裝 nokogiri:
gem install nokogiri
  1. 建立檔案 html_analyzer.rb

  2. 執行指令:

ruby html_analyzer.rb
  1. 預期輸出會像這樣:
Analyzing: http://example.com
==================================================

Found 1 form(s):
  Form #1:
    Action: /search
    Method: POST
    Inputs:
      - q (type: text)
      - submit (type: submit)

Found 15 link(s):
  - /about
  - /contact
  - /api/v1/users
  ...

Possible API endpoints:
  - /api/v1/users
  - /api/v1/posts

有了這些資訊,就能快速了解網站架構,找出潛在的攻擊點了

image

Share this page