测试 PHP 表单注入

信息安全 应用安全 php xss 注射
2021-08-13 04:42:18

我正在编写一个非常小的 PHP 应用程序,它通过表单接受输入。正如第一次修订所预期的那样,代码不会转义或清理输入:

if( $_POST["var"] != "" ) {
    print "Current value: ".$_POST["var"]."\n";
}

但是,如果我尝试注入 PHP 代码("; print phpinfo();、 " 等),我只会将其回显给我,而不是执行它。

我知道如何使用htmlspecialchars,等清理输入addcslashesmysqli_real_escape_string但在我使用它们之前 - 我需要什么语法才能成功注入任意 PHP 代码?

我注意到我的机器安装了 PHP Suhosin 补丁(Ubuntu 10.10)——这会自动转义/清理我的输入吗?

3个回答

对于该代码,我不希望获得 PHP 注入,但我会改为查看跨站点脚本 (XSS)。

例如,尝试注入:

<script> alert('woot Security.SE rulez!');</script>

除非您的应用程序使用 include()、require()、eval()、create_function() 或任何调用解释器的类似函数,否则“PHP 注入”是不可能的。或者,如果您的应用程序写入 PHP 路径中以 .php、.phtml 或任何其他 PHP 注册文件扩展名结尾的文件。

不过,正如 AviD 所指出的,在您的示例中,标记和脚本注入绝对是可能的。

尝试下载“篡改数据”……它是 Firefox 的一个附加组件,它使对 Web 应用程序执行注入攻击变得非常容易。它甚至有一些你可以尝试的内置默认攻击,以防你自己不知道!

仅供参考,我不会考虑使用 stripcslashes,因为它也可能导致 XSS。

让我解释一下: stripslashes vs stripcslashes

stripslashes 删除所有反斜杠,无论类型如何

stripcslashes 将删除除十六进制字符之外的所有反斜杠,因此这意味着您可以通过执行以下操作对使用 stripcslashes 的函数执行 XSS 攻击:

\\x3c\\x73\\x63\\x72\\x69\\x70\\x74\\x3e\\x61\\x6c\\x65\\x72\\x74\\x28\\x27\\x58\\x53\\x53\\x21\\x27\\x29\\x3b\\x3c\\x2f\\x73\\x63\\x72\\x69\\x70\\x74\\x3e

当由 stripcslashes 函数评估时,将导致:alert('XSS!');

这实际上是我在一个流行的 Wordpress 插件中发现的一个漏洞(Platinum SEO <= 1.3.7)

只需确保在使用它们之前对正在使用的功能进行研究,因为您可能会导致比其价值更多的问题。

这也适用于您对addcslashes () 的使用,因为您可以强制它评估您不想要的代码,如下所示:

$>php -r 'echo addcslashes("\x41", "A..z");' 
\A   

这是一个用于格式错误的 XSS 字符串的基本示例:

> php -r 'echo addcslashes("\x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x21\x27\x29\x3b\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e", "/");'   
<script>alert('XSS!');<\/script>

如您所见,这仍然会执行警报。

正如 mehaase 所证实的,如果不使用 include()、require()、eval()、system() 之类的东西,就不可能调用 PHP 代码(如果您在用户输入上使用 system(),您会更加担心PHP 任意代码执行)。