发现使用egrep危险地使用$ _GET和$ _POST

时间:2011-01-24 07:55:37

标签: php sql regex shell grep

我想确定,我没有以攻击者可以利用的方式使用$ _POST或$ _GET(XSS-Attacks,SQL-Injections)。要找到我使用$ _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行。我认为这是我想要的数字,但我希望$ -sign也能匹配。

我的第一个问题是:为什么第二个egrep-command不起作用?

现在我确信,如果已应用以下命令之一,则输入正确使用:

  • 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的第一部分答案。现在dangerousUse.txt有385行。但第二个对我来说更重要。

对于第二部分,egrep -v反转匹配:

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

2 个答案:

答案 0 :(得分:4)

Shell双引号需要双重转义。

例如echo "\$"将打印'$' 但echo "\\$"会打印'\ $'

'$'是行正则表达式标记的结尾,是shell变量前缀。 以下模式将起到罚款

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

最新版本更简单,因为shell不会在单引号内执行变量插值,也没有转义。

确保检查所有输入内容的一种方法可能是定义执行所有内容的sanitized_GETsanitized_POST函数。

答案 1 :(得分:0)

您的示例中的\$可能由您的shell解释,而未转义的$会传递给grep,因为shell会扩展以$开头的变量。尝试使用单引号或shell转义\$代替:

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

此外,您可能希望使用-H-n选项分别输出匹配的文件和行号。这样您就可以轻松找到危险的使用位置。

您可以使用grep过滤掉“dangerousUse.txt”中的“好”匹配,使用-v(还原)开关:

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