编写脚本通过 php 文件搜索危险调用以进行手动审查

信息安全 应用安全 php 代码审查 人工审核 源代码
2021-08-14 17:01:15

我正在自动化一个脚本,该脚本在大型站点上的所有 php 文件中搜索危险命令。找到的文件将进行手动代码审查。

有人对我的剧本有什么建议吗?有什么我忘记搜索的吗?请注意,这个脚本是在 10 分钟内完成的,所以我确信可以进行很多改进以使其更容易和更好(比如多个 egrep 参数)。

find . | grep "php$" | xargs grep -s "eval(" >> /tmp/review.txt
find . | grep "php$" | xargs grep -s "fopen(" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "passthru(" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "exec(" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "proc_" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "dl(" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "require($" >> /tmp/review.txt
find . | grep "php$" | xargs grep -s "require_once($" >> /tmp/review.txt
find . | grep "php$" | xargs grep -s "include($" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "include_once($" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "include($" >> /tmp/review.txt 
find . | grep "php$" | xargs grep -s "query(" >> /tmp/review.txt 
4个回答

这份清单肯定是不够的。首先,它不完整,其次,可以使用不同的混淆方法来隐藏 web-shell,其他恶意脚本。

为此,很久以前我编写了自己的 PHP 脚本来寻找危险的地方:http: //0x416d73.name/proj/fcc.html它是用 PHP 编写的,所以不要期望它和“查找”命令一样快。不过,它允许检查文件哈希,查看哪些文件已经出现、丢失或已更改。我建议您先针对一些小脚本对其进行测试,以感受它的工作原理,然后再在生产服务器上运行。此外,专门用于搜索 PHP 代码中的漏洞,前段时间我整理了一些简单的 bash 脚本 - http://privatepaste.com/88a5d5eaa3它不完整,可能需要 bash 大师的调整和批评:)

如果您想继续自己的脚本,这里有一个很好的列表,您可以从中提取您需要的内容:http : //privatepaste.com/dc335ccb86

更新:据了解,主题是关于代码审查的。上面提到的解决方案仍然有意义,但是我想提一下这个项目:http : //sourceforge.net/projects/rips-scanner/在我看来,目前它是 PHP Web 应用程序最好的免费源代码分析器。

虽然我没有在 PHP 上使用静态分析工具的直接经验,但看起来有许多工具可供使用,包括开源的和商业的。

简而言之,看起来 PHPLint 应该相当快速且易于使用。我的解释表明它的运行方式与 C 的 lint/splint 非常相似,我使用过并且很满意。

开源

商业的

我不是 PHP 高手,所以我没有太多要寻找的额外内容,但您应该注意,任何类型的随机空格都会弄乱您的发现。
例如

fopen  ( 

不会被发现...

我认为extract也是一种危险的语言结构。(虽然它比 eval() 使用得更少,所以没有多少人意识到这一点。)

您也可以尝试使用 Php Code Sniffer 并将其编写为您自己的“嗅探器”。这是我为我从事的一个开源项目写的。