RDot

RDot (https://rdot.org/forum/index.php)
-   Релизы/Releases (https://rdot.org/forum/forumdisplay.php?f=11)
-   -   [Firefox] убираем кодирование кавычек в URL | Firefox URL quote encoding patch (https://rdot.org/forum/showthread.php?t=2875)

SynQ 03.10.2013 14:57

[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 03.10.2013 14:58

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.'


terra 03.10.2013 18:54

FF-24.0 / Win7 / Работает со всеми кавычками (кодирование и раскодирование).

profexer 04.10.2013 00:47

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

P.S.
Уже давно зреет желание форкнуть лису, выкинуть из нее всю гадость (FFOS со всякими mozSMS, отправку страниц на проверку etc), поставить правильные дефолтные флаги, убрать это кодирование, разрешить менять чудо параметры (width, height etc) и вернуть в интерфейс некоторые настройки.
Уже даже пробовал - но понял что сам не потяну.

SynQ 04.10.2013 10:11

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

А по лисе такая идея многим приходила, но ее ведь надо поддерживать: закрывать баги, разбираться в новых коммитах, - что они ломают, править. Нереально.

terra 04.10.2013 16:42

profexer может тоже попробуешь напишешь скрипт со своими настройками, задумками какими-то..
Можно к ним добавить автоматическую настройку about:config'a)) там достаточно разных парметром которые нужно отключить или включить..хотя эти настройки сохраняются после обновлений...ну малоли подхватит кто чего)
SynQ спасибо за скрипт.

xCedz 04.10.2013 18:10

Цитата:

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

В профиле создаешь user.js и туда закидываешь настройки

pref("KEY", VALUE);



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

profexer 11.12.2013 18:44

С разрешения 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`


}{оттабыч 26.03.2014 21:24

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

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

Andrewaeva 20.01.2015 15:12

Mac ff 35
перестал работать патч


Часовой пояс GMT +3, время: 13:31.

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