我想确定,我没有以攻击者可以利用的方式使用$ _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
答案 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_GET
和sanitized_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