Extracting & Submitting Forms Automatically

Target website:http://10.0.0.45/dvwa/vulnerabilities/xss_r/

Class Scanner.

#!/usr/bin/env python

import requests
import re
from bs4 import BeautifulSoup
from urllib.parse import urljoin class Scanner:
def __init__(self, url, ignore_links):
self.session = requests.Session()
self.target_url = url
self.target_links = []
self.links_to_ignore = ignore_links def extract_links_from(self, url):
response = self.session.get(url)
return re.findall('(?:href=")(.*?)"', response.content.decode(errors='ignore')) def crawl(self, url=None):
if url == None:
url = self.target_url
href_links = self.extract_links_from(url)
for link in href_links:
link = urljoin(url, link) if "#" in link:
link = link.split("#")[0] if self.target_url in link and link not in self.target_links and link not in self.links_to_ignore:
self.target_links.append(link)
print(link)
self.crawl(link) def extract_forms(self, url):
response = self.session.get(url)
parsed_html = BeautifulSoup(response.content.decode(), features="lxml")
return parsed_html.findAll("form") def submit_form(self, form, value, url):
action = form.get("action")
post_url = urljoin(url, action)
method = form.get("method") inputs_list = form.findAll("input")
post_data = {}
for input in inputs_list:
input_name = input.get("name")
input_type = input.get("type")
input_value = input.get("value")
if input_type == "text":
input_value = value post_data[input_name] = input_value
if method == "post":
return requests.post(post_url, data=post_data)
return self.session.get(post_url, params=post_data)

Vulnerability scanner.

#!/usr/bin/env python

import scanner

target_url = "http://10.0.0.45/dvwa/"
links_to_ignore = "http://10.0.0.45/dvwa/logout.php" data_dict = {"username": "admin", "password": "password", "Login": "submit"} vuln_scanner = scanner.Scanner(target_url, links_to_ignore)
vuln_scanner.session.post("http://10.0.0.45/dvwa/login.php", data=data_dict) # vuln_scanner.crawl()
forms = vuln_scanner.extract_forms("http://10.0.0.45/dvwa/vulnerabilities/xss_r/")
print(forms)
response = vuln_scanner.submit_form(forms[0], "testtest", "http://10.0.0.45/dvwa/vulnerabilities/xss_r/")
print(response.content.decode())

The program runs fine.

Polish the Class Scanner to a generic scanner.

#!/usr/bin/env python

import requests
import re
from bs4 import BeautifulSoup
from urllib.parse import urljoin class Scanner:
def __init__(self, url, ignore_links):
self.session = requests.Session()
self.target_url = url
self.target_links = []
self.links_to_ignore = ignore_links def extract_links_from(self, url):
response = self.session.get(url)
return re.findall('(?:href=")(.*?)"', response.content.decode(errors='ignore')) def crawl(self, url=None):
if url == None:
url = self.target_url
href_links = self.extract_links_from(url)
for link in href_links:
link = urljoin(url, link) if "#" in link:
link = link.split("#")[0] if self.target_url in link and link not in self.target_links and link not in self.links_to_ignore:
self.target_links.append(link)
print(link)
self.crawl(link) def extract_forms(self, url):
response = self.session.get(url)
parsed_html = BeautifulSoup(response.content.decode(), features="lxml")
return parsed_html.findAll("form") def submit_form(self, form, value, url):
action = form.get("action")
post_url = urljoin(url, action)
method = form.get("method") inputs_list = form.findAll("input")
post_data = {}
for input in inputs_list:
input_name = input.get("name")
input_type = input.get("type")
input_value = input.get("value")
if input_type == "text":
input_value = value post_data[input_name] = input_value
if method == "post":
return requests.post(post_url, data=post_data)
return self.session.get(post_url, params=post_data) def run_scanner(self):
for link in self.target_links:
forms = self.extract_forms(link)
for form in forms:
print("[+] Testing form in " + link) if "=" in link:
print("[+] Testing " + link)

最新文章

  1. android基础(二)Broadcast Receiver知识
  2. nginx 重启命令
  3. Centos 6.5编译安装Nginx+php+Mysql
  4. [Everyday Mathematics]20150103
  5. python re.sub
  6. Altium Designer同一个工程里不同原理图导入到不同的PCB
  7. mysql数据类型整理
  8. PC端网页的基本构成
  9. 使用proxool连接池配置教程
  10. 打印ASCII码
  11. iOS下JS与OC互相调用(一)--UIWebView 拦截URL
  12. 软工实践练习一 关于GIT的使用
  13. spring aop 学习1
  14. 545. Boundary of Binary Tree二叉树的边界
  15. python3 open()函数调用方法简单示例
  16. Node复习
  17. 用C#中的键值对遍历数组或字符串元素的次数
  18. [转帖]Oracle 11G RAC For Windows 2008 R2部署手册
  19. WordPress 在function.php 文件中方法中the_XXX方法失效
  20. Mongodb3安装授权

热门文章

  1. 004.OpenShift命令及故障排查
  2. v-model指令的学习(双向绑定)
  3. 使用java类的方式配置spring 需要什么注解?
  4. JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去…
  5. CSS定位(Positioning)
  6. python黑帽子之tcp客户端
  7. 使用训练好的modle,做些有用的事(各层数据可视化)
  8. 数据库连接池 --Druid 连接工具类创建_JDBCUtils
  9. 不就是语法和长难句吗—笔记总结Day4
  10. linux就该这么学 第一天学习笔记