bWAPP(buggy web Application)是一个集成了了常见漏洞的 web 应用程序,目的是作为漏洞测试的演练场(靶机),为 web 安全爱好者和开发人员提供一个测试平台,与 webgoat、dvwa 类似。
环境搭建
bWAPP 有两种安装方式,可以单独安装,部署到 apache + php + mysql 的环境;也可以安装虚拟机版本 bee-box,区别在于虚拟机版本能够测试的漏洞更多,比如破壳漏洞,心脏滴血漏洞等在单独安装的环境下无法测试。
单独安装:
安装 wampserver :单独安装首先需要搭建 Apache + php + mysql 的环境,使用集成环境 wampserver, 下载地址:
下载安装 bWAPP, 下载地址:
https://sourceforge.net/projects/bwapp/files/?source=navbar
解压压缩包,按照其中的 INSTALL.txt 进行安装。拷贝解压后的文件到服务区根目录,即 wampserver 安装目录下的 www 目录。编辑其中的 admin/settings.php 文件,配置数据库的地址、用户名和密码。
运行安装 wampserver,并在浏览器打开
http://127.0.0.1/bWAPPv2.2/bWAPP/install.php
其中 bWAPPv2.2/bWAPP/install.php 代表的是 www 目录下的文件路径。
点击 here 超链接,自动创建数据库。然后进入主界面:
http://127.0.0.1/bWAPPv2.2/bWAPP/login.php
用户名:bee,密码:bug,登录后即可进行相应测试。
如果需要配置成局域网电脑可访问,参考下图,打开图中所示的 httpd-vhosts.conf, 把 Require local 修改为 Require all granted,然后保存重启即可。
虚拟机安装
虚拟机安装相对简单,只需要下载虚拟机镜像 bee-box,导入虚拟机软件,开启虚拟机即可通过主机访问。
主机通过浏览器访问:
http://[IP]/bWAPP/或者http://[IP]/bWAPP/login.php
其中 IP 为对应 bee-box 虚拟机的 ip 地址。(一定要自己动手尝试才清楚,一开始我还以为虚拟机比较复杂,后面发现如此简单)
漏洞练习
测试漏洞是在虚拟机环境下进行测试的。
1.HTML 注入—反射型 GET
漏洞类型:注入
影响范围:主站
URL:http://localhost/bWAPP/htmli_get.php
描述:HTML 注入漏洞是指在用户输入的地方,输入 HTML 文本,被当作 GET 参数传到服务器,服务器以原始格式存储,未采用 HTML 编码,导致 HTML 的特性被浏览器解析执行。这种编码必须在服务器端存储参数的时候进行。
威胁程度:严重
POC:
1、在浏览器界面登录进去,然后选择 HTML INJECTION – REFLECTED GET。
2、在 First name 和 Last name 的文本框内输入 HTML 代码:
<marquee><h2>You just got hacked!!</h2></marquee> and <img src=”hacked.jpg”>
3、点击 Go,会得到如下效果。前提是 hacked.jpg 放在服务器端 /var/www/bWAPP 目录下。
4、结果显示 HTML 文本被嵌入到页面底部。
解决方案:
1、查看服务端响应处理表格参数的脚本如下 ( htmli_get.php ):
2、在服务端对表格参数进行检查并进行编码然后输出
3、设置安全等级为 high 后,在此测试,可以发现漏洞不复存在。
2.跨站脚本攻击( XSS )—— IFRAME 注入
影响范围:主站
URL:http://localhost/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=250&ParamHeight=250
描述:网页中包含 IFRAME 标签,并且暴露了 URL 中 IFRAME 的参数,导致网页中存在该漏洞。这使得攻击者可以利用 XSS 在流行网站中注入恶意网站连接。注入的内容可以从低危的广告到高危的键盘记录和恶意下载站点。
威胁程度:中危到高危
POC:
1、访问 URL:http://localhost/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=250&ParamHeight=250
2、IFRAME 源 URL 是 robots.txt,并且作为参数暴露在 URL 中。
3、用其他链接替换掉地址栏中的 ParamUrl,就会展现其他地址的页面。比如访问
解决方案:
1、查看服务端响应处理表格参数的脚本如下 ( iframei.php ):
2、通过抓包可以发现 IFRAME 标签中的 URL 被当作新的 http 请求头发起请求,通过如下的 header 函数发送 http 请求头:
3、在 IFRAME 标签中作如下图所示的修改就能避免该问题,直接指定参数为固定值,不会接收用户的输入作为参数,并且注销掉 header 函数那段代码,这就直接避免了这一问题。
3.系统命令注入
漏洞类型:注入
影响范围:主站
URL:http://192.168.102.134/bWAPP/commandi.php
描述:漏洞产生的原因是 shell 命令能够通过 ‘;’、’|’、’&&’ 这些符号串联起来执行,操作系统本身就支持这种操作。这种漏洞导致恶意 shell 命令可以被执行,比如后台监听某端口或者导致系统崩溃的 fork 炸弹。
威胁程度:高危
POC:
1、访问网址:http://192.168.102.134/bWAPP/commandi.php
2、发起正常的 DNS 请求,返回的结果如下:
3、在输入框中输入 ‘www.baidu.com;cat /eta/passwd’,得到如下内容:
4、从中可以看出返回了 shell 命令被执行,并且返回了相应的结果。从开发者的角度,明显不希望这样的 shell 命令被执行。
解决方案:
1、查看服务器端响应的脚本 ( commandi.php ):
2、进一步能够发现服务器在送去执行前未对接收到的输入内容进行检测:
3、修复这个漏洞,通过 escapeshellcmd 函数对特殊字符进行转义,把输入当作一个字符串直接导入 shell 函数,并且只当作单个安全的命令。该函数用来转义来自用户输入的针对 shell 函数的单个参数,shell 函数包括 exec()、system() 和反引号操作符。或者直接去掉输入中的 ‘;’、’|’、’&&’。
4.代码注入( PHP 代码注入)
漏洞类型:代码注入
影响范围:主站
URL:http://192.168.211.131/bWAPP/phpi.php
描述:代码注入是一种常见的攻击类型,主要是让应用程序识别为代码并执行。这类漏洞主要是由于未对不可信的输入输出数据进行检查所致。如果攻击者能够将代码注入应用程序并得到执行,那就仅仅是被PHP代码的能力限制,而未被应用程序限制。此例中,可以添加PHP代码在对URL的请求上,并得到执行。
威胁程度:严重
POC:
1、访问 URL:http://192.168.211.131/bWAPP/phpi.php
2、请求 URL 的页面允许添加参数,称为 message,这里未进行适当的检查,就可以被利用。
3、此例中,设置 message 参数为 message=a;$fp = fopen(“/etc/ucf.conf”,”r”);$result = fread($fp,1024); echo $result。
这将列出 /etc/ucf.conf 文件的内容。(根据实际情况来选择文件,有的文件为空,什么都没有,就会导致没有列出任何内容,避免踩坑)
解决方案:
1、查看后台服务器响应的脚本 ( phpi.php )。
2、message 参数通过 eval 函数的时候未对其内容进行任何检查,并且 eval 函数可以执行任意 PHP 代码。
3、为避免执行 message 中的内容,可以利用 htmlspecialchars 函数复写可能被当作代码执行的参数,并且移除 eval 函数,因为 eval 函数非常危险,能够执行任意代码。
4、最终,攻击者注入的代码不会被执行,这就修复了该漏洞。
5.SQL注入——GET/SEARCH AND GET/SELECT
漏洞类型:SQL 注入
影响范围:主站
描述:SQL 注入 ( SQLi ) 是一种注入攻击,恶意攻击者可以执行 SQL 语句以控制 web 应用的数据服务器。许多 SQL 语句可以用来测试是否修复了非预期的结果。
威胁程度:严重
POC:
1、访问 URL:http://192.168.211.131/bWAPP/sqli_1.php。
2、以下列出了几种 sql 注入的命令,可以获得非常有趣的结果。
解决方案:
1、查看后台响应脚本 ( sqli_1.php )。
2、漏洞产生的原因是在输入数据送入 mysql 查询之前没有进行检查。以下代码反应了没有做任何检查。
3、修复该漏洞需要对可解析的字符进行检测,比如引号、反斜杠等,避免这些字符被解析执行。PHP 中的 mysqli_real_escape_string 函数对特殊字符进行转义,利用该函数能够安全地进行 sql 查询。该函数预先考虑一下反斜杠字符:\x00 , \n , \r , \ ,’ , ” 和 \x1a。
4、升级到安全代码之后,可以发现不再存在 sql 注入漏洞,因此修复了该漏洞