Найдите опасное использование $ _GET и $ _POST с egrep - PullRequest
0 голосов
/ 24 января 2011

Я хотел бы быть уверен, что я не использовал $ _POST или $ _GET так, как это мог бы использовать злоумышленник (XSS-атаки, SQL-инъекции). Чтобы найти все строки, где я использовал $ _GET или $ _POST, я использовал эту команду:

egrep "_GET|_POST" -r -i MyFolder > dangerousUse.txt

dangerousUse.txt имеет 439 строк. Если я буду искать так:

egrep "\$_GET|\$_POST" -r -i MyFolder > dangerousUse.txt

dangerousUse.txt имеет 0 строк. Если я буду искать так:

egrep "_GET\[|_POST\[" -r -i MyFolder > dangerousUse.txt

dangerousUse.txt имеет 385 строк. Я думаю, что это число, которое я хочу, но я бы тоже хотел, чтобы $ -синхронизировался.

Мой первый вопрос: почему не работает вторая команда egrep?

Теперь я уверен, что ввод используется правильно, если была применена одна из следующих команд:

  • mysql_real_escape_string(htmlspecialchars($input)) или mysql_real_escape_string ( htmlspecialchars ( $input ) ) или другие комбинации с пробелами.
  • intval($input)
  • isset($input)
  • $input == или == $input

Как мне найти только те строки, где $ _POST или $ _GET используются без этих функций? Также было бы хорошо удалить строки в dangerousUse.txt, где эти функции применяются к каждому $ _POST или $ _GET в этой строке.

редактировать:

egrep '\$_GET\[|\$_POST\[' -r -i MyFolder > dangerousUse.txt

работает, спасибо VGE за первую часть ответа. Теперь опасный пользовательский файл имеет 385 строк. Но второй для меня важнее.

для второй части, egrep -v инвертирует совпадения:

egrep '(isset|intval|mysql_real_escape_string\(htmlspecialchars|md5|datum_anpassen)[\w]*\(\$_' -i -v dangerousUse.txt > dangerousUse2.txt

Ответы [ 2 ]

4 голосов
/ 24 января 2011

Двойные кавычки оболочки требуют двойного экранирования.

Например, echo "\$" напечатает '$', но echo "\\$" напечатает '\ $'

, а '$' - конецлинии регулярного выражения и является префиксом переменной оболочки.Следующие шаблоны будут работать штрафами

egrep "\\\$_GET|\\\$_POST" -r -i MyFolder > dangerousUse.txt
egrep "[$]_GET|[$]_POST" -r -i MyFolder > dangerousUse.txt
egrep '\$_GET|\$_POST' -r -i MyFolder > dangerousUse.txt

Последний вариант проще, поскольку оболочка не выполняет интерполяцию переменных внутри одинарных кавычек и экранирование отсутствует.

Вероятно, один способ гарантировать, что выпроверьте все, что вы вводите, чтобы определить функции sanitized_GET и sanitized_POST, которые выполняют все это.

0 голосов
/ 24 января 2011

\$ в вашем примере, вероятно, интерпретируется вашей оболочкой, а необъявленный $ передается в grep, поскольку оболочка расширяет переменные, начиная с $. Попробуйте вместо одинарных кавычек или экранирования \$:

egrep '\$_GET|\$_POST'
egrep "\\\$_GET|\\\$_POST"

Кроме того, вы можете использовать опции -H и -n для вывода соответствующего файла и номера строки соответственно. Таким образом, вы можете легко найти опасные места использования.

Вы также можете отфильтровывать "хорошие" совпадения из вашего "dangerUse.txt", используя grep, используя переключатель -v (revert):

egrep -H -n '\$_GET|\$_POST' -r -i MyFolder | egrep -v 'mysql_real_escape_string|intval|isset|<...>' > dangerousUse.txt
...