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