Вернуться   RDot > RDot.org > Релизы/Releases

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.10.2013, 14:57   #1
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 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 в 13:13..
SynQ вне форума   Ответить с цитированием
Старый 03.10.2013, 14:58   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Firefox URL quote encoding patch

The purpose of this patch is to get rid of a single quote url-encoding in HTTP requests.

Since version 3.0 (commit) Firefox started to url-encode a single quote into %27. Sometimes such behavior can affect your ability to detect a SQL injection when, for example, $_SERVER["QUERY_STRING"] and $_SERVER["REQUEST_URI"] are used directly in SQL queries.

The patch is versatile and can patch multi-platform Firefox: xul.dll (Windows), libxul.so (Linux), XUL (Mac OS X). It should also work with FF derivatives such as Palemoon/SeaMonkey/younameit.

This patch allows you to modify the behavior of a single, double and back quotes, though most users should be interested in patching only the single quote behavior.
The patch is reversible, applying it twice with the same options reverts the changes.

Having installed, the patch interrupts update process of Firefox.
So even the check for updates should be done only with the original xul.dll file in place. Basically, undo the patch (i.e. run it again with the same options as before, or just copy the original xul.dll), then update Firefox, and apply the patch once again.
The power of batch files could be used to automate this process.

Default paths:
Код:
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
Popular browsers behavior on quotes:
Код:
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
Код:
#!/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.'

Последний раз редактировалось SynQ; 05.10.2013 в 13:33..
SynQ вне форума   Ответить с цитированием
Старый 03.10.2013, 18:54   #3
terra
 
Регистрация: 03.10.2013
Сообщений: 3
Репутация: 0
По умолчанию

FF-24.0 / Win7 / Работает со всеми кавычками (кодирование и раскодирование).
terra вне форума   Ответить с цитированием
Старый 04.10.2013, 00:47   #4
profexer
 
Регистрация: 06.01.2011
Сообщений: 117
Репутация: 63
По умолчанию

А что с этим не так, что нужно было на питоне(!) переписывать?

P.S.
Уже давно зреет желание форкнуть лису, выкинуть из нее всю гадость (FFOS со всякими mozSMS, отправку страниц на проверку etc), поставить правильные дефолтные флаги, убрать это кодирование, разрешить менять чудо параметры (width, height etc) и вернуть в интерфейс некоторые настройки.
Уже даже пробовал - но понял что сам не потяну.
profexer вне форума   Ответить с цитированием
Старый 04.10.2013, 10:11   #5
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

profexer
Всё так, но там не универсально, и без исходников.

А по лисе такая идея многим приходила, но ее ведь надо поддерживать: закрывать баги, разбираться в новых коммитах, - что они ломают, править. Нереально.
SynQ вне форума   Ответить с цитированием
Старый 04.10.2013, 16:42   #6
terra
 
Регистрация: 03.10.2013
Сообщений: 3
Репутация: 0
По умолчанию

profexer может тоже попробуешь напишешь скрипт со своими настройками, задумками какими-то..
Можно к ним добавить автоматическую настройку about:config'a)) там достаточно разных парметром которые нужно отключить или включить..хотя эти настройки сохраняются после обновлений...ну малоли подхватит кто чего)
SynQ спасибо за скрипт.
terra вне форума   Ответить с цитированием
Старый 04.10.2013, 18:10   #7
xCedz
 
Регистрация: 05.07.2010
Сообщений: 33
Репутация: 6
По умолчанию

Цитата:
Сообщение от terra Посмотреть сообщение
Можно к ним добавить автоматическую настройку about:config'a)) там достаточно разных парметром которые нужно отключить или включить..хотя эти настройки сохраняются после обновлений...ну малоли подхватит кто чего)
В профиле создаешь user.js и туда закидываешь настройки

pref("KEY", VALUE);



И все, можно таскать из профиля в профиль.

Последний раз редактировалось xCedz; 04.10.2013 в 18:18..
xCedz вне форума   Ответить с цитированием
Старый 11.12.2013, 18:44   #8
profexer
 
Регистрация: 06.01.2011
Сообщений: 117
Репутация: 63
По умолчанию

С разрешения nobody, выкладываю исходники из той самой темы (там уже закрыто).

Код:
/**
 * Make FF Sexy patch v2 (i hope)
 * tested on
 *  FF >=9.0     arch-x86_64, debian-x86_64, mint-x86_64
 *  10.0	 	 Windows XP 32 bit $compiled by Tiny C Compiler
 *  
 * Thanks to SynQ, Andrey1800, tipsy
 * https://rdot.org/forum/showthread.php?t=1403
 * 
 * nobody cares (c)
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>


unsigned char sequence[] = "\xff\x03\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00";
//unsigned char psequence[] = "\xff\x03\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\xff\x03\x00\x00";
int sequence_len = 16;
unsigned char UNESCAPE[] = "\xff\x03";

unsigned long findOffsetByFilename(char* fname) {

    unsigned int buf, match = 0;
    unsigned long offset = 0;

    FILE *fp = fopen(fname, "rb");
    if( fp ) {
        while( (buf = fgetc(fp)) != EOF ) {

            if( buf == sequence[match] ) {
                ++match;
            } else {
                match = 0;
            }

            if( sequence_len == match ) {
                offset = ftell(fp) - 2*sequence_len;	//nsEscape.cpp: start at 2x of EscapeChars[]
            }
        }
        fclose(fp);
    }
    if( offset == 0 )
        ; /* Shity thing, signature changed if libxul already patched for singlequote            */
          /* We can use  psequence  here but it will make much more crap that we already have =( */
    return offset;
}

void help(char* me) {
	printf("Make FF Sexy!\n\n\
USAGE: %s [version] /path/to/libxul.so\n\
Versions:\n\
1 - patch for single quote (')\n\
2 - patch for double-quote (\")\n\
3 - patch for backquote (`)\n\
4 - 1+2 versions\n\
5 - 1+3 versions\n\
6 - 2+3 versions\n\
7 - 1+2+3 versions\n\
Example: %s 7 /usr/lib/xulrunner-2.0/libxul.so\n\
", me, me);
	exit(0);
}

void patch_sequence(FILE* dst, unsigned long goffset, unsigned short v) {

    if( fseek(dst, goffset, SEEK_SET) )
        perror("fseek");

    long int qlo = 0;
    if( v == 1 ) {		//single quote
        qlo = 8 + 16 + 4;
    }
    else if (v == 2) {          //double quote
        qlo = 8;
    }
    else if (v == 3) {          //backquote
        qlo = 16 * 16;
    }
    else if (v == 4) {          //single+double
        patch_sequence(dst, goffset, 1);
        patch_sequence(dst, goffset, 2);
    }
    else if (v == 5) {          //single+back
        patch_sequence(dst, goffset, 1);
        patch_sequence(dst, goffset, 3);
    }
    else if (v == 6) {          //double+back
        patch_sequence(dst, goffset, 2);
        patch_sequence(dst, goffset, 3);
    }
    else if (v == 7) {          //real sexy
        patch_sequence(dst, goffset, 1);
        patch_sequence(dst, goffset, 2);
        patch_sequence(dst, goffset, 3);
    }


    if( fseek(dst, qlo, SEEK_CUR) ) {
        perror("fseek");
    }
    if( (fwrite(UNESCAPE, strlen( (char*)UNESCAPE ), 1, dst)) != 1 ) {
        perror("fwrite");
    }
}

int main(int argc, char** argv) {

    int v = 0;
    char *srcFilename;

    if( argc != 3 ) {
        help(argv[0]);
    }
    else {
        v = atoi(argv[1]);
        if( v < 1 || v > 7 )
            help(argv[0]);

        srcFilename = argv[2];
    }
    struct stat __srcFilename;
    stat(srcFilename, &__srcFilename);
    if( !(S_ISREG(__srcFilename.st_mode)) ) {
        printf("%s: No such file (maybe wrong path, or it's a symbolic link)\n", srcFilename);
        return errno;
    }
    if( access(srcFilename, R_OK) != 0 || access(srcFilename, W_OK) != 0 ) {
        printf("You must have permissions to read and write %s\n", srcFilename);
        return -1;
    }


    unsigned long offset = findOffsetByFilename(srcFilename);
    if( offset == 0 ) {
        printf("Please use original (not patched) libxul!\n");
        return -1;
    }

    FILE *fp = fopen(srcFilename, "rb+");
    if( fp ) {
        patch_sequence(fp, offset, v);
        fclose(fp);
    }
    printf("[+] Patched!\n");

    return 0;
}
// # nc -lp 80
// http://localhost/?single_quote=123'&double_quote=-5"&back_quote=`select`
profexer вне форума   Ответить с цитированием
Старый 26.03.2014, 21:24   #9
}{оттабыч
Banned
 
Регистрация: 08.10.2010
Сообщений: 188
Репутация: 53
По умолчанию

Значит отписываюсь тут, так как предыдущий топик закрыт.

make_ff_sexy_win.tar.bz2 от nobody у меня сработал на Portable Firefox 28.0, Win 7 Ultimate 64бит
У меня на другом(не системном диске!) FF находится.
make_sexy.exe 7 "D:\portable soft\browsers\FirefoxPortable\App\Firefox\xul.dll"

Заметка:
Когда диск в путях make_sexy.exe и portable FF разный, то патч не сработает.
make_sexy.exe ложить и запускать на том диске, где Portable Firefox лежит.

ссылка на пост nobody

Последний раз редактировалось }{оттабыч; 26.03.2014 в 21:35..
}{оттабыч вне форума   Ответить с цитированием
Старый 20.01.2015, 15:12   #10
Andrewaeva
 
Регистрация: 28.10.2013
Сообщений: 1
Репутация: 0
По умолчанию

Mac ff 35
перестал работать патч
Andrewaeva вне форума   Ответить с цитированием
Ответ

Метки
firefox, patch, sql injection

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot