0x01 обходного Введение
Мы знаем , что строки PHP запроса (в тексте или URL) на внутренний $_GET
или ассоциативный массив $_POST
. Например: /?foo=bar
чтобы стать Array([foo] => “bar”)
. Стоит отметить , что, удалить или заменить строку запроса разбора подчеркнута в процессе превращения некоторых символов. Например, /?%20news[id%00=42
он будет преобразован в Array([news_id] => 42)
. Если один IDS/IPS
или WAF
существует правило , что , когда news_id
значение параметра не является числовым значением перехвата, то можно обойти со следующим утверждением:
/news.php?%20news[id%00=42"+AND+1=0--
0x02 PHP синтаксический функций, представленных
PHP необходимо преобразовать все параметры действительного имени переменной, поэтому при разборе строки запроса, он будет делать две вещи:
-
Удаление пробельных символов
-
Для того, чтобы преобразовать некоторые символы подчеркивания (включая пробелы)
Например:
Пользовательский ввод | декодированного PHP | имя переменной |
---|---|---|
20foo_bar% 00% | foo_bar | foo_bar |
Foo% 20bar% 00 | Foo бар | foo_bar |
Foo% 5bbar | Foo [бар | foo_bar |
Приведенные выше результаты мы можем размывают
скрипт следующим образом :
<?php
foreach(
[
"{chr}foo_bar",
"foo{chr}bar",
"foo_bar{chr}"
] as $k => $arg) {
for($i=0;$i<=255;$i++) {
echo "\033[999D\033[K\r";
echo "[".$arg."] check ".bin2hex(chr($i))."";
parse_str(str_replace("{chr}",chr($i),$arg)."=bla",$o);
/* yes... I've added a sleep time on each loop just for
the scenic effect :)
like that movie with unrealistic
brute-force where the password are obtained
one byte at a time (∩`-´)⊃━☆゚.*・。゚
*/
usleep(5000);
if(isset($o["foo_bar"])) {
echo "\033[999D\033[K\r";
echo $arg." -> ".bin2hex(chr($i))." (".chr($i).")\n";
}
}
echo "\033[999D\033[K\r";
echo "\n";
}