Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Тридцать по одному или один по тридцать?

Читайте также:
  1. VIII. Антагонист наносит одному из членов семьи вред или ущерб
  2. В салоне каждого головного вагона под первым правым диваном находится по одному асбестовому полотну.
  3. Визначення густини порід у природному заляганні
  4. Восемьсот тридцать восьмая ночь
  5. Восемьсот тридцать вторая ночь
  6. Восемьсот тридцать девятая ночь
  7. Восемьсот тридцать первая ночь

Как бы забавно это ни звучало, но первый и самый очевидный профит — это возможность ускориться при некоторых видах сканирования веб-приложений. Разберем простой пример: нам нужно проверить определенный XSS-вектор в приложении, состоящем из десяти сценариев. Каждый сценарий принимает по три параметра.

Я накодил небольшой скрипт на Python, который пробежится по всем страницам и проверит все параметры по одному, а после выведет уязвимые сценарии или параметры (сделаем четыре уязвимые точки) и время, затраченное на сканирование.

import socket, time, re

print("\n\nScan is started...\n")

 

s_time = time.time()

 

for pg_n in range(0,10):

for prm_n in range(0,3):

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(("host.test", 80))

req = "GET /page"+str(pg_n)+".php?param"+str(prm_n)+"=<script>alert('xzxzx:page"+str(pg_n)+":param"+str(prm_n)+":yzyzy')</script> HTTP/1.1\r\nHost: host.test\r\nConnection: close\r\n\r\n"

 

s.send(req)

res = s.recv(64000)

pattern = "<script>alert('xzxzx"

if res.find(pattern)!=-1:

print("Vulnerable page"+str(pg_n)+":param"+str(prm_n))

s.close()

 

print("\nTime: %s" % (time.time() - s_time))

Пробуем. В результате время исполнения составило 0,690999984741.

Локальный тест без keep-alive

А теперь пробуем то же самое, но уже с удаленным ресурсом, результат — 3,0490000248.

Неплохо, но попробуем использовать keep-alive — перепишем наш скрипт так, что он будет посылать все тридцать запросов в одном соединении, а затем распарсит ответ для вытаскивания нужных значений.

import socket, time, re

print("\n\nScan is started...\n")

 

s_time = time.time()

req = ""

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(("host.test", 80))

 

for pg_n in range(0,10):

for prm_n in range(0,3):

req += "GET /page"+str(pg_n)+".php?param"+str(prm_n)+"=<script>alert('xzxzx:page"+str(pg_n)+":param"+str(prm_n)+":yzyzy')</script> HTTP/1.1\r\nHost: host.test\r\nConnection: keep-alive\r\n\r\n"

 

req += "HEAD /page0.php HTTP/1.1\r\nHost: host.test\r\nConnection: close\r\n\r\n"

s.send(req)

# Timeout for correct keep-alive

time.sleep(0.15)

res = s.recv(640000000)

pattern = "<script>alert('xzxzx"

strpos = 0

if res.find(pattern)!=-1:

for z in range(0,res.count(pattern)):

strpos = res.find(pattern, strpos+1)

print("Vulnerable "+res[strpos+21:strpos+33])

s.close()

 

print("\nTime: %s" % (time.time() - s_time))

Пробуем запустить локально: результат — 0,167000055313. Запускаем keep-alive для удаленного ресурса, выходит 0,393999814987.

И это при том, что пришлось добавить 0,15 с, чтобы не возникло проблем с передачей запроса в Python. Весьма ощутимая разница, не правда ли? А когда таких страниц тысячи?

Конечно, продвинутые продукты не сканируют в один поток, но настройки сервера могут ограничивать количество разрешенных потоков. Да и в целом если распределить запросы грамотно, то при постоянном соединении нагрузка окажется меньше и результат будет получен быстрее. К тому же задачи пентестера бывают разные, и нередко для них приходится писать кастомные скрипты.


Дата добавления: 2015-07-14; просмотров: 81 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
How it works| Непредвиденные обстоятельства

mybiblioteka.su - 2015-2024 год. (0.007 сек.)