哲學
在《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
要是有很多接口需要測試的話健民,顯得很不方便柳恐。
我邊上的一個同學看了之后憾朴,就曾這樣說道:
我就想它自己給我測贱傀,都不用寫schema。
在 Software Tools 上面曾經(jīng)有過這么一句話伊脓,xuyou也曾經(jīng)在這里引用過:很多事情, 只有在人能很快的完成的時候,才有了做的可能魁衙。這句話可能比較拗口报腔,反過來說可能更加好懂:如果用某種方法做一件事情太耗時間了, 那么人就不可能用這個方法做事情剖淀。只有一個方法能夠讓人足夠快的做好事情的時候纯蛾,這個方法才會變得實用,同時這個事情才有做的可能性纵隔。
我在之前的一篇文章中提到過 gun parallel這個工具翻诉。
很多接口在并發(fā)操作下會出現(xiàn)一些bug炮姨,比如有一些判斷數(shù)據(jù)庫里面沒有加鎖,是在代碼層面判斷的碰煌,結(jié)果并發(fā)請求下去舒岸,每個請求在到達服務器的時候是判斷通過,一起寫了之后就超出限制了芦圾。但是你要真正測并發(fā)的話蛾派,又要寫腳本,或者利用python的mulitiprocessing封裝一下个少。但我手邊有了parallel洪乍,又在bashrc里面就加了以下兩個alias
alias p='parallel'
這樣制造并發(fā)太方便了,只需要管道后面加個p , 我就時時刻刻可以制造并發(fā)來觀察響應夜焦。
舉個例子
seq 50 | p -n0 -q curl 'example.com'
因為很方便壳澳,所以經(jīng)常能夠在命令行下制造并發(fā),發(fā)現(xiàn)了不少問題茫经!
實現(xiàn)
如此一來巷波,那么就改造一下接口模糊測試工具哈。
最簡單的方法就是傳入一個curl科平,然后自動給你進行模糊注入褥紫。
curl請求是最容易得到的,比如chrome瞪慧,postman里面可以自動導出髓考,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']
需要關注 500 錯誤的 Payload即可查蓉。
目前還是處于初期poc階段,只支持post json類型的請求注入榜贴。uncurl的解析也不完善豌研。希望日后有時間慢慢完善。
試用請戳: https://github.com/smasterfree/api-fuzz
歡迎star;5场鹃共!