fuzzer เว็บที่รวดเร็วเขียนใน Go
ดาวน์โหลดไบนารีที่สร้างไว้ล่วงหน้าจากหน้าเผยแพร่ แกะและรัน!
หรือ
หากคุณใช้ macOS ที่มี homebrew สามารถติดตั้ง ffuf ด้วย: brew install ffuf
หรือ
หากคุณติดตั้งคอมไพเลอร์ go ล่าสุด: go install github.com/ffuf/ffuf/v2@latest
(คำสั่งเดียวกันนี้ใช้สำหรับการอัปเดต)
หรือ
git clone https://github.com/ffuf/ffuf ; cd ffuf ; go get ; go build
Ffuf ขึ้นอยู่กับ Go 1.16 หรือสูงกว่า
ตัวอย่างการใช้งานด้านล่างแสดงเฉพาะงานที่ง่ายที่สุดที่คุณสามารถทำได้โดยใช้ ffuf
เอกสารที่ซับซ้อนมากขึ้นซึ่งผ่านคุณสมบัติมากมายพร้อมตัวอย่างมากมายมีอยู่ใน ffuf wiki ที่https://github.com/ffuf/ffuf/wiki
หากต้องการเอกสารประกอบที่ครอบคลุมมากขึ้น พร้อมตัวอย่างการใช้งานจริงและเคล็ดลับ โปรดอ่านคำแนะนำที่ยอดเยี่ยม: "ทุกสิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับ FFUF" โดย Michael Skelton (@codingo)
คุณยังสามารถฝึกสแกน ffuf ของคุณกับโฮสต์สดด้วยบทเรียนและกรณีการใช้งานที่แตกต่างกันไม่ว่าจะในเครื่องโดยใช้คอนเทนเนอร์นักเทียบท่า https://github.com/adamtlangley/ffufme หรือเทียบกับเวอร์ชันโฮสต์สดที่ http://ffuf.me สร้าง โดยอดัมแลงลีย์ @adamtlangley
โดยใช้คีย์เวิร์ด FUZZ ที่ส่วนท้ายของ URL ( -u
):
ffuf -w /path/to/wordlist -u https://target/FUZZ
สมมติว่าขนาดการตอบสนองของโฮสต์เสมือนเริ่มต้นคือ 4242 ไบต์ เราสามารถกรองการตอบสนองทั้งหมดของขนาดนั้น ( -fs 4242
) ออกในขณะที่ทำการฟัซซีโฮสต์ - ส่วนหัว:
ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ" -fs 4242
การคลุมเครือชื่อพารามิเตอร์ GET คล้ายกับการค้นหาไดเรกทอรีมาก และทำงานโดยการกำหนดคีย์เวิร์ด FUZZ
ให้เป็นส่วนหนึ่งของ URL นอกจากนี้ยังถือว่าขนาดการตอบสนอง 4242 ไบต์สำหรับชื่อพารามิเตอร์ GET ที่ไม่ถูกต้อง
ffuf -w /path/to/paramnames.txt -u https://target/script.php?FUZZ=test_value -fs 4242
หากทราบชื่อพารามิเตอร์ ค่าต่างๆ ก็สามารถคลุมเครือได้ในลักษณะเดียวกัน ตัวอย่างนี้ถือว่าค่าพารามิเตอร์ที่ไม่ถูกต้องส่งคืนรหัสตอบกลับ HTTP 401
ffuf -w /path/to/values.txt -u https://target/script.php?valid_name=FUZZ -fc 401
นี่เป็นการดำเนินการที่ตรงไปตรงมามาก อีกครั้งโดยใช้คำสำคัญ FUZZ
ตัวอย่างนี้คลุมเครือเพียงส่วนหนึ่งของคำขอ POST เรากำลังกรองคำตอบ 401 ออกไปอีกครั้ง
ffuf -w /path/to/postdata.txt -X POST -d "username=admin&password=FUZZ" -u https://target/login.php -fc 401
หากคุณไม่ต้องการให้ ffuf ทำงานอย่างไม่มีกำหนด คุณสามารถใช้ -maxtime
ได้ การดำเนินการนี้จะหยุดกระบวนการ ทั้งหมด หลังจากเวลาที่กำหนด (เป็นวินาที)
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime 60
เมื่อทำงานกับการเรียกซ้ำ คุณสามารถควบคุมเวลาสูงสุด ต่องานได้ โดยใช้ -maxtime-job
การดำเนินการนี้จะหยุดงานปัจจุบันหลังจากเวลาที่กำหนด (เป็นวินาที) และดำเนินการต่อในงานถัดไป งานใหม่จะถูกสร้างขึ้นเมื่อฟังก์ชันการเรียกซ้ำตรวจพบไดเร็กทอรีย่อย
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime-job 60 -recursion -recursion-depth 2
นอกจากนี้ยังสามารถรวมทั้งสองแฟล็กที่จำกัดเวลาดำเนินการสูงสุดต่องานและเวลาดำเนินการโดยรวมได้ด้วย หากคุณไม่ได้ใช้การเรียกซ้ำ แฟล็กทั้งสองจะทำงานเท่ากัน
สำหรับตัวอย่างนี้ เราจะฟัซข้อมูล JSON ที่ส่งผ่าน POST ราดัมซาถูกใช้เป็นตัวกลายพันธุ์
เมื่อใช้ --input-cmd
ffuf จะแสดงรายการที่ตรงกันเป็นตำแหน่ง ค่าตำแหน่งเดียวกันนี้จะมีให้สำหรับผู้เรียกเป็นตัวแปรสภาพแวดล้อม $FFUF_NUM
เราจะใช้ค่าตำแหน่งนี้เป็นเมล็ดพันธุ์สำหรับการกลายพันธุ์ ไฟล์ example1.txt และ example2.txt มีเพย์โหลด JSON ที่ถูกต้อง เรากำลังจับคู่คำตอบทั้งหมด แต่กรองรหัสตอบกลับ 400 - Bad request
:
ffuf --input-cmd 'radamsa --seed $FFUF_NUM example1.txt example2.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/FUZZ -mc all -fc 400
แน่นอนว่าการเรียกโปรแกรมเปลี่ยนรูปแบบสำหรับแต่ละเพย์โหลดไม่ได้มีประสิทธิภาพมากนัก ดังนั้นเราจึงสามารถสร้างเพย์โหลดล่วงหน้าได้ โดยที่ยังคงใช้ Radamsa เป็นตัวอย่าง:
# Generate 1000 example payloads
radamsa -n 1000 -o %n.txt example1.txt example2.txt
# This results into files 1.txt ... 1000.txt
# Now we can just read the payload data in a loop from file for ffuf
ffuf --input-cmd 'cat $FFUF_NUM.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/ -mc all -fc 400
เมื่อรัน ffuf มันจะตรวจสอบก่อนว่ามีไฟล์การกำหนดค่าเริ่มต้นอยู่หรือไม่ พาธดีฟอลต์สำหรับไฟล์ ffufrc
คือ $XDG_CONFIG_HOME/ffuf/ffufrc
คุณสามารถกำหนดค่าได้หนึ่งตัวเลือกหรือหลายตัวเลือกในไฟล์นี้ และตัวเลือกเหล่านั้นจะถูกนำไปใช้กับงาน ffuf ที่ตามมาทุกงาน ตัวอย่างของไฟล์ ffufrc สามารถพบได้ที่นี่
คำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับตำแหน่งไฟล์การกำหนดค่าสามารถพบได้ในวิกิ: https://github.com/ffuf/ffuf/wiki/Configuration
ตัวเลือกการกำหนดค่าที่ให้ไว้ในบรรทัดคำสั่งจะแทนที่ตัวเลือกที่โหลดจากไฟล์ ffufrc
เริ่มต้น หมายเหตุ: สิ่งนี้ใช้ไม่ได้กับแฟล็ก CLI ที่สามารถระบุได้มากกว่าหนึ่งครั้ง หนึ่งในตัวอย่างดังกล่าวคือแฟล็ก -H
(ส่วนหัว) ในกรณีนี้ ค่า -H
ที่ให้ไว้ในบรรทัดคำสั่งจะถูก ผนวกเข้า กับค่าจากไฟล์กำหนดค่าแทน
นอกจากนี้ ในกรณีที่คุณต้องการใช้ไฟล์การกำหนดค่าจำนวนมากสำหรับกรณีการใช้งานที่แตกต่างกัน คุณสามารถทำได้โดยการกำหนดเส้นทางของไฟล์การกำหนดค่าโดยใช้แฟล็กบรรทัดคำสั่ง -config
ที่จะรับเส้นทางของไฟล์ไปยังไฟล์การกำหนดค่าเป็นพารามิเตอร์
หากต้องการกำหนดกรณีทดสอบสำหรับ ffuf ให้ใช้คีย์เวิร์ด FUZZ
ที่ใดก็ได้ใน URL ( -u
) ส่วนหัว ( -H
) หรือข้อมูล POST ( -d
)
Fuzz Faster U Fool - v2.1.0
HTTP OPTIONS:
-H Header `"Name: Value"`, separated by colon. Multiple -H flags are accepted.
-X HTTP method to use
-b Cookie data `"NAME1=VALUE1; NAME2=VALUE2"` for copy as curl functionality.
-cc Client cert for authentication. Client key needs to be defined as well for this to work
-ck Client key for authentication. Client certificate needs to be defined as well for this to work
-d POST data
-http2 Use HTTP2 protocol (default: false)
-ignore-body Do not fetch the response content. (default: false)
-r Follow redirects (default: false)
-raw Do not encode URI (default: false)
-recursion Scan recursively. Only FUZZ keyword is supported, and URL (-u) has to end in it. (default: false)
-recursion-depth Maximum recursion depth. (default: 0)
-recursion-strategy Recursion strategy: "default" for a redirect based, and "greedy" to recurse on all matches (default: default)
-replay-proxy Replay matched requests using this proxy.
-sni Target TLS SNI, does not support FUZZ keyword
-timeout HTTP request timeout in seconds. (default: 10)
-u Target URL
-x Proxy URL (SOCKS5 or HTTP). For example: http://127.0.0.1:8080 or socks5://127.0.0.1:8080
GENERAL OPTIONS:
-V Show version information. (default: false)
-ac Automatically calibrate filtering options (default: false)
-acc Custom auto-calibration string. Can be used multiple times. Implies -ac
-ach Per host autocalibration (default: false)
-ack Autocalibration keyword (default: FUZZ)
-acs Custom auto-calibration strategies. Can be used multiple times. Implies -ac
-c Colorize output. (default: false)
-config Load configuration from a file
-json JSON output, printing newline-delimited JSON records (default: false)
-maxtime Maximum running time in seconds for entire process. (default: 0)
-maxtime-job Maximum running time in seconds per job. (default: 0)
-noninteractive Disable the interactive console functionality (default: false)
-p Seconds of `delay` between requests, or a range of random delay. For example "0.1" or "0.1-2.0"
-rate Rate of requests per second (default: 0)
-s Do not print additional information (silent mode) (default: false)
-sa Stop on all error cases. Implies -sf and -se. (default: false)
-scraperfile Custom scraper file path
-scrapers Active scraper groups (default: all)
-se Stop on spurious errors (default: false)
-search Search for a FFUFHASH payload from ffuf history
-sf Stop when > 95% of responses return 403 Forbidden (default: false)
-t Number of concurrent threads. (default: 40)
-v Verbose output, printing full URL and redirect location (if any) with the results. (default: false)
MATCHER OPTIONS:
-mc Match HTTP status codes, or "all" for everything. (default: 200-299,301,302,307,401,403,405,500)
-ml Match amount of lines in response
-mmode Matcher set operator. Either of: and, or (default: or)
-mr Match regexp
-ms Match HTTP response size
-mt Match how many milliseconds to the first response byte, either greater or less than. EG: >100 or <100
-mw Match amount of words in response
FILTER OPTIONS:
-fc Filter HTTP status codes from response. Comma separated list of codes and ranges
-fl Filter by amount of lines in response. Comma separated list of line counts and ranges
-fmode Filter set operator. Either of: and, or (default: or)
-fr Filter regexp
-fs Filter HTTP response size. Comma separated list of sizes and ranges
-ft Filter by number of milliseconds to the first response byte, either greater or less than. EG: >100 or <100
-fw Filter by amount of words in response. Comma separated list of word counts and ranges
INPUT OPTIONS:
-D DirSearch wordlist compatibility mode. Used in conjunction with -e flag. (default: false)
-e Comma separated list of extensions. Extends FUZZ keyword.
-enc Encoders for keywords, eg. 'FUZZ:urlencode b64encode'
-ic Ignore wordlist comments (default: false)
-input-cmd Command producing the input. --input-num is required when using this input method. Overrides -w.
-input-num Number of inputs to test. Used in conjunction with --input-cmd. (default: 100)
-input-shell Shell to be used for running command
-mode Multi-wordlist operation mode. Available modes: clusterbomb, pitchfork, sniper (default: clusterbomb)
-request File containing the raw http request
-request-proto Protocol to use along with raw request (default: https)
-w Wordlist file path and (optional) keyword separated by colon. eg. '/path/to/wordlist:KEYWORD'
OUTPUT OPTIONS:
-debug-log Write all of the internal logging to the specified file.
-o Write output to file
-od Directory path to store matched results to.
-of Output file format. Available formats: json, ejson, html, md, csv, ecsv (or, 'all' for all formats) (default: json)
-or Don't create the output file if we don't have results (default: false)
EXAMPLE USAGE:
Fuzz file paths from wordlist.txt, match all responses but filter out those with content-size 42.
Colored, verbose output.
ffuf -w wordlist.txt -u https://example.org/FUZZ -mc all -fs 42 -c -v
Fuzz Host-header, match HTTP 200 responses.
ffuf -w hosts.txt -u https://example.org/ -H "Host: FUZZ" -mc 200
Fuzz POST JSON data. Match all responses not containing text "error".
ffuf -w entries.txt -u https://example.org/ -X POST -H "Content-Type: application/json"
-d '{"name": "FUZZ", "anotherkey": "anothervalue"}' -fr "error"
Fuzz multiple locations. Match only responses reflecting the value of "VAL" keyword. Colored.
ffuf -w params.txt:PARAM -w values.txt:VAL -u https://example.org/?PARAM=VAL -mr "VAL" -c
More information and examples: https://github.com/ffuf/ffuf
โดยการกด ENTER
ระหว่างการดำเนินการ ffuf กระบวนการจะหยุดชั่วคราวและผู้ใช้จะเข้าสู่โหมดโต้ตอบแบบเชลล์:
entering interactive mode
type "help" for a list of commands, or ENTER to resume.
> help
available commands:
afc [value] - append to status code filter
fc [value] - (re)configure status code filter
afl [value] - append to line count filter
fl [value] - (re)configure line count filter
afw [value] - append to word count filter
fw [value] - (re)configure word count filter
afs [value] - append to size filter
fs [value] - (re)configure size filter
aft [value] - append to time filter
ft [value] - (re)configure time filter
rate [value] - adjust rate of requests per second (active: 0)
queueshow - show job queue
queuedel [number] - delete a job in the queue
queueskip - advance to the next queued job
restart - restart and resume the current ffuf job
resume - resume current ffuf job (or: ENTER)
show - show results for the current job
savejson [filename] - save current matches to a file
help - you are looking at it
>
ในโหมดนี้ คุณสามารถกำหนดค่าตัวกรองใหม่ จัดการคิว และบันทึกสถานะปัจจุบันลงในดิสก์ได้
เมื่อ () กำหนดค่าตัวกรองใหม่ ตัวกรองเหล่านั้นจะถูกนำไปใช้หลังมรณกรรมและผลบวกลวงที่ตรงกันทั้งหมดจากหน่วยความจำที่จะถูกกรองออกโดยตัวกรองที่เพิ่มใหม่จะถูกลบออก
สถานะใหม่ของการจับคู่สามารถพิมพ์ออกมาได้ด้วย command show
ที่จะพิมพ์การจับคู่ทั้งหมดเหมือนกับที่ ffuf
พบ
เนื่องจากการจับคู่แบบ "เชิงลบ" จะไม่ถูกเก็บไว้ในหน่วยความจำ การผ่อนคลายตัวกรองจึงไม่สามารถนำการแข่งขันที่แพ้กลับมาได้ สำหรับสถานการณ์ประเภทนี้ ผู้ใช้สามารถใช้คำสั่ง restart
ซึ่งจะรีเซ็ตสถานะและเริ่มต้นงานปัจจุบันตั้งแต่ต้น
ffuf ได้รับการเผยแพร่ภายใต้ใบอนุญาต MIT ดูใบอนุญาต