taibeihacker
Moderator
必要性
前後端分離已經成為web的一大趨勢,通過Tomcat+Ngnix(也可以中間有個Node.js),有效地進行解耦。並且前後端分離會為以後的大型分佈式架構、彈性計算架構、微服務架構、多端化服務(多種客戶端,例如:瀏覽器,車載終端,安卓,IOS等等)打下堅實的基礎。而API就承擔了前後端的通信的職責。所以學習api安全很有必要。本文的思路在於總結一些api方面常見的攻擊面。筆者在這塊也尚在學習中,如有錯誤,還望各位斧正。
常见的api技术
GraphQL
GraphQL 是一個用於API 的查詢語言通常有如下特徵:
(1)數據包都是發送至/graphql接口

(2)其中包含了很多換行符\n
{'query':'\n query IntrospectionQuery {\r\n __schema {\r\n queryType { name }\r\n mutationType { name }\r\n subscriptionType { name }\r\n types {\r\n .FullType\r\n }\r\n directives {\r\n name\r\n description\r\n locations\r\n args {\r\n .InputValue\r\n }\r\n }\r\n }\r\n }\r\n\r\n fragment FullType on __Type {\r\n kind\r\n name\r\n description\r\n fields(includeDeprecated: true) {\r\n name\r\n description\r\n args {\r\n .InputValue\r\n }\r\n type {\r\n .TypeRef\r\n }\r\n isDeprecated\r\n deprecationReason\r\n }\r\n inputFields {\r\n .InputValue\r\n }\r\n interfaces {\r\n .TypeRef\r\n }\r\n enumValues(includeDeprecated: true) {\r\n name\r\n description\r\n isDeprecated\r\n deprecationReason\r\n }\r\n possibleTypes {\r\n .TypeRef\r\n }\r\n }\r\n\r\n fragment InputValue on __InputValue {\r\n name\r\n description\r\n type { .TypeRef }\r\n defaultValue\r\n }\r\n\r\n fragment TypeRef on __Type {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ','variables':null}
SOAP-WSDL
WSDL (Web Services Description Language,Web服務描述語言)是一種XML Application,他將Web服務描述定義為一組服務訪問點,客戶端可以通過這些服務訪問點對包含面向文檔信息或面向過程調用的服務進行訪問走的是SOAP協議,一般發送的xml格式的數據,然後會有WSDL文件
.net中常見的.asmx文件也有wsdl格式xxx.asmx?wsdl

我們可以使用soapui對這類api進行測試
WADL
文件裡面有很明顯的wadl標誌
同樣也可以用soapui的rest功能進行測試

REST
rest api並不像前面幾種那種特徵明顯,也是如今使用最多的一種api技術REST 是一組架構規範,並非協議或標準。 API 開發人員可以採用各種方式實施REST。
當客戶端通過RESTful API 提出請求時,它會將資源狀態表述傳遞給請求者或終端。該信息或表述通過HTTP 以下列某種格式傳輸:JSON(Javascript 對象表示法)、HTML、XLT、Python、PHP 或純文本。 JSON 是最常用的編程語言,儘管它的名字英文原意為“JavaScript 對象表示法”,但它適用於各種語言,並且人和機器都能讀。
還有一些需要注意的地方:頭和參數在RESTful API HTTP 請求的HTTP 方法中也很重要,因為其中包含了請求的元數據、授權、統一資源標識符(URI)、緩存、cookie 等重要標識信息。有請求頭和響應頭,每個頭都有自己的HTTP 連接信息和狀態碼。
获取端点的方式
對於api的一些安全測試,通常關注api的權限問題,api端點和基礎設施的安全問題。要測試api端點的安全問題,肯定得盡量獲取多的api端點
swagger api-docs泄露
Swagger 是一個規範和完整的框架,用於生成、描述、調用和可視化RESTful 風格的Web 服務常見指紋:
# swagger 2
/swagger-ui.html
/api-docs
/v2/api-docs
# swagger 3
/swagger-ui/index.html

/api-docs
/v2/api-docs
/v3/api-docs
.
api-docs可洩露所有端點信息

這裡推薦兩個工具進行測試
第一個是swagger-editor
GitHub - swagger-api/swagger-editor: Swagger Editor
Swagger Editor. Contribute to swagger-api/swagger-editor development by creating an account on GitHub.

第二個是apikithttps://github.com/API-Security/APIKit
burp插件

graphql内省查询
獲取所有端點信息{'query':'\n query IntrospectionQuery {\r\n __schema {\r\n queryType { name }\r\n mutationType { name }\r\n subscriptionType { name }\r\n types {\r\n .FullType\r\n }\r\n directives {\r\n name\r\n description\r\n locations\r\n args {\r\n .InputValue\r\n }\r\n }\r\n }\r\n }\r\n\r\n fragment FullType on __Type {\r\n kind\r\n name\r\n description\r\n fields(includeDeprecated: true) {\r\n name\r\n description\r\n args {\r\n .InputValue\r\n }\r\n type {\r\n .TypeRef\r\n }\r\n isDeprecated\r\n deprecationReason\r\n }\r\n inputFields {\r\n .InputValue\r\n }\r\n interfaces {\r\n .TypeRef\r\n }\r\n enumValues(includeDeprecated: true) {\r\n name\r\n description\r\n isDeprecated\r\n deprecationReason\r\n }\r\n possibleTypes {\r\n .TypeRef\r\n }\r\n }\r\n\r\n fragment InputValue on __InputValue {\r\n name\r\n description\r\n type { .TypeRef }\r\n defaultValue\r\n }\r\n\r\n fragment TypeRef on __Type {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ','variables':null}

我們可以用這個生成接口文檔:
GitHub - 2fd/graphdoc: Static page generator for documenting GraphQL Schema
Static page generator for documenting GraphQL Schema - 2fd/graphdoc
npm install -g @2fd/graphdoc
graphdoc -s ./test.json -o ./doc/schema
然後我們打開生成的/doc/index.html

根據他這個格式構造數據包就行了


其他
在黑盒測試中,很大一個問題就是api端點找得不夠全,我們需要從對應的應用或者從其他方面找(1)web
js html等靜態資源可以有一些api端點
burp插件JS LinkFinder可以被動收集
(2)app和其他客戶端應用
(3)github
(4)根據規律fuzz
鉴权方式
Basic Auth
每次請求API時都提供用戶的username和password通常在http數據包中有一個Authorization頭
Authorization: Basic base64(username

這個安全性比較低,現在很少用到
JWT
jwt(json web token)是一種基於Token 的認證授權機制分為三部分
Header: 描述JWT 的元數據,定義了生成簽名的算法以及Token 的類型。Payload: 用來存放實際需要傳遞的數據Signature(签名):服務器通過Payload、Header 和一個密鑰(Secret)使用Header 裡面指定的簽名算法(默認是HMAC SHA256)生成防止JWT被篡改計算方式加密算法( base64(header) + '.' + base64(payload), secret)

在線測試https://jwt.io/

普通token需要後端存儲與用戶的對應關係,而JWT自身攜帶對應關係
其他自定义头、cookie
諸如apikey 或者隨機生成的其他形式的token常见安全问题及测试方法
api网关
API 網關是一個搭建在客戶端和微服務之間的服務,我們可以在API 網關中處理一些非業務功能的邏輯,例如權限驗證、監控、緩存、請求路由等。API 網關就像整個微服務系統的門面一樣,是系統對外的唯一入口。有了它,客戶端會先將請求發送到API 網關,然後由API 網關根據請求的標識信息將請求轉發到微服務實例。

apisix
Apache APISIX 是Apache 軟件基金會下的雲原生API 網關,它兼具動態、實時、高性能等特點,提供了負載均衡、動態上游、灰度發布(金絲雀發布)、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。我們可以使用Apache APISIX 來處理傳統的南北向流量,也可以處理服務間的東西向流量。同時,它也支持作為K8s Ingress Controller 來使用。 apisix之前爆出過一個命令執行漏洞CVE-2022-24112 (目前最新版本是3.0)影響範圍:
Apache APISIX 1.3 ~ 2.12.1 之間的所有版本(不包含2.12.1 )
Apache APISIX 2.10.0 ~ 2.10.4 LTS 之間的所有版本(不包含2.10.4)搭建漏洞環境
git clone https://github.com/twseptian/cve-2022-24112 ##獲取dockerfile文件
cd cve-2022-24112/apisix-docker/example/##進入相應目錄
docker-compose -p docker-apisix up -d ##啟動基於docker的apisix所有服務利用條件
batch-requests插件默認開啟狀態。
用戶使用了Apache APISIX 默認配置(啟用Admin API ,使用默認Admin Key 且沒有額外分配管理端口),攻擊者可以通過batch-requests 插件調用Admin API 。攻擊思路
1、利用batch-requests 插件漏洞、繞過請求頭檢測;
2、通過偽造請求頭、向Admin API 註冊路由;
3、註冊路由時、攜帶參數filter_func 傳遞lua代碼、造成遠程代碼執行漏洞exp:
cve-2022-24112/poc/poc2.py at main · twseptian/cve-2022-24112
Apache APISIX < 2.12.1 Remote Code Execution and Docker Lab - twseptian/cve-2022-24112