Arquivos de accesslog NGINX analisáveis com delimitadores

6

O formato padrão do NGINX é este:

log_format combined '$remote_addr - $remote_user [$time_local]  '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent"';

Que é um pouco difícil de analisar. Temo que as pessoas injetem " em solicitações, referenciadores ou usuários-agentes.

Pensei em usar delimitadores e usar meu próprio formato, que usa |P-,| como delimitador:

log_format parsable '$status |P-,| $time_iso8601 |P-,| $http_host 
|P-,| $bytes_sent |P-,| $http_user_agent |P-,| $http_referer 
|P-,| $request_time |P-,| $request';

No entanto, nada impede que os usuários injetem |P-,| em suas solicitações, referenciadores ou user-agents.

Eu li este artigo sobre texto delimitado por ASCII: link

Acho que isso poderia ser usado para resolver esses problemas, mas os usuários também poderiam injetar delimitadores ASCII em seus dados.

Existe uma maneira de melhor prática para resolver esse problema?

    
por Kasper Grubbe 27.03.2014 / 12:59

2 respostas

14

Não há problema.

I am afraid that people inject " in either requests, referrers or user-agents.

" é representado como \x22

Solicitação:

$ curl 'localhost/"?"="' --header 'User-Agent: "'

linha no log:

[27/Mar/2014:16:14:42 +0400] localhost 127.0.0.1 "GET /\x22?\x22=\x22 HTTP/1.1" 200 "-" "\x22" "-" "/index.html"

UPDATE

Do changelog nginx

Mudanças com o nginx 1.1.6 17 out 2011

*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
   access_log.

Mudanças com o nginx 0.7.0 19 de maio de 2008

*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
   in an access_log.
   Thanks to Maxim Dounin.
    
por 27.03.2014 / 13:16
1

Lembre-se de que vários campos são gerados pelo sistema, portanto, são seguros. Se você garantir que esses campos estão à esquerda e os hackíveis estão à direita (http_user_agent deve no final, e o http_referer antes disso, a solicitação deve ser anterior a essa), você pode garantir que a maioria dos dados seja som e adicionando mais delimitadores para o analisador (um opcional na extremidade direita) do que possivelmente existe sem inserção, então seu analisador detectará registros que foram sujeitos a inserção.

Além disso, recomeçei a usar um caractere de tabulação como um delimitador, pois acredito que alguém tentaria inseri-lo em um URL, ele acabaria escapando para um% 09

    
por 27.03.2014 / 13:14