def test_mutant_creation_post_data(self): original_form = Form() original_form.add_input([("name", "username"), ("value", "")]) original_form.add_input([("name", "address"), ("value", "")]) original_form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=original_form) created_mutants = Mutant.create_mutants(freq, self.payloads, [], False, self.fuzzer_config) self.assertEqual(len(created_mutants), 4, created_mutants) expected_username_values = self.payloads + ["John8212"] * 2 expected_address_values = ["Bonsai Street 123"] * 2 + self.payloads expected_file_values = ["GIF89a"] * 4 created_dc_lst = [i.get_dc() for i in created_mutants] generated_username_values = [dc["username"][0] for dc in created_dc_lst] generated_address_values = [dc["address"][0] for dc in created_dc_lst] generated_file_values = [dc["file"][0] for dc in created_dc_lst] self.assertEqual(expected_username_values, generated_username_values) self.assertEqual(expected_address_values, generated_address_values) for index, gen_file_value in enumerate(generated_file_values): startswith = gen_file_value.startswith(expected_file_values[index]) self.assertTrue(startswith, gen_file_value) self.assertTrue(all(str_file.name[-4:].startswith(".gif") for str_file in generated_file_values))
def test_mutant_creation_post_data(self): original_form = Form() original_form.add_input([("name", "username"), ("value", "")]) original_form.add_input([("name", "address"), ("value", "")]) original_form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=original_form) created_mutants = Mutant.create_mutants(freq, self.payloads, [], False, self.fuzzer_config) self.assertEqual(len(created_mutants), 4, created_mutants) expected_username_values = self.payloads + ['John8212'] * 2 expected_address_values = ['Bonsai Street 123'] * 2 + self.payloads expected_file_values = ['GIF89a'] * 4 created_dc_lst = [i.get_dc() for i in created_mutants] generated_username_values = [ dc['username'][0] for dc in created_dc_lst ] generated_address_values = [dc['address'][0] for dc in created_dc_lst] generated_file_values = [dc['file'][0] for dc in created_dc_lst] self.assertEqual(expected_username_values, generated_username_values) self.assertEqual(expected_address_values, generated_address_values) for index, gen_file_value in enumerate(generated_file_values): startswith = gen_file_value.startswith(expected_file_values[index]) self.assertTrue(startswith, gen_file_value) self.assertTrue( all(str_file.name[-4:].startswith('.gif') for str_file in generated_file_values))
def test_config_true(self): fuzzer_config = {'fuzz_form_files': True, 'fuzzed_files_extension': 'gif'} form = Form() form.add_input([("name", "username"), ("value", "")]) form.add_input([("name", "address"), ("value", "")]) form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=form) generated_mutants = FileContentMutant.create_mutants( freq, self.payloads, [], False, fuzzer_config) self.assertNotEqual(len(generated_mutants), 0, generated_mutants)
def test_config_true(self): fuzzer_config = { 'fuzz_form_files': True, 'fuzzed_files_extension': 'gif' } form = Form() form.add_input([("name", "username"), ("value", "")]) form.add_input([("name", "address"), ("value", "")]) form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=form) generated_mutants = FileContentMutant.create_mutants( freq, self.payloads, [], False, fuzzer_config) self.assertNotEqual(len(generated_mutants), 0, generated_mutants)
def test_mutant_smart_fill_with_file(self): original_form = Form() original_form.add_input([("name", "username"), ("value", "")]) original_form.add_input([("name", "address"), ("value", "")]) original_form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=original_form) filled_form = mutant_smart_fill(freq, original_form, "username", 0, self.fuzzer_config) self.assertEqual(id(original_form), id(filled_form)) self.assertEqual(filled_form["username"], [""]) self.assertEqual(filled_form["address"], ["Bonsai Street 123"]) str_file = filled_form["file"][0] self.assertEqual(str_file.name[-4:], ".gif") self.assertIn("GIF", str_file)
def test_mutant_creation_file(self): form = Form() form.add_input([("name", "username"), ("value", "default")]) form.add_file_input([("name", "file_upload")]) freq = HTTPPostDataRequest(URL('http://www.w3af.com/upload'), dc=form, method='POST') payloads = [file(__file__),] created_mutants = PostDataMutant.create_mutants( freq, payloads, ['file_upload', ], False, self.fuzzer_config) self.assertEqual(len(created_mutants), 1, created_mutants) mutant = created_mutants[0] self.assertIsInstance(mutant.get_dc()['file_upload'][0], file) self.assertEqual(mutant.get_dc()['username'][0], 'default')
def test_mutant_smart_fill_with_file(self): original_form = Form() original_form.add_input([("name", "username"), ("value", "")]) original_form.add_input([("name", "address"), ("value", "")]) original_form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=original_form) filled_form = mutant_smart_fill(freq, original_form, 'username', 0, self.fuzzer_config) self.assertEqual(id(original_form), id(filled_form)) self.assertEqual(filled_form['username'], [ '', ]) self.assertEqual(filled_form['address'], [ 'Bonsai Street 123', ]) str_file = filled_form['file'][0] self.assertEqual(str_file.name[-4:], '.gif') self.assertIn('GIF', str_file)
def test_valid_results(self): form = Form() form.add_input([("name", "username"), ("value", "")]) form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=form) generated_mutants = FileContentMutant.create_mutants( freq, self.payloads, [], False, self.fuzzer_config) self.assertEqual(len(generated_mutants), 2, generated_mutants) expected_data = [Form([('username', ['John8212']), ('file', ['abc'])]), Form([('username', ['John8212']), ('file', ['def'])]), ] generated_data = [m.get_data() for m in generated_mutants] self.assertEqual(expected_data, generated_data) str_file = generated_data[0]['file'][0] self.assertEqual(str_file.name[-4:], '.gif') self.assertIn('abc', str_file)
def test_mutant_creation_file(self): form = Form() form.add_input([("name", "username"), ("value", "default")]) form.add_file_input([("name", "file_upload")]) freq = HTTPPostDataRequest(URL('http://www.w3af.com/upload'), dc=form, method='POST') payloads = [ file(__file__), ] created_mutants = PostDataMutant.create_mutants( freq, payloads, [ 'file_upload', ], False, self.fuzzer_config) self.assertEqual(len(created_mutants), 1, created_mutants) mutant = created_mutants[0] self.assertIsInstance(mutant.get_dc()['file_upload'][0], file) self.assertEqual(mutant.get_dc()['username'][0], 'default')
def test_valid_results(self): form = Form() form.add_input([("name", "username"), ("value", "")]) form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=form) generated_mutants = FileContentMutant.create_mutants( freq, self.payloads, [], False, self.fuzzer_config) self.assertEqual(len(generated_mutants), 2, generated_mutants) expected_data = [ Form([('username', ['John8212']), ('file', ['abc'])]), Form([('username', ['John8212']), ('file', ['def'])]), ] generated_data = [m.get_data() for m in generated_mutants] self.assertEqual(expected_data, generated_data) str_file = generated_data[0]['file'][0] self.assertEqual(str_file.name[-4:], '.gif') self.assertIn('abc', str_file)
def test_basics(self): form = Form() form.add_input([("name", "username"), ("value", "")]) form.add_input([("name", "address"), ("value", "")]) form.add_file_input([("name", "file"), ("type", "file")]) freq = HTTPPostDataRequest(self.url, dc=form) m = FileContentMutant(freq) m.set_var('file', 0) m.set_mod_value('abc') self.assertEqual(m.get_url().url_string, 'http://moth/') expected_mod_value = 'The data that was sent is: "username=&file=abc&address=".' generated_mod_value = m.print_mod_value() self.assertEqual(generated_mod_value, expected_mod_value) expected_found_at = u'"http://moth/", using HTTP method POST. The'\ ' sent post-data was: "username=&file=abc&address="'\ ' which modifies the uploaded file content.' generated_found_at = m.found_at() self.assertEqual(generated_found_at, expected_found_at)