use feroxfuzz::client::{BlockingClient, HttpClient};
use feroxfuzz::corpora::RangeCorpus;
use feroxfuzz::fuzzers::{BlockingFuzzer, BlockingFuzzing};
use feroxfuzz::mutators::ReplaceKeyword;
use feroxfuzz::observers::ResponseObserver;
use feroxfuzz::prelude::*;
use feroxfuzz::processors::RequestProcessor;
use feroxfuzz::responses::BlockingResponse;
use feroxfuzz::schedulers::OrderedScheduler;
use feroxfuzz::state::SharedState;
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let range = RangeCorpus::new().name("range").stop(5).build()?;
let mut state = SharedState::with_corpus(range);
let req_client = reqwest::blocking::Client::builder()
.timeout(Duration::from_secs(1))
.build()?;
let client = BlockingClient::with_client(req_client);
let mutator1 = ReplaceKeyword::new(&"first-value", "range");
let mutator2 = ReplaceKeyword::new(&"second-value", "range");
let mutator3 = ReplaceKeyword::new(&"third-value", "range");
let mutator4 = ReplaceKeyword::new(&"fourth-value", "range");
let mutator5 = ReplaceKeyword::new(&"fifth-value", "range");
let mut request = Request::from_url("http://localhost:8000/", None)?;
request.add_static_param(b"injectable=first-value", b"=")?;
request.add_static_param(b"second=second-value", b"=")?;
request.add_static_param(b"third=third-value", b"=")?;
request.add_static_param(b"fourth=fourth-value", b"=")?;
request.add_static_param(b"fifth=fifth-value", b"=")?;
let num_positions = 5;
let scheduler = OrderedScheduler::new(state.clone())?;
let request_printer = RequestProcessor::new(move |request, _action, _state| {
print!("{}?", request.original_url());
for (i, (key, value)) in request.params().unwrap().iter().enumerate() {
if i == num_positions - 1 {
print!("{key}={value}");
} else {
print!("{key}={value}&");
}
}
println!();
});
let response_observer: ResponseObserver<BlockingResponse> = ResponseObserver::new();
let observers = build_observers!(response_observer);
let mutators = build_mutators!(mutator1, mutator2, mutator3, mutator4, mutator5);
let processors = build_processors!(request_printer);
let mut fuzzer = BlockingFuzzer::new()
.client(client)
.request(request)
.scheduler(scheduler)
.mutators(mutators)
.observers(observers)
.processors(processors)
.build();
for position_idx in 0..num_positions {
let params = fuzzer.request_mut().params_mut().unwrap();
for (param_idx, (_param_key, param_value)) in params.iter_mut().enumerate() {
if param_value.is_fuzzable() {
param_value.toggle_type();
}
if position_idx == param_idx {
param_value.toggle_type();
break;
}
}
fuzzer.fuzz_once(&mut state)?;
println!();
}
Ok(())
}