Показать сообщение отдельно
Старый 03.10.2013, 15:57   #1
SynQ
 
Регистрация: 11.07.2010
Сообщений: 954
Репутация: 352
По умолчанию [Firefox] убираем кодирование кавычек в URL | Firefox URL quote encoding patch

See next post for English description!


Патч призван устранить кодирование кавычек (',",`) в HTTP запросах.

Начиная с версии 3.0 (коммит), Firefox стал урл-кодировать одинарную кавычку (') в %27. Данное поведение нередко может помешать обнаружить SQL инъекцию в веб-приложениях, например, при участии переменных $_SERVER["QUERY_STRING"] и $_SERVER["REQUEST_URI"] в SQL запросах.

Патч универсален, патчит как xul.dll (Windows), libxul.so (Linux), так и XUL (Mac OS X). Должен работать на производных от Firefox браузерах (Palemoon, SeaMonkey и т.д.).

Проверка успешности работы патча:
Цитата:
$ nc -l -p 7777
Firefox: http://localhost:7777/?quote='
Патч, позволяет пропатчить поведение одинарной, двойной и обратной кавычек. В большинстве случаев достаточно пропатчить только поведение одинарной кавычки.
Действие патча обратимо, если запустить его повторно с тем же параметром.

Наличие патча мешает обновлению Firefox, поэтому установку и поиск обновления следует проводить с оригинальным xul.dll. После обновления потребуется пропатчить библиотеку снова. Для удобства можно создать .bat или .sh файл и запускать его перед обновлением и после.

Пути по умолчанию:
Код:
C:\Program Files\Mozilla Firefox\xul.dll
/usr/lib/firefox-4.0/libxul.so
/usr/lib/xulrunner-2.0/libxul.so
/Applications/Firefox.app/Contents/MacOS/XUL
Поведение разных браузеров представлено ниже:
Код:
IE9:	 GET /index.php?id=q'w"e`r HTTP/1.1
Safari5: GET /index.php?id=q'w%22e`r HTTP/1.1
Opera11: GET /index.php?id=q'w%22e%60r HTTP/1.1
FF3.0a4: GET /index.php?id=q'w%22e%60r HTTP/1.1
FF3.0a6: GET /index.php?id=q%27w%22e%60r HTTP/1.1
PS Спасибы: tipsy, Andrey1800, n0body

Код:
#!/usr/bin/env python
#
# Firefox URL quote encoding patch
# written by SynQ, rdot.org
import sys

sequence_start = '\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xB9\x03\x00\x00\x10\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xF0\x03\x00\x00'
sequence_middle_3to8 = '\x90\x03\x00\x00'
sequence_middle_9plus = '\xF0\x03\x00\x00'
sequence_end = '\x00\x00\x00\x00\xF0\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\xF0\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\xFF\x03\x00\x00\x80\x03\x00\x00\x80\x03\x00\x00\x80\x03\x00\x00\x80\x03\x00\x00\xFF\x03\x00\x00'

def writefunc( write_offset ):
    orig_offset = f.tell()
    f.seek(write_offset)
    byte = f.read(4)
    f.seek(write_offset)
    if byte == enc:
        f.write(no_enc)
        print 'This quote have been sent encoded (original behavior), now changed to have no encoding'
    elif byte == no_enc:
        print 'This quote have been sent unencoded (patched behavior), reverted it back to original behavior'
        f.write(enc)
    else:
        print 'Error at sequence patching'
    f.seek(orig_offset)
    return

enc = '\x00\x00\x00\x00'
no_enc = '\xFF\x03\x00\x00'
single_quote = -1 * 4
double_quote = -6 * 4
back_quote = 56 * 4

tail = 512
buf_size = 2048*512
blk_size = buf_size-tail
blk_count = 0
found = False
mac = False
##################################################################
if len(sys.argv) < 3:
    print '\nUsage:', sys.argv[0], 'xul_file.ext [single_quote | double_quote | back_quote]\n'
    print 'If you\'re trying to patch old FF version (from 3.0 to 8.0) add "ff_v3-8" parameter to the end.\n'
    print 'To change several quotes encoding, run the patcher several times.\nPatching the same quote 2 times, reverts it back.'
    sys.exit(1)

filename = sys.argv[1]
if sys.argv[2] == 'single_quote':
    quote = single_quote
elif sys.argv[2] == 'double_quote':
    quote = double_quote
elif sys.argv[2] == 'back_quote':
    quote = back_quote
else:
    print 'Wrong quote type!'
    sys.exit(1)

if len(sys.argv) == 4 and sys.argv[3] == 'ff_v3-8':
    sequence = sequence_start + sequence_middle_3to8 + sequence_end
else:
    sequence = sequence_start + sequence_middle_9plus + sequence_end
##################################################################
f = open(filename, 'r+b')
counter = 0
data = f.read(buf_size)
while data:
    offset = data.find(sequence)
    if offset >= 0:
        counter += 1
        offset += blk_count*blk_size
        found = True
        print 'Found magic sequence at offset', offset
        if counter > 2:
            print 'Uhm... found more than 2 sequence occurences, that shouldn\'t happen!'
            sys.exit(1)
        elif counter == 2:
            mac = 1
        writefunc(offset + quote)
    blk_count += 1
    data = data[-tail:] + f.read(blk_size)
    if len(data) == tail:
        break
f.close()

if mac:
    print '\nSeems like it was a Mac XUL file'
if not found:
    print 'Nothing has been found. Either you\'ve specified the wrong FF version or it\'s not a XUL file at all.'
Старая тема в архиве: https://rdot.org/forum/showthread.php?t=1403

Последний раз редактировалось SynQ; 05.10.2013 в 14:13..
SynQ вне форума   Ответить с цитированием