Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1325 CNY

100%

CVE-2021-26084 PoC — Atlassian Confluence Server 注入漏洞

Source
Associated Vulnerability
Title:Atlassian Confluence Server 注入漏洞 (CVE-2021-26084)
Description:In affected versions of Confluence Server and Data Center, an OGNL injection vulnerability exists that would allow an unauthenticated attacker to execute arbitrary code on a Confluence Server or Data Center instance. The affected versions are before version 6.13.23, from version 6.14.0 before 7.4.11, from version 7.5.0 before 7.11.6, and from version 7.12.0 before 7.12.5.
Readme
# CVE-2021-26084

Phạm vi ảnh hưởng

Phiên bản < 6.13.23

6.14.0 ≤ Phiên bản < 7.4.11

7.5.0  ≤ Phiên bản < 7.11.6

7.12.0 ≤ Phiên bản < 7.12.5

Nguyên nhân, Cách khai thác

Confluence sử dụng framework để map URL tới các lớp Java, tạo ra cái được gọi là “action”. Action URLs kết thúc bằng “.action” và được xác định trong tệp xwork.xml ở confluence-<version>.jar và trong tệp atlassian-plugin.xml trong các tệp JAR của các plugin đi kèm. Mỗi action chứa ít nhất một thuộc tính name, xác định tên hành động, một thuộc tính class, xác định class Java thực hiện action và ít nhất một phần tử result quyết định Velocity template sẽ hiển thị sau khi action được gọi dựa trên result của action. Các giá trị phổ biến được trả về từ các action là “error”, “input”, “success”, nhưng bất kỳ kết quả nào cũng có thể được sử dụng nếu nó phù hợp với phần tử result trong XWork XML.  Các action có thể chứa thuộc tính phương thức cho phép gọi một phương thức cụ thể của class Java đã chỉ định. Khi không có lệnh nào được chỉ định, phương thức doDefault() sẽ được gọi. Dưới đây là mục action cho createpage-entervariables action:

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/bd19f06f-1f1a-45d6-b14c-b931a1d5c307)

Phương thức doEnter() của class com.atlassian.confluence.pages.actions.PageVariablesAction xử lý các yêu cầu tới doenterpagevariables.action và trả về các giá trị “error”, “input”, “success”. Điều này dẫn tới Velocity template sẽ được hiển thị.

Ở đây, giá trị thuộc tính “name” của một phần tử action tương ứng với một đường dẫn /<nameValue>.action và phần tử chứa template nào sẽ được hiển thị như một phần của phản hồi dựa trên error/success,... Vì vậy theo ví dụ này chỉ cần truy cập /pages/doenterpagevariables.action sẽ hiển thị tệp velocity template.

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/74a117b4-13fe-4ff3-a6f6-10e361fae2b8)

Chúng ta có thể thấy velocity template được hiển thị như thế nào trong trang HTML

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/5a54acd1-2d2b-417a-bc6e-49527e2b0992)

Nhập tên thẻ trong template làm tham số và nhận thấy rằng các giá trị được lấy từ tham số request và được trả lại trong response.

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/314a810a-e764-4dd4-8531-e323b46b7826)

Cách sử dụng của #tag : #tag (“attribute1”, “attribute2”, “attribute3”)

Các attribute này trong quá trình render sẽ được lấy tại AbstrctTagDirective.applyAttributes()

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/81d6f6c1-d4d4-4e7c-971d-7a9bf7c53bd6)

#tag ("Hidden" "name='queryString'" "value='ahihihi'")

Sau khi các attribyte được lấy ra bởi phương thức AbstrctTagDirective.applyAttributes(), nó được truyền vào AbstrctUITag.doEndTag()  AbstractUITag.evaluateParams()

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/c1189a4d-81d6-4816-9b3e-15ec630bfd4d)

Sau đó tiếp tục được truyền vào WebWorkTagSupport.findValue()  OgnlValueFinder.findValue() với dạng expression

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/692726a4-b2ae-49b1-9ed4-312d28e2ecee)

Sau đó truyền vào SafeExpressionUtil.isSafeExpression()

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/6849b5c3-9fd2-4c8f-a4e4-5da7525efb3e)

Tại đây expression đã được truyền vào compile, kiểm tra blacklist và đẩy vào cache. Qua bước compile sẽ được compile sang dạng ASTConst khi được đánh giá thì sẽ return về chuỗi đã được compile từ trước.

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/179af5f8-2222-42f6-88dd-f821a9ab6d8f)

Khi expression được thêm dấu “’” từ input thì đã bị escape sang dạng html entity 

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/ab43d9f1-c5d8-4ebb-b522-075fdbc06f4a)

Điểm escape là tại HtmlAnnotationEscaper.annotatedValueInsert()

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/bb3559fe-6e05-44d6-9f18-789f67ecc719)

Tại đây phương thức ognl.JavaCharStream.readChar() được gọi và đánh giá các ký tự Unicode escape, do đó khi truyền “\u0027” vào thì nó sẽ convert sang “’”. Do đó có thể escape và nối thêm OGNL expression

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/bf7e4ce2-5624-4814-90eb-9699c8b003bb)

Nhưng phải vượt qua được blacklist của OGNL như sau

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/0766e0a6-a758-4068-84c6-fd637930d04b)

Có thể vượt qua bằng cách sử dụng Array accessors thay vì sử dụng phương thức “getClass” hoặc thuộc tính “.class”. 

queryString=aaa\u0027%2b#{\u0022\u0022[\u0022class\u0022]}%2b\u0027bbb

![image](https://github.com/nahcusira/CVE-2021-26084/assets/87233531/afae2cc0-8dfb-4a37-b334-0b5b3e5c6f29)

Cách thức phát hiện

Giám sát tất cả các yêu cầu lưu lượng HTTP trong đó thành phần đường dẫn của URI yêu cầu chứa một trong các chuỗi trong cột " URI Path" của bảng sau:

URI Path	                                       |          Vulnerable Parameters

/users/darkfeatures.action	                     |          featureKey

/users/enabledarkfeature.action	                 |          featureKey

/users/disabledarkfeature.action	               |          featureKey

/login.action	                                   |          token

/dologin.action	                                 |          token

/signup.action	                                 |          token

/dosignup.action	                               |          token

/pages/createpage-entervariables.action	         |          queryString, linkCreation

/pages/doenterpagevariables.action	             |          queryString

/pages/createpage.action	                       |          queryString

/pages/createpage-choosetemplate.action	         |          queryString

/pages/docreatepagefromtemplate.action	         |          queryString

/pages/docreatepage.action	                     |          queryString

/pages/createblogpost.action	                   |          queryString

/pages/docreateblogpost.action	                 |          queryString

/pages/copypage.action	                         |          queryString

/pages/docopypage.action	                       |          queryString

/plugins/editor-loader/editor.action	           |          syncRev

Nếu tìm thấy yêu cầu như vậy thì nên kiểm tra phương thức HTTP request. Nếu phương thức yêu cầu là POST, thì tìm Vulnerable Parameters tương ứng từ bảng trên trong phần body của HTTP request và nếu phương thức yêu cầu là GET, thì tìm các parameter trong request-URI của HTTP request. Kiểm tra xem giá trị của bất kỳ Vulnerable Parameters nào có chứa chuỗi “\u0027” hoặc dạng mã hóa URL của chuỗi đó hay không. Nếu vậy, lưu lượng truy cập sẽ được coi là độc hại và một cuộc tấn công khai thác lỗ hổng này có thể đang diễn ra.
File Snapshot

Log in to view the POC file snapshot cached by Shenlong Bot

Log in to view
Remarks
    1. It is advised to access via the original source first.
    2. Local POC snapshots are reserved for subscribers — if the original source is unavailable, the local mirror is part of the paid plan.
    3. Mirroring, verifying, and maintaining this POC archive takes ongoing effort, so local snapshots are a paid feature. Your subscription keeps the archive online — thank you for the support. View subscription plans →