hhhai
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.

      Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

      Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

      Explore these features while you wait
      Complete general settings
      Bookmark and like published notes
      Write a few more notes
      Complete general settings
      Write a few more notes
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.

    Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Explore these features while you wait
    Complete general settings
    Bookmark and like published notes
    Write a few more notes
    Complete general settings
    Write a few more notes
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # What is the HTTP host header? `HTTP Host header` là một header yêu cầu bắt buộc kể từ `HTTP/1.1`. Nó chỉ định tên miền mà client muốn truy cập. Ví dụ, khi người dùng truy cập `https://portswigger.net/web-security`, trình duyệt tạo một request có header Host như sau: ``` GET /web-security HTTP/1.1 Host: portswigger.net ``` Trong một số trường hợp, chẳng hạn khi yêu cầu được chuyển tiếp qua một hệ thống trung gian, giá trị Host có thể bị thay đổi trước khi đến thành phần back-end dự kiến. ![image](https://hackmd.io/_uploads/H1mjrDi3ee.png) ## What is an HTTP Host header attack? `HTTP Host header attacks` khai thác những website dễ bị tổn thương khi xử lý giá trị của header Host một cách không an toàn. Nếu server tin tưởng vào `Host header` và không xác thực hoặc escape giá trị đó đúng cách, kẻ tấn công có thể lợi dụng đầu vào này để chèn các payload độc hại nhằm thao túng hành vi phía server. Các tấn công chèn payload trực tiếp vào Host header thường được gọi là **"Host header injection"**. Các ứng dụng web đóng gói sẵn (off-the-shelf) thường không biết trang mà chúng được triển khai trừ khi tên miền được chỉ định thủ công trong file cấu hình khi cài đặt. Khi cần biết domain hiện tại, ví dụ để tạo URL tuyệt đối được chèn vào email, chúng có thể lấy domain từ Host header: ```html <a href="https://_SERVER['HOST']/support">Contact support</a> ``` Giá trị header cũng có thể được sử dụng trong nhiều tương tác giữa các hệ thống khác nhau trong hạ tầng của website. Host header có thể do người dùng điều khiển. Nếu đầu vào không được escape hoặc xác thực đúng, Host header trở thành vector tiềm năng để khai thác nhiều lỗ hổng khác, nổi bật nhất là: * Web cache poisoning * Sai sót logic nghiệp vụ trong một số chức năng cụ thể * SSRF dựa trên định tuyến (routing-based SSRF) * Các lỗ hổng cổ điển phía server, ví dụ SQL injection ## Nguyên nhân: **Nguyên nhân lỗ hổng HTTP Host header:** * Giả định sai rằng Host header không thể bị người dùng kiểm soát → server tin tưởng mù quáng. * Không xác thực hoặc escape giá trị Host header. * Host có thể bị ghi đè bằng các header khác (do cấu hình server). * Cấu hình sai hoặc thiếu hiểu biết khi tích hợp công nghệ bên thứ ba. **Tóm lại:** Lỗ hổng thường không phải do code, mà chủ yếu do **cấu hình sai và thiếu kiểm soát Host header**. # Testing for vulnerabilities ## Supply an arbitrary Host header Khi kiểm tra lỗ hổng injection tiêu đề Host, đầu tiên hãy thử gửi một tên miền không xác định thông qua tiêu đề Host. Một số proxy lấy trực tiếp địa chỉ IP từ tiêu đề Host, khiến việc kiểm tra trở nên bất khả thi vì mọi thay đổi sẽ chuyển hướng request đến IP khác. Tuy nhiên, Burp Suite tách biệt rõ ràng giữa tiêu đề Host và địa chỉ IP đích, cho phép bạn tuỳ ý sửa đổi tiêu đề Host mà vẫn đảm bảo request gửi đến đúng target. **Mẹo:** URL đích được hiển thị ở đầu `panel` (Burp Repeater và Proxy) hoặc tab "`Target`" (Burp Intruder). Bấm biểu tượng bút chì để chỉnh sửa thủ công. Trong một số trường hợp, bạn vẫn có thể truy cập website dù dùng tiêu đề Host bất thường, có thể do máy chủ được cấu hình mặc định cho các tên miền không nhận diện được. Nếu website đích của bạn trùng với mục mặc định này, bạn có thể nghiên cứu cách ứng dụng xử lý tiêu đề Host và khả năng khai thác. Ngược lại, do tiêu đề Host là thành phần cốt lõi, việc giả mạo nó thường khiến bạn không thể truy cập ứng dụng đích. Máy chủ `front-end` hoặc `load balancer` có thể không biết chuyển tiếp request đi đâu, dẫn đến lỗi "`Invalid Host header`" - đặc biệt khi target sử dụng CDN. ## Check for flawed validation Thay vì nhận được phản hồi **"Invalid Host header"**, bạn có thể thấy request bị chặn do một biện pháp bảo mật nào đó. Hiểu cách website phân tích (parse) Host header, điều này đôi khi hé lộ những kẽ hở có thể dùng để bypass. Ví dụ, một số thuật toán parser sẽ loại bỏ phần port khỏi Host header, nghĩa là chỉ phần tên miền được xác thực. Nếu bạn cũng có thể cung cấp một port không phải số, bạn có thể để phần tên miền nguyên vẹn để chắc chắn tới được ứng dụng mục tiêu, đồng thời tiềm năng chèn payload qua phần port: ``` GET /example HTTP/1.1 Host: vulnerable-website.com:bad-stuff-here ``` Một số trang khác sẽ áp dụng logic khớp cho phép các subdomain tùy ý. Trong trường hợp này, bạn có thể vượt qua việc xác thực hoàn toàn bằng cách đăng ký một tên miền tùy ý kết thúc bằng cùng chuỗi ký tự như tên miền được whitelist: ``` GET /example HTTP/1.1 Host: notvulnerable-website.com ``` Hoặc bạn có thể lợi dụng một subdomain ít an toàn hơn mà bạn đã chiếm quyền điều khiển: ``` GET /example HTTP/1.1 Host: hacked-subdomain.vulnerable-website.com ``` ## Send ambiguous requests Để khai thác lỗ hổng tiêu đề Host, bạn có thể tạo các yêu cầu được diễn giải khác nhau bởi các thành phần hệ thống khác nhau: **1. Tiêu đề Host trùng lặp** ``` GET /example HTTP/1.1 Host: website-an-toan.com Host: payload-doc-hai ``` Nếu front-end và back-end xử lý khác nhau (ưu tiên tiêu đề đầu vs tiêu đề cuối), bạn có thể vừa định tuyến đúng target vừa chèn payload. **2. URL tuyệt đối + Host header** ``` GET https://website-an-toan.com/ HTTP/1.1 Host: payload-doc-hai ``` Mâu thuẫn giữa URL tuyệt đối (trong request line) và tiêu đề Host có thể tạo ra sự khác biệt trong xử lý. **3. Thụt lề tiêu đề** ``` GET /example HTTP/1.1 Host: payload-doc-hai Host: website-an-toan.com ``` Thụt lề một tiêu đề Host có thể khiến front-end bỏ qua nó (chỉ thấy tiêu đề sau) nhưng back-end vẫn xử lý, từ đó bỏ qua validation. Các kỹ thuật này khai thác sự khác biệt trong cách xử lý tiêu đề Host giữa các thành phần hệ thống (front-end/back-end, proxy/server,...). ## Inject host override headers Trong kiến trúc có hệ thống trung gian (như load balancer hoặc reverse proxy), máy chủ back-end thường nhận tiêu đề Host chứa tên miền của hệ thống trung gian. Để giải quyết vấn đề này, front-end có thể chèn tiêu đề **X-Forwarded-Host** chứa giá trị Host gốc từ client. Nhiều framework sẽ ưu tiên sử dụng tiêu đề này khi nó tồn tại. Bạn có thể lợi dụng **X-Forwarded-Host** để tiêm payload độc hại mà vượt qua validation trên tiêu đề Host: ``` GET /example HTTP/1.1 Host: vulnerable-website.com X-Forwarded-Host: bad-stuff-here ``` Ngoài X-Forwarded-Host, có thể thử các tiêu đề thay thế khác: - `X-Host` - `X-Forwarded-Server` - `X-HTTP-Host-Override` - `Forwarded` **Lưu ý:** Nhiều website hỗ trợ các tiêu đề này một cách không chủ đích do được kích hoạt mặc định trong các công nghệ third-party. # Exploiting vulnerabilities ## Password reset poisoning ![image](https://hackmd.io/_uploads/Bk8pSvj2gg.png) ### Lab: Basic password reset poisoning Khi quên mật khẩu sẽ được cung cấp link để reset lại password: ![image](https://hackmd.io/_uploads/BJHBYPongl.png) Thay đổi host và tham số `username=carlos` ![image](https://hackmd.io/_uploads/ByjeFPs3lx.png) Vào check log ![image](https://hackmd.io/_uploads/rkL3FDohxe.png) Dùng token để reset lại password của carlos và đăng nhập lại. ![image](https://hackmd.io/_uploads/SkZfqvi3le.png) ### Lab: Password reset poisoning via middleware https://hackmd.io/VNhGRFS1QISdu2RyBlolmw#Lab-Password-reset-poisoning-via-middleware ### Lab: Password reset poisoning via dangling markup Forgot password: ![image](https://hackmd.io/_uploads/SJotTvi2ex.png) ``` Sent: 2025-10-02 03:11:14 +0000 From: no-reply@0a01004103d1eb698385c3e3007c00dd.web-security-academy.net To: wiener@exploit-0aed00a603ebeb188313c209010c00bf.exploit-server.net Subject: Account recovery <p>Hello!</p> <p>Please <a href='https://0a01004103d1eb698385c3e3007c00dd.web-security-academy.net/login'>click here</a> to login with your new password: JcaLPBFXw2</p> <p>Thanks,<br/>Support team</p> <i>This email has been scanned by the MacCarthy Email Security service</i> ``` Nếu ứng dụng không dùng token đặt lại và thay vào đó gửi mật khẩu mới trực tiếp trong body email,ta có thể khai thác điều này bằng cách chèn `HTML` vào `header Host` để phá vỡ cấu trúc `markup` và làm rò rỉ toàn bộ nội dung tới server độc hại của bạn thông qua một yêu cầu `GET`. Ví dụ đổi password `wiener` ![image](https://hackmd.io/_uploads/Sy4s9Os3xe.png) ![image](https://hackmd.io/_uploads/H1G2qOihxe.png) ![image](https://hackmd.io/_uploads/S1ZTqds3xe.png) Tương tự đổi tên thành `carlos`, thêm html vào `port` và `View raw` để xem password ![image](https://hackmd.io/_uploads/B1xjUuo3gx.png) ![image](https://hackmd.io/_uploads/S15tIus2gx.png) ![image](https://hackmd.io/_uploads/HJppU_onxl.png) ## Web cache poisoning Khi thăm dò tấn công qua tiêu đề Host, ta thường thấy các hành vi dễ bị tổn thương nhưng không khai thác trực tiếp được. Ví dụ: tiêu đề Host có thể được reflected trong mã phản hồi mà không được mã hóa HTML, hay dùng trực tiếp trong script. Các lỗ hổng phía client như XSS thường không khai thác được qua tiêu đề Host vì không thể buộc trình duyệt gửi host sai. Tuy nhiên, nếu mục tiêu dùng bộ nhớ đệm web, ta có thể biến lỗ hổng reflected này thành lỗ hổng lưu trữ nguy hiểm bằng cách đầu độc bộ nhớ đệm để nó phân phát phản hồi độc cho người dùng khác. Để tấn công đầu độc bộ nhớ đệm web: 1. Yêu cầu máy chủ phản hồi chứa mã độc 2. Giữ nguyên khóa bộ nhớ đệm để ánh xạ tới request của người dùng khác 3. Lưu phản hồi độc vào bộ nhớ đệm Bộ nhớ đệm độc lập thường dùng tiêu đề Host làm khóa, nên kỹ thuật này hiệu quả nhất với bộ nhớ đệm tích hợp trong ứng dụng. ### Lab: Web cache poisoning via ambiguous requests ![image](https://hackmd.io/_uploads/HJjSdvahxe.png) ![image](https://hackmd.io/_uploads/rk7puD6nle.png) ![image](https://hackmd.io/_uploads/BkfRdPTnex.png) ## Exploiting classic server-side vulnerabilities Mọi header HTTP đều có thể là vector để khai thác các lỗ hổng phía máy chủ cổ điển, và header Host không phải ngoại lệ. Ví dụ, bạn nên thử các kỹ thuật dò tìm SQL injection thông thường thông qua header Host. Nếu giá trị của header này được đưa vào một câu lệnh SQL, nó có thể bị khai thác. ## Bypassing authentication ### Lab: Host header authentication bypass ![image](https://hackmd.io/_uploads/rJa7eua2ee.png) ![image](https://hackmd.io/_uploads/HkTAfdphlx.png) ![image](https://hackmd.io/_uploads/rkI-X_63ll.png) ## Virtual host brute-forcing Các công ty đôi khi mắc sai lầm khi đặt các website công khai và các site nội bộ riêng tư trên cùng một máy chủ. Máy chủ thường có cả địa chỉ IP công khai và IP riêng (private). Vì tên host nội bộ có thể phân giải về địa chỉ IP riêng, tình huống này không luôn luôn phát hiện được chỉ bằng cách xem bản ghi DNS: ``` www.example.com: 12.34.56.78 intranet.example.com: 10.0.0.132 ``` Trong một số trường hợp, site nội bộ thậm chí có thể không có bản ghi DNS công khai nào liên quan. Tuy nhiên, kẻ tấn công thường có thể truy cập bất kỳ virtual host nào trên máy chủ mà họ tiếp cận được, miễn là họ đoán đúng tên host. Nếu họ đã phát hiện được tên miền ẩn bằng các cách khác, như rò rỉ thông tin, họ chỉ cần gửi yêu cầu trực tiếp tới tên đó. Nếu không, họ có thể dùng các công cụ như Burp Intruder để brute-force các virtual host bằng một wordlist đơn giản gồm các tên miền phụ khả dĩ. ## Routing-based SSRF Đây là dạng tấn công SSRF khai thác tiêu đề **Host**. Khi các thành phần trung gian như proxy được cấu hình không an toàn, chúng có thể bị lừa chuyển hướng yêu cầu đến bất kỳ hệ thống nào mà kẻ tấn công chỉ định, kể cả các server nội bộ. **Cách thực hiện:** 1. **Phát hiện:** Dùng công cụ (như Burp Collaborator) đặt vào Host header. Nếu nhận được phản hồi, lỗ hổng tồn tại. 2. **Khai thác:** Tìm và tấn công vào các địa chỉ IP nội bộ (thông qua rò rỉ, quét tên miền hoặc brute-force các dải IP private như 192.168.0.0/16). ### Lab: Routing-based SSRF Thay host của Burp Collaborator's ![image](https://hackmd.io/_uploads/rJD9a_Tngl.png) Chuyển request `GET` sang intruder: ![image](https://hackmd.io/_uploads/B1RJAO63xx.png) ![image](https://hackmd.io/_uploads/SyOXAd62lg.png) Copy response và mở lại ở trình duyệt: ![image](https://hackmd.io/_uploads/rkWEeK62eg.png) ![image](https://hackmd.io/_uploads/HyjXxtp2lx.png) ### Lab: SSRF via flawed request parsing ![image](https://hackmd.io/_uploads/r1aekGRngg.png) ![image](https://hackmd.io/_uploads/HykNyf02xg.png) Vào intruder bruteforce: ![image](https://hackmd.io/_uploads/SkSKyzR2xg.png) ![image](https://hackmd.io/_uploads/B1MQxMRnge.png) ![image](https://hackmd.io/_uploads/SJIcxM0neg.png) ## Connection state attacks Vì lý do hiệu suất, nhiều website thường tái sử dụng kết nối cho nhiều request từ cùng một client. Một số máy chủ HTTP được triển khai kém có giả định sai lầm rằng các thuộc tính như Host header sẽ giống nhau cho mọi request HTTP/1.1 trên cùng kết nối. Điều này tạo ra nhiều lỗ hổng bảo mật. Ví dụ, có server chỉ validate kỹ request đầu tiên trên kết nối mới. Kẻ tấn công có thể gửi một request vô hại trước, rồi gửi request độc hại tiếp theo trên cùng kết nối để bypass validation. Nhiều reverse proxy dùng Host header để định tuyến request. Nếu chúng cho rằng mọi request trên kết nối đều gửi đến cùng host như request đầu, sẽ dẫn đến các lỗ hổng như SSRF, password reset poisoning và cache poisoning. ### Lab: Host validation bypass via connection state attack ![image](https://hackmd.io/_uploads/Sy2rwzC2xl.png) ![image](https://hackmd.io/_uploads/SkZt07C2eg.png) ![image](https://hackmd.io/_uploads/S11oA702gx.png) ![image](https://hackmd.io/_uploads/SywZJEAnxl.png) ## SSRF via a malformed request line Các proxy tùy chỉnh đôi khi không xác thực dòng yêu cầu một cách chính xác, cho phép kẻ tấn công cung cấp các đầu vào bất thường và có định dạng sai, dẫn đến những hậu quả không mong muốn. Ví dụ, một reverse proxy có thể lấy đường dẫn từ dòng yêu cầu, thêm tiền tố `http://backend-server` vào và chuyển hướng yêu cầu đến URL upstream đó. Cách này hoạt động bình thường nếu đường dẫn bắt đầu bằng ký tự `/`, nhưng nếu nó bắt đầu bằng ký tự `@` thì sao? ``` GET @private-intranet/example HTTP/1.1 ``` URL upstream kết quả sẽ là `http://backend-server@private-intranet/example`, mà hầu hết các thư viện HTTP diễn giải thành một yêu cầu truy cập vào `private-intranet` với tên người dùng `backend-server`. # References https://portswigger.net/web-security/host-header https://viblo.asia/p/http-host-header-attack-tan-cong-tieu-de-host-trong-giao-thuc-http-phan-1-GyZJZ3NNLjm

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password
    or
    Sign in via Google Sign in via Facebook Sign in via X(Twitter) Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    By signing in, you agree to our terms of service.

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully