2017版OWASP top 10 將API安全納入其中,足以說明API被廣泛使用且安全問題嚴重。自己嘗試整理一下,但限於本人搬磚經驗還不足、水平有限,本文只能算是拋磚引玉,希望大伙不吝賜教。
了解Web Service(API)
Web Service是一種跨編程語言和跨操作系統平台的遠程調用技術。目前被廣泛運用於移動端APP、物聯網IoT、WEB應用等場景。
主流Web Service實現方式
SOAP/XML
簡單對象訪問協議(SOAP)接口,通過HTTP進行消息傳輸。它是基於xml語言開發,使用Web服務描述語言(WSDL)來進行接口描述。是一種很成熟的Web Service實現方式,整體上有被REST取代的趨勢。
REST/JSON
表現層狀態轉移(REST),本質上講的是一種ROA(Resource Oriented Architecture)架構風格。符合這種架構風格的API接口,我們稱之為RESTful API。
PS: REST風格的接口既可以使用JSON,也可以使用XML,但由於JSON更加輕,故而基本不用XML。
XML示例:
1
2
3
4
5
6
7
8
9
10
11
|
<?xml version="1.0" encoding="UTF-8" ?>
<person>
<name>Jason</name>
<age>99</age>
<sex>male</sex>
<contact>
<mobile>13888888888</mobile>
<email>bingo@tass.com.cn</email>
<wechat>bingo</wechat>
</contact>
</person>
|
JSON示例:
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"person": {
"name": "Jason",
"age": "99",
"sex": "male",
"contact": {
"mobile": "13888888888",
"email": "bingo@tass.com.cn",
"wechat": "bingo"
}
}
}
|
API安全
API的安全要素
-
認證和鑒權 - 認證用戶身份 & 確定用戶權限
通常情況下,webAPI是基於HTTP協議的,也是無狀態傳輸的。故而認證任務就需要我們自己實現,所以原則上每一次API請求都需要帶上身份認證信息,通常使用的是API key。
-
加密和簽名 - 保證信息的保密性和完整性
通常使用SSL/TLS來加密通信消息,由API客戶端發送和接收。簽名用於確保API請求和響應在傳輸過程中未被篡改。
-
漏洞 - 注入攻擊 & 敏感數據泄露 & 越權訪問
攻擊面檢測
- 盡可能多的了解API端點、消息、參數、行為。
- 發現API中可能存在問題的元數據。
- 記錄流量進一步學習API
- 爆破 - 暴力破解路徑或資源
攻擊方式
1.模糊測試
使用自動化工具並行的將大量的隨機內容(各種可能的值或可能的攻擊向量)作為輸入參數進行長時間的嘗試,並自動驗證響應信息,確認是否獲取到意外收獲(系統或代碼相關的信息)。
2.注入攻擊
使用SQL,XML,Xpath,JSON,JavaScript等的常見攻擊向量嘗試進行代碼注入,並驗證意外響應。
3.無效/越界內容
嘗試各種無效或者超范圍的內容,並驗證響應信息。
4.惡意內容
在上傳功能點嘗試上傳可執行文件或腳本等,使服務器嘗試進行解析。
5.XSS
上傳常見攻擊向量進行XSS(反射型,存儲型等)測試。
6.CSRF
測試API是否含有token,token是否能復用,是否可被偽造。
7.不安全的直接對象引用
嘗試對順序化的id號進行越權訪問,嘗試訪問無權限的方法或操作。
8.其它考慮
會話認證(token是否正確使用)
安全配置(前述攻擊照成系統/應用等信息泄露)
攻擊演示
1. DVWS | WSDL Enumeration
前端頁面
源碼中暴露wsdl文件
wsdl文件中可以查看到四種方法
使用READY!API(SOAPUI升級版)可以直觀的看到4種方法並進行接口測試
嘗試使用check_user_information方法,嘗試填入username(實際測試中可能需要結合爆破方式),接口返回了相關數據,從而導致數據泄露。
2. DVWS | XML External Entity Processing
提交正常請求:
1
|
<name>Mr.Bingo</name>
|
提交payload:
1
|
<?xml version="1.0"?> <!DOCTYPE bingo [ <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><name>&xxe;</name>
|
額外測試:
3. DVWS | Server Side Request Forgery
正常數據請求
篡改請求URL
4. DVWS | REST API SQL Injection
正常請求資源:
SQL注入:
5. bWAPP | SQL Injection - Blind (WS/SOAP)
由於在前端屏蔽了后端所采用的API接口功能,故而貼出部分源碼以供參考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
if(isset($_REQUEST["title"]))
{
// Includes the NuSOAP library
require_once("soap/nusoap.php");
// Creates an instance of the soap_client class
$client = new nusoap_client("http://localhost/bWAPP/ws_soap.php");
// Calls the SOAP function
$tickets_stock = $client->call("get_tickets_stock", array("title" => sqli($_REQUEST["title"])));
echo "We have <b>" . $tickets_stock . "</b> movie tickets available in our stock.";
}
?>
|
當前個人對API接口測試的理解尚比較粗淺。涉及到fuzz、加解密及其他復雜的場景尚且無法拿出好的案例及測試平台。后續有機會再行補充,另外,希望有貨的大佬們能多多分享。
參考資料
測試工具
- Ready!API ( SoapUI )
- Burpsuite
-
FuzzAPI
測試平台
-
Hackazon https://github.com/rapid7/hackazon
Web Version http://hackazon.webscantest.com
-
Mutillidae https://sourceforge.net/projects/mutillidae/
-
Juice-shop https://github.com/bkimminich/juice-shop
參考資料
-
OWASP Top 10 - 2017 RC1
-
REST API 安全設計指南 http://www.freebuf.com/articles/web/82108.html
-
REST Security Cheat Sheet https://www.owasp.org/index.php/REST_Security_Cheat_Sheet