Web安全之邏輯漏洞全方位總結(jié)
1、水平越權(quán)
1.1、原理
通過更換某個ID之類的身份標識,從而使得A賬號獲取(修改,刪除等)B賬號的數(shù)據(jù);
1.2、容易出現(xiàn)的地方:
一般越權(quán)漏洞容易出現(xiàn)在權(quán)限頁面(需要登陸的頁面)增,刪,改,查的地方,當用戶對權(quán)限頁面內(nèi)的信息進行這些操作時,后臺需要對當前用戶的權(quán)限進行校驗,看其是否具備操作權(quán)限,從而給出響應(yīng),而如果校驗的規(guī)則過于簡單則容易出現(xiàn)越權(quán)漏洞;
1.3、案例演示
1)我們登陸到pikachu靶場,首先看一下提示:
2)一共兩個用戶,我們登陸到kobe用戶,來測試越權(quán)到luck用戶,我們首先登錄到kobe賬戶里面,點擊查看個人信息,抓到包;
3)我們將這里的kobe改為lucy,放包;
4)成功越權(quán)到lucy用戶
1.4、危害
在游戲中,假如我們是平民玩家,我們僅僅通過修改ID,就變成了其他玩家,甚至有可能變成氪金大佬;
2、垂直越權(quán)
2.1、原理
使用低權(quán)限身份的賬號,發(fā)送高權(quán)限賬號才能有的請求,獲得其高權(quán)限的操作;
2.2、容易出現(xiàn)的地方
看看低權(quán)限用戶是否能越權(quán)使用高權(quán)限用戶的功能,比如普通用戶可以使用管理員的功能;
2.3、案例演示
1)我們首先用admin/123456,進行登陸;
2)我們添加用戶進行抓包,然后放在重發(fā)器;
3)我們緊接著用pikachu/000000,進行登陸,抓包,將pikachu的cookie替換admin用戶的cookie;
4)我們發(fā)送包;
利用pikachu用戶利用admin的cookie成功創(chuàng)建了test賬戶;
2.4、危害
信息泄露,篡改用戶信息,嚴重者可修改密碼等等;
3、墨者靶場演示
1)打開靶場
2)登錄給出的test用戶
3)我們這里通過抓包進行分析,對card_id進行分析
4)發(fā)到測試器進行爆破
通過前端分析,他可能是316
5)看響應(yīng)
輸入賬號,對密碼進行MD5解密
6)登錄成功
4、越權(quán)漏洞檢測-burp插件-autorize使用
Autorize是一個旨在幫助滲透測試人員檢測授權(quán)漏洞的擴展,這是Web應(yīng)用程序滲透測試中比較耗時的任務(wù)之一;
將低權(quán)限用戶的cookie提供給擴展程序并使用高權(quán)限用戶瀏覽網(wǎng)站就足夠了,該擴展會自動重復(fù)每一個請求與低權(quán)限用戶的會話并檢測授權(quán)漏洞;
除了授權(quán)漏洞之外,還可以在沒有任何cookie的情況下重復(fù)每一個請求,以檢測身份驗證漏洞;
該插件無需任何配置即可工作,但也是高度可定制的,允許配置授權(quán)執(zhí)行條件的粒度以及插件必須測試那些請求,那些不需要,可以保存插件的狀態(tài)并以HTML或CSV格式導(dǎo)出授權(quán)測試報告;
報告的執(zhí)行狀態(tài)如下:
- 繞過!-紅色
- 強制執(zhí)行!-綠色
- 強制執(zhí)行???(請配置強制檢測器) -黃色
4.1、安裝
1)首先我們需要下載Jython Standalone:https://www.jython.org/download
我們需要選擇紅框里面的進行下載:
2)配置如下:
3)我們配置好之后,接著安裝!
4.2、使用(pikachu為例)
1)獲取低權(quán)限的cookie,我們在垂直越權(quán)的目錄,首先獲取pikachu/000000的cookie;
2)接著我們?nèi)ピL問高權(quán)限的賬號,這里需要注意,先打開插件的開關(guān),然后再去訪問高權(quán)限的賬號;
3)接著就會出現(xiàn)結(jié)果;
左邊一列 紅色代表存在越權(quán)可能;
右邊一列 紅色代表存在未授權(quán)訪問可能;
接著點擊 三代表響應(yīng)長度的數(shù)字,在右側(cè)查看具體響應(yīng);
如果是 響應(yīng)中 包含敏感數(shù)據(jù),或者一些增刪改的post請求,就可以報bug了;
5、支付漏洞
5.1、直接修改商品價格
在支付過程中,購買商品一般分為三個步驟:訂購,確認信息,付款,那么這個修改價格具體時修改那一步時的價格?在我看來你可以在這三個步驟中隨便一個步驟進行價格的修改,進行測試,如果前面兩步有驗證機制,那么你可在最后一步付款進行抓包嘗試修改金額,如果沒有在最后一步做好檢驗,那么問題就會存在,其修改的金額值,你可以嘗試小數(shù)目或者負數(shù),去測試;
參考案例:http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2016-0226613
5.2、修改支付狀態(tài)
1)這個很好理解,就是假設(shè)A商品,我們進行了購買,用bp進行抓包,我們看到某一個字段;
0:表示支付成功
1:表示支付失敗
假設(shè)我們暫時還未支付,bp顯示的是1,我們將1修改為0;
2)還有我們?nèi)ベ徺IA商品,是10元,B商品是1000元,我們先購買A商品,將A商品的數(shù)據(jù)包,給B商品,那么我們就能通過10元購買10000元的商品;
我們抓取購買包,放在重放器,這個商品為5400元;
我們將數(shù)據(jù)包放在重放器,重要的字段,我們做一下記錄;
index.php?m=Member&a=gobuy&iscart=0&id=69&name=%E5%A4%A7%E7%B1%B3CMS%E6%89%8B%E6%9C%BA%E5%BC%80%E5%8F%91%E4%B8%93%E7%89%88&qty=1&price=5400>ype=%E7%81%B0%E8%89%B2&pic=/damicms/Public/Uploads/thumb/thumb_1393206337.jpg
我們繼續(xù)在購買6000元的手機;
抓包,根據(jù)經(jīng)驗,我們將5400手機的數(shù)據(jù)包,放在6000元手機這里;
兩個數(shù)據(jù)包進行對比:
我們將5400元手機的數(shù)據(jù)包替換掉6000元手機的數(shù)據(jù)包;
這里商品的價格就變成了5400;
5.3、修改商品的數(shù)量
支付中。假如1個饅頭10元錢,那么10個饅頭就是100元,那么-1個饅頭那?這種會不會產(chǎn)生零元購問題那?
我們可以看到一個手機為6000元,我們進行抓包;
這里qty這個字段非常可疑,我們將它修改為10,放包;
訂單金額變成了60000萬了,那么我們的猜想完全正確,我們將它的數(shù)量改為-1,看看什么情況;
這里的價格變成了-6000,說明漏洞確實存在;
5.4、另類支付
我們在支付的時候,常常會給你一些優(yōu)惠卷,積分,滿減等等,而這些值同樣都是由操作的空間
1)修改優(yōu)惠卷
一般優(yōu)惠卷進行消費往往出現(xiàn)在第二個步驟當中,確認購買信息,這個頁面當中,你可以選擇相關(guān)的優(yōu)惠卷,我們直接修改優(yōu)惠卷的金額,等于商品的價格,或者直接將其改為負數(shù),最后進行支付,如果說沒有對這個點加以驗證,那么直接可以支付成功;
2)修改優(yōu)惠卷金額及業(yè)務(wù)邏輯問題
當你修改其優(yōu)惠卷值為任意值或負數(shù)想要支付的時候,會顯示支付失敗,或者金額有誤等一些提示,可能這個時候,你會選擇放棄,但是當你點開個人中心的時候,點擊訂單詳情,如果存在這個邏輯問題,那么此時在你剛剛修改優(yōu)惠卷金額后點擊下一步支付的時候,其實已經(jīng)產(chǎn)生了訂單,在訂單的金額內(nèi),你可以看到支付金額為0,然后點擊支付就可以支付成功;
這里好友一個小技巧,有可能會支付失敗,但是如果你找到的這個問題是一個業(yè)務(wù)分站點,如果有自帶的錢包功能,那么你就可以利用這個自帶的錢包功能去支付這個訂單,而不要利用其他支付類型,就可以支付成功了;
3)修改積分金額
有些網(wǎng)站的積分,比如你消費了多少,就可以擁有一定量的積分,這個積分可以在你付款的時候進行折扣,如果這個積分的金額沒有做好校驗,那么你在支付當中將積分減去的金額變成商品本身的價格,或者負數(shù),是不是就可以產(chǎn)生0原購物了;
4)滿減修改
我們在雙十一的時候,很多會有滿300減100,這種功能,我們能不能將金額修改為滿101減100那?
參考案例:http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2016-0214319
5.5、修改支付接口
一些網(wǎng)站支持多種支付的接口,微信,支付寶,還有第三方的支付工具,然后每一個接口的值不一樣,如果邏輯設(shè)計不當,那我隨便選擇一個點擊時進行抓包,然后修改為一個不存在的支付接口,如果接口的相關(guān)處理沒有做到位,是不是會支付成功;
5.6、重復(fù)支付
淘寶,京東會有很多試用卡。一張卡可以試用一個商品,我們可以將這個試用的商品數(shù)據(jù)包多次重復(fù)提交,如果服務(wù)端沒有進行嚴格的校驗的話,就會產(chǎn)生很多這樣的訂單,這時候,我們將這個商品退掉,會怎么樣?我們會不會退回很多試用卡?
5.7、最小支付和最大支付
1)最小支付
很多測試人員在測試漏洞的時候,往往會將金額修改為0.01或者負數(shù),但這這樣會很容易錯失掉一些潛在的漏洞,比如一些網(wǎng)站有金幣或者積分什么的支付的時候可以用這些來支付,10元等于100積分,50元相當于500積分,這個問題如果你在充值的時候?qū)⒔痤~修改為0.01和負數(shù)會顯示支付失敗,但是如果你修改金額為1元,那么支付就會成功,也就是說1可以購買任意積分了?
其實你在測試的時候,就會發(fā)現(xiàn),1元對應(yīng)10積分,如果你修改0.01,那么對應(yīng)的積分就是null,所以會顯示失敗,而當你修改為1元支付接口時存在的,其后面積分數(shù)為其他金額的積分,然后跳轉(zhuǎn)過去支付就會以1元購買到比它多得多的積分,也可以時任意積分;
2)最大支付
一般在開發(fā)當中,商品的金額都會用int型來定義,最大值2147483647,我們嘗試修改為2147483648,看看是否能造成整數(shù)的溢出,有可能支付狀態(tài)異常,從而導(dǎo)致支付成功;
5.8、四舍五入導(dǎo)致支付漏洞
我們以充值為例,余額值一般保存到分為止,那么如果我充值了0.001元也就是1厘,一般開發(fā)會在前端判斷我們的數(shù)字,或者將最后一位四舍五入,使用支付寶值直接報錯,因為一般第三方只支持到分;
那我們?nèi)绻渲?.019?由于支付寶只判斷到分,所以導(dǎo)致只能支付0.01,而由于我們支付成功,前端會將9四舍五入,直接變成0.02,所以等于直接半價充值;
5.9、首單半價,無線重構(gòu)
很多會員啊什么的,為了留住用戶,都會有首月半價,或者免費等等活動,我們可以抓取這個數(shù)據(jù)包,進行多次支付,就可以一直優(yōu)惠購買(百度云去年就有這個漏洞,可以6元一月超級會員)
5.10、越權(quán)支付
這個問題很早之前就有了,現(xiàn)在很少存在這類問題,在支付當中會出現(xiàn)當前用戶的ID,比如ID=1,我們將ID改為2,如果沒有加以驗證,我們是不是用用戶2的錢支付了用戶1買商品的錢;
5.11、無線次試用
一些網(wǎng)站的一些商品,比如云系列產(chǎn)品支持試用,試用時期一般為7天或者30天,一個賬戶只能試用一次,試用期間不能試用,但如果這個試用接口沒有做好分配,那么很容易產(chǎn)生漏洞,比如支付的時候它的URL后面的支付接口為3,那么此時就會調(diào)用購買支付接口,但是由于你本身這個產(chǎn)品就是試用的,其相應(yīng)值綁定了這個試用的產(chǎn)品,那么金額肯定是0,那么最后點擊支付,你就可以看到支付成功,試用成功,又重復(fù)的試用了一次,然后他們的使用時間會累加到一起,這就導(dǎo)致了可無限制購買任何產(chǎn)品了;
5.12、多線程并發(fā)問題
多線程并發(fā)問題就是沒有實時的處理各種狀態(tài)所導(dǎo)致的問題,比如很多平臺都有自家的錢包,而這個錢包是一個迷你錢包,這個錢包作用也僅是用于當前這個平臺網(wǎng)站,再提現(xiàn)的時候,沒有做任何的驗證碼或者校驗機制,只要輸入金額就可以體現(xiàn),并且是秒到賬,如果是什么負數(shù),修改金額都測試了,不行的話,那你就可以實試一試多線程并發(fā)問題,體現(xiàn)的時候進行抓包,比如我現(xiàn)在錢包內(nèi)有0.1元,那么按照每提0,01元可以提10次的話,也就是發(fā)送10次進程,但是利用這個問題可以達到多打幾次成功的進程,體現(xiàn)時進行抓包,然后把數(shù)據(jù)包發(fā)送到BurpSuite工具的Intruder當中,進行批量發(fā)送12次,然后可以看到成功體現(xiàn)12次,也就是0.12元,從這里就可以看出這個問題的危害了,當然此時賬戶的金額肯定是為負的了,如果把這個提現(xiàn)金額變大,那么這多提現(xiàn)的金額可不是鬧著玩的。
當然,多線程也可以在其它功能處進行測試,比如我之前講到的試用商品問題,就可以通過多線程進行多幾次的使用,比如利用積分總換禮品,一個賬戶只能進行總換一次,利用這個問題,可以多幾次總換,一些轉(zhuǎn)賬功能,提現(xiàn)功能,購買功能等等很多。
6、Cookie脆弱性
1)打開環(huán)境
2)代碼審計,我們打開login.php;
明顯可以看出來,Cookie傳入了user,如果user為空,退出,就是登陸不成功,我們可以抓包,讓他不為空;
我們讓$user=admin,放包;
這個漏洞可以說非常雞肋,實戰(zhàn)沒有代碼,怎么知道cookie的脆弱性那?那我們就要分析,比如抓包看到了,cookie=admin,那我們可以改一改,讓cookie=test,是不是可以跳轉(zhuǎn)到test用戶了;
7、客戶端回顯
1)介紹
這種利用回顯抓取數(shù)據(jù)包,在修改驗證,我們嘗試的時候,有的網(wǎng)站會在你填寫手機號后,點擊發(fā)送驗證碼,會對你的手機號和IP進行驗證,看看是不是本地號碼,有的會對傳輸?shù)男畔⒂屑用埽?/p>
2)原理
在調(diào)用短信平臺發(fā)送信息時,沒有判斷驗證碼和手機號是否綁定,把驗證碼校驗功能直接放到客戶端進行(也就是返回數(shù)據(jù)包中),從而導(dǎo)致驗證碼在客戶端回顯;
3)危害
這個危害有一點明顯,登陸,注冊,綁定,重置任意用戶的密碼;
4)利用
客戶端回顯,就是當注冊或者綁定的時候,用戶向網(wǎng)站系統(tǒng)發(fā)送一條短信驗證碼的請求,cookie中會包含短信驗證碼并且回顯在數(shù)據(jù)包中,如cookie=xxxxxx es_id=534324,我們這時候通過抓包工具可截取真實的驗證碼,如cookie=xxxxxx es_id=567475,通過分析,真實得驗證碼為567475,我們這時候,將驗證碼修改為正確的驗證碼,提交上去,就會成功注冊或者綁定;
8、Response狀態(tài)值
1)原理
Response狀態(tài)值,就是在服務(wù)器發(fā)送某個密碼重置的憑據(jù)之后,出現(xiàn)特定的響應(yīng)值(ture,1,ok,success等等,例如響應(yīng)頭中的HTTP/1.1 200 ok)
2)利用過程
對Response狀態(tài)值修改后,如果存在校驗不嚴(存在邏輯漏洞),并且回顯值得校驗是在客戶端進行,就能使相關(guān)操作成功被執(zhí)行;
就像密碼重置中的驗證碼問題,如果回顯值得校驗是發(fā)送到客戶端進行,通過對校驗值得使用規(guī)則進行分析后,抓包將Response狀態(tài)值改為正確得,然后放包,從而達到重置密碼得效果;
3)案例演示
演示地址:[http://xxx.com/Admin/Login.aspx]
我們賬號密碼輸入admin/admin,進行抓包,我們將包首先放到Repeater中看看結(jié)構(gòu);
我們能不能猜測"d":"0,賬號密碼錯誤!",我們將0改為1,直接登陸那?
我們攔截響應(yīng)包,將0改為1;
成功進來了;
9、驗證碼
9.1、無效驗證
在驗證碼模塊,但驗證模塊與業(yè)務(wù)功能沒有關(guān)聯(lián)性,此為無效驗證,一般在新上線得系統(tǒng)中比較常見;
我們在獲取短信驗證碼后,隨意輸入驗證碼,直接輸入兩次密碼,可成功更改用戶得密碼,沒有對驗證碼進行驗證;
9.2、任意用戶注冊
我們首先利用自己得手機號接收驗證碼進行驗證,下一步跳轉(zhuǎn)一個設(shè)定密碼得頁面,接下來抓包,篡改手機號碼,使用任意手機號進行注冊,問題解讀:這里業(yè)務(wù)一致性存在安全隱患,身份驗證與密碼修改得過程是分開的,驗證無效;
9.3、客戶端驗證繞過
客戶端驗證是不安全的,和我上面的邏輯漏洞一樣,可能會導(dǎo)致任意賬號的注冊,登陸以及重置任意用戶等一系列的問題,有的時候會直接在前端顯示驗證碼的明文信息;
我們拿到前端的驗證碼,即可成功重置密碼;
9.4、返回密文驗證碼
我們用抓包工具,抓取到包之后,會返回一大串密文,這個時候,我們把密文拿去解密,即可獲得驗證碼;
9.5、攔截替換返回包
我們第一步使用正常的賬號修改密碼,獲取驗證碼通過時服務(wù)器的返回包,保存該信息,我們第二次,用另一個賬號進行登陸,這時候,我們不知道驗證碼,我們隨便輸入驗證碼,在抓到驗證碼錯誤的返回包,我們將剛才正常的返回包替換掉錯誤的返回包,這時候會提示密碼修改成功;
9.6、驗證碼爆破
短信驗證碼一般由4位后者6位數(shù)字組成(還有特殊情況,字母數(shù)字組合等等),若服務(wù)器未對驗證時間,次數(shù)進行限制,則存在爆破的可能;
輸入手機號獲取驗證碼,輸入任意驗證碼,抓包放到Intruder模塊,將短信驗證碼字段設(shè)置偽payload,然后取值范圍設(shè)定好,進行暴力破解,根據(jù)返回響應(yīng)包的長度判斷是否爆破成功;
9.7、驗證碼與手機未綁定
一般來說短信驗證碼僅能使用一次,驗證碼和手機號未綁定,驗證碼一段時間內(nèi)有效,那么就可能出現(xiàn)如下情況:
- A手機驗證碼,B可能拿來用
- A手機在一定時間間隔內(nèi)接收到兩個驗證碼,都可以用;
- 檢測接收驗證碼的手機號和綁定的手機號是否一致
案例:任意用戶密碼重置
- 使用自己的手機號收到驗證碼
- 自己的驗證碼和對方手機號填上,下一步就是設(shè)置新的密碼
9.8、代碼層邏輯缺陷
如果代碼層的邏輯是這個樣子:
- 驗證手機號是否已發(fā)送驗證碼
- 去除用戶輸入的空格和其他特殊字符
- 重新發(fā)送驗證碼
那么,可利用"\n"和空格進行繞過,持續(xù)遞增空格就可造成無線短信轟炸,我們在手機號后面加一位進行fuzz,可能會有不一樣的結(jié)果;
10、短信轟炸
1)短信轟炸時手機驗證碼中最常見的一種漏洞類型,在測試過程中,對短信驗證碼接口進行重發(fā)數(shù)據(jù)包,導(dǎo)致大量發(fā)送惡意短信;
2)大多數(shù)情況下,短信驗證碼都是間隔60秒,這種情況,我們就每隔60秒發(fā)一條短信,無線下發(fā),短信轟炸,在測試過程中,可通過編寫Python腳本來實現(xiàn)短信轟炸;
11、繞過token
11.1、前端回顯
我們啟動pikachu靶場;
抓包放在重發(fā)器,可以看到token直接回顯在響應(yīng)里面;
這里就非常不安全,我們可以借助回顯,對token進行爆破;
11.2、token爆破
我們將抓包的內(nèi)容發(fā)送到Intruder模塊;
在Options中找到Request Engine模塊,把線程設(shè)置為1,這里如果說線程設(shè)置過高,是沒有效果的;
在Options在grep位置添加找到token并添加token;
payload1的位置隨便輸入
payload2的位置訓(xùn)責(zé)遞歸搜索;
可以看到,每次請求的token值都不一樣;
12、Callback自定義返回調(diào)用
12.1、什么是Callback
一般來說,函數(shù)的形參是指由外往內(nèi)函數(shù)體傳遞變量的入口,但此處加了callback后則完全相反,它是指函數(shù)體在完成某種使命后調(diào)用外部函數(shù)的出口,也就是回頭調(diào)用外部函數(shù)的意思;
鏈接如下:https://xxx/login?callback=https%3A%2F%2F2haohr.com%2Fpersonnel
這里的callback后的數(shù)據(jù)代表微信登陸,然后將微信登陸的數(shù)據(jù)返回給callback,callback參數(shù)可以更改,可以和跨站漏洞結(jié)合,在網(wǎng)頁中源碼中搜索傳遞的參數(shù),如果存在,意味著URL傳遞的參數(shù)會在網(wǎng)頁的前端顯示,是不是意味著我們可能可以構(gòu)造XSS漏洞;
我們在挖漏洞的時候,著重關(guān)注關(guān)鍵的參數(shù):id,callback,filename,uid等等
我們可以在這個頁面搜索關(guān)鍵字來進行過濾;選出敏感的信息;