
哲學(xué)
在《api 接口 fuzz 測試初探》,簡單介紹了一個接口模糊測試工具。好用是好用,就是需要寫出接口的schema:
POST /v2.0/networks.json HTTP/1.1
Host: pubbeta1-iaas.service.163.org
X-Auth-Token: 6645b224a8314d0c89e09a011cbddf53
Content-Type: application/json
Accept: application/json
***{"network": {"cidr": "20.100.0.0/16", "name": "hzx-vpc-test1", "admin_state_up": true}}***
然后按照如下的方式調(diào)用:
python pjfapi.py -H pubbeta1-iaas.service.163.org -P 9797 -T request.txt
要是有很多接口需要測試的話,顯得很不方便。
我邊上的一個同學(xué)看了之后,就曾這樣說道:
我就想它自己給我測,都不用寫schema。
在 Software Tools 上面曾經(jīng)有過這么一句話,xuyou也曾經(jīng)在這里引用過:很多事情, 只有在人能很快的完成的時候,才有了做的可能。這句話可能比較拗口,反過來說可能更加好懂:如果用某種方法做一件事情太耗時間了, 那么人就不可能用這個方法做事情。只有一個方法能夠讓人足夠快的做好事情的時候,這個方法才會變得實用,同時這個事情才有做的可能性。
我在之前的一篇文章中提到過 gun parallel這個工具。
很多接口在并發(fā)操作下會出現(xiàn)一些bug,比如有一些判斷數(shù)據(jù)庫里面沒有加鎖,是在代碼層面判斷的,結(jié)果并發(fā)請求下去,每個請求在到達(dá)服務(wù)器的時候是判斷通過,一起寫了之后就超出限制了。但是你要真正測并發(fā)的話,又要寫腳本,或者利用python的mulitiprocessing封裝一下。但我手邊有了parallel,又在bashrc里面就加了以下兩個alias
alias p='parallel'這樣制造并發(fā)太方便了,只需要管道后面加個p , 我就時時刻刻可以制造并發(fā)來觀察響應(yīng)。
舉個例子
seq 50 | p -n0 -q curl 'example.com'
因為很方便,所以經(jīng)常能夠在命令行下制造并發(fā),發(fā)現(xiàn)了不少問題!
實現(xiàn)
如此一來,那么就改造一下接口模糊測試工具哈。
最簡單的方法就是傳入一個curl,然后自動給你進行模糊注入。
curl請求是最容易得到的,比如chrome,postman里面可以自動導(dǎo)出,openstack client加上 --debug參數(shù)可以直接得到等等。
于是我稍微改造了一下,自動根據(jù)curl請求構(gòu)建出pjfapi 的schema。
使用方法,把curl請求粘貼到request.txt中。
然后執(zhí)行
python fuzz_curl.py request.txt
執(zhí)行效果如下:
(my_new_env) hzhuangzhexiao@pubbeta1-nova10:~/api-fuzz$ python fuzz_curl.py request.txt
[INFO]
_ ______
/\ (_) | ____|
/ \ _ __ _ | |__ _ _ ________
/ /\ \ | '_ \| | | __| | | |_ /_ /
/ ____ \| |_) | | | | | |_| |/ / / /
/_/ \_\ .__/|_| |_| \__,_/___/___|
| |
|_|
[INFO] Starting api Fuzz...
[INFO] Start fuzzing in a few seconds...
[INFO] Performing 5 requests to 10.182.2.253
[INFO] Average statistics:
HTTP Code: ['200']
Time: 0.0014
Length: 34
Hash: ['d8e71bf22b715ade49030e45ee661c1d']
[400, 0.002610921859741211, 66, '110ef21d725c0242cb1c5b913f15137b']
[400, 0.0028450489044189453, 66, '110ef21d725c0242cb1c5b913f15137b']
[400, 0.0028600692749023438, 141, '3391da2f8a7bc52d2d38fe1810a3370d']
[200, 0.002708911895751953, 68, 'd8e71bf22b715ade49030e45ee661c1d']
[500, 0.002846956253051758, 128, 'cb78997cdbb65ad20fe58356baaeadb7']
2018-03-26 16:53:24,466 [90991] my_logger ERROR: Got something interesting!
Payload: {"extra_specs": {"unique_on_host": "dsadsa", "host?equired": "no"}}
HTTP Code: 500
Execution time: 0.00284695625305
Response Length: 128
Response Hash: cb78997cdbb65ad20fe58356baaeadb7
whole result : [500, 0.002846956253051758, 128, 'cb78997cdbb65ad20fe58356baaeadb7']
需要關(guān)注 500 錯誤的 Payload即可。
目前還是處于初期poc階段,只支持post json類型的請求注入。uncurl的解析也不完善。希望日后有時間慢慢完善。
試用請戳: https://github.com/smasterfree/api-fuzz
歡迎star?。?/p>