首先选择难度,我们从low开始,如上图所示进行修改 

目录

SQL手工注入

过程:

low

Medium

high

Impossible 

 SQL 盲注

过程:

SQL 工具注入

工具安装过程:

过程: 

low

Medium

High:

暴力破解

过程:

Low

Medium

High

Impossible

命令注入

过程:

Low

Medium

High:

Impossible

文件上传

过程:

Low

Medium

High

Impossible

XSS漏洞

过程:

Low(反射型)

Medium

High 

Impossible

Low(存储型)

Medium

High

Impossible

Low(DOM型)

High

Impossible

文件包含漏洞

过程:

Low

Medium

High

Impossible

CSRF漏洞

过程:

Low

Medium

High

Impossible

 


SQL手工注入

解释(来自百度):SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击

过程:

low

首先在表单中输入1,如上图正常结果显示

输入2如上图正常显示 

查看源代码可知这一关对于表单输入ID没有进行任何过滤 

注入点判断,如上图可知受到单引号闭合影响 

为了方便我们直接把SQL语句中后续语句全部注释掉不执行,在判断语句后加#或者--+即可,全部注释掉就可以不用考虑单双引号闭合的问题

语句1’ or 1=1#可以查出所有ID内容(为什么,可以自己学习逻辑语句的知识) 

找出注入点以及符号问题,然后判断字段(就是正常查询时可以显示用户的几条信息),通过1’ and 1=1 order by 1# 

1’ and 1=1 order by 2# 

1’ and 1=1 order by 3#//如果2是正确的的,3返回错误那么就有2个字段,2即为分界点

找出字段之后(找字段的作用是为了后续报错,看会有几个位置可以报错)

之后结合union联合查询(union的知识学习SQL语句相关知识) 

有两种语句1’ union select 1,2#   -1’ union select 1,2#(至于有什么区别,个人参照上图,只是页面更简洁,目前我也是小白在我目前的学习进度看来这两条语句在后续操作上没有任何区别,可能会有没有被我发现吧,能记住那个用哪个)

走到这一步就可以进行内容信息查询了

把查询语句中2的位置换成你要查询到内容,那么在返回结果上就在你替换掉的数字的位置上即可显示该信息。

顺序首先是数据库名,表名,列名,之后是具体信息(如上图以及下图,如果自己还想查别的信息,可以再去搜索相关的资料)

语句是-1’ union select 1,table_name from information_schema.tables where table_schema=’dvwa’#(dvwa是根据上一个图查出来的数据库名字)

也可以用group_concat把表名拼接起来 -1’ union select 1, group_concat(table_name) from information_schema.tables where table_schema=’dvwa’#

知识点:1.在MYSQL5.0以上版本中存在自带数据库information_schema,他是一个存储所有数据库名,表明,列名的数据库,相当于可以通过查询此库获得相应信息。(没有的话只能靠猜,暴力破解)

2.符号“.”代表下一级: Information_schema.tables:

Information_schema.columns:

查完表名,查列名,语句是-1’ union select  1, group_concat(column_names) from information_schema.columns where table_name=’users’# 

查完列名就可以查自己想查的东西了。

语句是:-1’ union select group_concat(user_id,first_name),group_concat(user,password) from users#

上图就是数据库表中信息了,密码是通过MD5加密,在网上搜索MD5解密工具线上解密就可以了。

一个简单的SQL手工注入就完成了

Medium

下面增加丢丢难度

首先是修改关卡

修改好了之后再次点开SQL注入,有人可能会出现如下图所示的错误(这个有人就是本人,但有的人很幸运没有,别怕,这都是小问题,只是因为你的PHP版本不对,那么怎么修改呢,我没有截图简单告诉你,打开PHPstudy你自然就会,修改完成后就可以打开了) 

正确的界面如下图所示 点开之后是不是吓到了,跟上一关不一样了不是提交表单了,那么我们的注入点怎么找,别慌,这时候就需要那个很牛的工具burpsuite,至于安装什么的,我的一个笔记里写过,你也可以找其他大佬写的文章来解决你的问题,安装完成后,就需要把burp和DVWA连接起来,首先你需要往浏览器导入一个东西(是你运行DVWA的浏览器),然后你需要打开burp,导入证书,设置代理很多东西,这些都设置完成以后很多人如果用127.0.0.1或者localhost这个地址登录的可能会出现依旧抓不到包的情况(因为我就是)这个时候就需要你把地址改成你自己的IP地址(莫?有人会不知道IP地址怎么查吗,那就是网络基础没学好,乖乖去找度娘吧)一切准备就绪,burp成功抓包

数据包中的内容想必大家也不陌生了,如果看不懂那么请你去认真学习HTTP,在数据包中会找到我们提交的ID,这里的ID的位置就是我们可以利用的注入位置,之后的步骤就跟上面一模一样,以下就是简单的演示。 

有人会在这一步可能会遇到这个问题,那么查看源代码会发现了一个转移函数,这个经典的函数想必大家略有耳闻,那么采用十六进制等绕过,把需要用到单双引号的词,用十六进制(在网上查)

 以上,就是中级SQL手工注入的全部步骤。

high

学到这儿了,相比对注入语句已经很熟悉了,那么我们开始下一关。

同之前一样,修改,进入。

跳转界面,在另一个界面输入注入语句。 

我们同样能查到内容,查看源代码会发现有limit限制只能输出一条,我们在这里用#注释掉后续内容,那么这一关的意义到底何在,主要是为了防止SQLmap注入,至于SQLmap的使用后续再说明。

Impossible 

分析源代码

可以看到,Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。

参考内容:新手指南:DVWA-1.9全级别教程之SQL Injection - linuxsec - 博客园

 SQL 盲注

与一般注入的区别是,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高,目前网络上现存的SQL注入漏洞大多是SQL盲注。

基于布尔的盲注(怎么方便的理解这个概念呢,就是他只会告诉你是或不是,比如你猜版本是什么他只会告诉你是或不是这个版本),基于时间的盲注以及基于报错的盲注,在此只演示前两个。

过程:

(过程怎么说呢,只说明一下思路因为主要是猜,然后具体名字就是无数遍的二分法等算法猜)

一开始的步骤肯定驾轻就熟,直接开讲。思路上面已经很清楚了,那么首先先确定是字符型还是数字型注入。

如果不明白怎么去判断请参考:https://blog.csdn.net/qq_44798520/article/details/122453649

从上面看即使添加错误的逻辑语句仍然是正确的返回,那么开始猜解字符型。(至于怎么猜,把引号一个位置一个位置的放,总能猜出来)

以上就可以确定它是字符型。

确定完注入类型,就要开始猜解数据库名字

语句是1’ and length(database())=1#   

1’ and length(database())=2#   

1’ and length(database())=3#   

1’ and length(database())=4#  可以知道数据库名的长度是4,之前我们知道数据库名字是“dvwa”,所以长度是4(不要问为什么我知道,因为手工注入那一关就知道了,这里只是验证一下)

知道了长度,就得准备猜名字了,最麻烦的部分来了。

语句:1’ and ascii(substr(database(),1,1)>97#

那么上面这个句子什么意思,就是为了猜数据库名字,ASCII码想必大家都不陌生,不清楚的同学可以去查度娘,一句一句试。好了剩下的步骤想必大家也都明白了,盲注就是靠试。

上面讲述的是基于布尔的盲注,接下来简单说一下基于时间的盲注(同样是小白,造诣也不高)

结果不会延迟,说明不是数字型 

结果延迟五秒说明是字符型

接下来几个难度跟之前都是一样的,在此就不再说明(因为是真的懒,要猜的话得很久)

后面利用工具,没错就是著名的sqlmap工具给大家进行说明。

SQL 工具注入

工具安装过程:

接下来只给大家说过程,至于概念什么的直接百度吧。

没错接下来就是给大家介绍著名的注入工具sqlmap

首先,就开始安装这个工具

sqlmap使用python2编写的工具,所以大家先去官网下载python2 Welcome to Python.org

然后下载sqlmap 官网地址sqlmap: automatic SQL injection and database takeover tool

在此要注意,sqlmap要下载到python下面

下载完成,开始配置环境变量。首先要看清楚自己的安装地址。

此电脑->属性->高级系统设置->环境变量->Path

在Path里面添加如下两条语句。确定之后,至此全部配置完成,打开命令窗口,输入python查看信息

出现如图所示,证明你的安装没有问题。然后查看sqlmap的安装是否成功,首先语句进入sqlmap底下,如下图所示。

然后输入python sqlmap.py --version查看sqlmap的安装情况(在此提醒一下大家直接输入python就行,不用添加版本号,因为一开始我就是后面添加了版本号结果一直不对,我也不知道为什么查了好久,才解决了这个问题,当然本身没有这个问题最好),如下图所示,证明sqlmap安装成功。在此就可以开始利用工具进行注入,后面我们依然利用DVWA之前那个手工注入那一关作为实验环境。

过程: 

sqlmap相关命令的概念直接查百度,在这里直接引用

low

跟之前一样该打开什么打开什么,进入low

输入1之后,打开burpsuite抓包,或者直接打开浏览器开发者工具查看数据包情况。

抓包之后,输入python sqlmap.py -u “(url地址)”如图所示 

但最后出现了302重定向会返回登录页面,证明这个页面需要cookie,那么我们接下来就复制数据包中的cookie

在后面用 --cookie” ” 

输入成功之后,会出现下图所示

他会问你很多东西,可以直接在上面的语句后面再加一个 --batch默认回答,直接显示结果。

在上面这个图上面我们可以看到注入点的相关信息。

继续添加我们想知道的信息,比如可以查看数据库相关信息,添加语句--dbs(如上图所示,查看所有数据库名称)

继续添加--current-db即可查看该数据库名称(如上图所示)

继续添加命令 -D dvwa --tables(列出dvwa数据库中全部表名)

修改命令-D dvwa -T users --columns(如上图所示,列出user表中字段信息)

修改命令-D dvwa -T users -C user,password,user_id --dump(一般数据库中的信息都会加密,这个命令可以直接显示解密后的情况,并且会自动保存到本地)

结果如上图所示,显然已经达到了我们的目的。

Medium

接下来进入下一个级别

抓包结果如上图所示

之前手动注入,我们可以直接在这个里面添加语句进行注入,那么这块该怎么办呢。

我们把数据包复制,创建成一个文件,记住,记住,记住,千万记住(重要的事情说好几遍)一定要把这个文件放在sqlmap下面,不要问我为什么,因为新建文件的原理就是让工具读取文件,你已经进入sqlmap里面了,所以为了方便你当然得把文件建在sqlmap里面啊。

输入语句python.py -r 1.txt --batch(-r 就是读文件)

结果如上图所示,那么之后的步骤就跟之前一样一样的了。

High:

第三关跟之前的主要区别在于,是跨页面,同样抓包

抓包之后该怎么办呢,当然是把两个页面连接起来,输入命令-second-url“”后面这个地址是第一个页面的地址(前面的文件记得改成新抓的包)。

之后的命令也是跟之前是一样的。 

最后的结果如上图所示,在这里给大家说一下那个详细用户信息解密后自动下载到本地,上图打个地址根据自己的地址查找,是一个excel文件。

上面就是全部工具注入的步骤,大功告成。

暴力破解

什么是暴力破解(来自百度)暴力破解或称为穷举法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围

过程:

Low

在表单内,随便填上东西,然后抓包,如上图所示。

然后发送到intruder。

需要哪个,选中哪个。

这个字典里面就是一些经常可能用到的弱口令(这个字典仅针对于这个关卡)

导入字典以后,对于数据很多的,我们可以考虑增加进程,如下图所示,把进程修改为10。

然后开始攻击。

如图我们可以看到攻击完成,那么怎么确定哪一个是正确的用户名密码,纵观全局我们会发现有一个特殊的长度数字,没错就是这个,那么在此我们便找出了我们所需要的东西,发送验证一下。

如上图所示,这一步骤全部完成。

至于attack type是什么个意思,接下来告诉你。

Attack type:攻击模式设置

Sniper:对变量一次进行破解,多个标记依次进行。(俗话简单来说就是,用户名和密码用的是一套字典,破解的时候也只是导入一个字典,但是它会根据先破解用户名,破解出来以后急需破解密码这样的顺序,对于简单的用户名密码字典数目少的可以考虑)

Battering ram:对变量同时进行破解,多个标记同时进行。(这个也是只有一个字典但区别是,可以同时进行,就是先破解用户名破解完了继续破解密码,相比遇上一个速度更快)

Pitchfork:每一个变量标记对应一个字典,取每个字典的对应项。(这个意思就是,每个变量一个字典,破解的时候每个字典的一号对应另一个字典的一号进行破解,这样破解对于那些一一对应的用户名密码来说速度很快,但很明显我们没办法准确的定位用户名和密码,显然不适用于每个情况)

Cluster bomb:每个变量对应一个字典,并且进行交际破解,尝试各种组合,适合于用户名加密码破解。(这种情况就是普罗大众很容易明白理解的情况就是多个字典进行笛卡尔积,依次破解,这种就会有多种组合,时间上也是一个问题,当然对于需要用时很长的,我们可以添加进程,用来适量缩短时间)

选择好攻击模式之后,开始导入字典,burp本身会携带字典,但更多的时候是利用我们自己找的字典进行爆破。

Medium

中级跟low级别基本一致,分析源代码我们发现medium采用了符号转义,一定程度上防止了sql注入,采用暴力破解也可以完成,在此不过多描述。

High

这一关与之前的区别主要在于token

(解释来自于百度) Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

接下来我们开始闯关,首先进行抓包。

   

抓包之后,发送到intruder.

在这里我们要爆破的内容是密码和token,选中,设置攻击模式。

线程设置为一

在grep-extract中点击add,选择refetch response

记住token的值简单来说就是复制,后面要用。

然后开始设置负载,对于第一个参数就是密码,我们采用字典爆破,导入字典。(如上图)

第二个参数是token如下图进行设置,在payload option中粘贴token的值

全部设置完成,开始进行爆破。如下图所示,找出不同数字即为最终结果。

在render中测试结果,表示爆破成功,进入,至此完成。

Impossible

  分析源代码

 可以看到,impossible级别在 high 的基础上对用户的登录次数有所限制,当用户登录失败达到3次,将会锁住账号15秒,同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这里因为不能使用PDO扩展本身执行任何数据库操作,而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令。

参考内容:DVWA通过教程之暴力破解Brute Force_红烧兔纸的博客-CSDN博客

命令注入

什么是命令注入:

命令注入就是在需要输入数据的地方输入了恶意代码,而且系统并没有对其进行过滤或者其他处理导致恶意代码也被执行,最终导致数据泄露或者正常数据被破坏。

常用到的命令:(总结来说就是系统操作命令DOS命令都可以在此执行试试)

ipconfig,net user(查看系统用户),dir(查看当前目录),find(查找包含指定字符的行),whoami(查看系统当前有效用户名)A&B(简单的拼接,AB之间无制约关系),A&&B(A执行成功才会执行B),A|B(A的输出作为B的输入),A||B(A执行失败,然后才会执行B)

过程:

Low

首先跟往常一样把要打开的打开。

输入127.0.0.1进行测试,类似于ping命令。

哦莫,出现了乱码,这个时候不要慌,该吃吃该喝喝遇事别往心里搁,听我下面给你说。

找到DVWA中如上所对应的文件,打开,然后把编码形式进行修改,意思就是把utf-8改为gb2312,方便一点直接编辑,替换,记住utf-8是小写,不然找不出来。

改完记得保存,然后再次输入进行测试。

OK,看上图,乱码解决了。

接下来继续下一步,输入自己想知道的信息的命令,试一下子。

查ip(如上图) 查用户(如上),结果在下图。

查看系统信息

结果如下图所示 

查看目录

结果如上图,OK以上就是一些简单的命令注入,接下来进入下一关,看看有啥不一样的吧。

Medium

首先修改难度,分析源代码

我们发现在这一关进行了一些简单的转义,但是我们在一开始不是告诉大家那么多语句,可以一个一个试一试,总会有办法的。

分析源代码,我们发现对&&进行了转义,那么在这块这个符号就不能再用了。哎!没有双引号我们有单引号啊。(简单来说就是用一个符号把命令连起来就行了,那多试试不就可以了吗,要记住黑名单总是有办法的) 

另一种办法,我们可以采用;把两个&符号分开,这样不也能绕过吗,看下面。 

medium只是简单的对一些符号进行了转义。

High:

首先打开源代码分析,哦呦,这么多符号被转移了怎么办,别急别慌。

就像我上面说过的,总会有办法的,上面的被转义的符号你真的看清楚了吗,哪些之间有空格,哪些没有你确定自己看清楚了吗,我这不,又找出了问题,好了,剩下的自己去试试吧。

Impossible

最后一关了,每每到这一关是不是心情大好,因为这一关就是告诉你怎么防御这些漏洞的。

查看源代码我们发现了问题,是什么呢,没错IP地址被限制了,就是只能输入IP地址那样的格式,不能再加入东西了,同时也设置了token,至于token是什么,就劳烦大家去百度吧,因为我说出来的也是在网上找的,去找找自己更容易理解的解释吧。

至此,关于命令注入的就全部结束了,DVWA上面确实很简单,各位大佬们可以试试别的实验环境。

文件上传

什么是文件上传漏洞:

大部分的网站和应用都有上传功能,如用户头像上传,图片,logo,文档等。一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者像某个可通过web访问的目录上传任意php文件,并能够将这些文件传递给php解释器,就可以在远程服务器上执行任意php脚本。

当系统存在文件上传漏洞同时攻击者可以将病毒,木马,webshell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。根据具体漏洞的差异,此处上传的脚本可以使正常后缀的php,asp以及jsp脚本,也可以是篡改后缀后的这几类脚本。

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

造成文件上传漏洞的原因及原理

原因:

1 对于上传文件的后缀名(扩展名)没有做较为严格的限制

2 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查

3 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)

4 对于web server对于上传文件或者指定目录的行为没有做限制

原理:

在 WEB 中进行文件上传的原理是通过将表单设为 multipart/form-data,同时加入文件域,而后通过 HTTP 协议将文件内容发送到服务器,服务器端读取这个分段 (multipart) 的数据信息,并将其中的文件内容提取出来并保存的。通常,在进行文件保存的时候,服务器端会读取文件的原始文件名,并从这个原始文件名中得出文件的扩展名,而后随机为文件起一个文件名 ( 为了防止重复 ),并且加上原始文件的扩展名来保存到服务器上。

文件上传可能带来的安全问题:

-上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行;

-上传文件是flash的策略文件crossdomiain.xml,黑客用以控制flash在该域下的行为;

-上传文件是病毒、木马,黑客用以诱骗用户或者管理员下载执行;

-上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。

参考内容:文件上传漏洞小总结_whoim_i的博客-CSDN博客_什么是文件上传漏洞

过程:

Low

打开,修改级别,打开文件上传,开始闯关。

随便上传一个文件,我们发现图片PNG格式是可以的,继续,PHP格式呢。 

不得了,竟然可以成功上传PHP格式,在这里不言而喻文件上传漏洞就是这么简单被大家发现了。我们可以通过构造一句话木马直接上传文件,来查到很多东西。 

如上图,我们简单的构造了一句话木马,把文件上传,上传成功之后。 

如图,我们轻易就查到了,我们想查的东西。

Medium

然后进入下一关

我们发现这一关对文件格式进行了限制。

那么我们就把我们的文档后缀修改一下,上传成功了,可是要执行里面的代码就需要触发PHP代码解释器,这时候我们需要考虑如何再上传之后再把后缀名改回来。

引出我们的武器burpsuite

点击上传进行抓包。

抓到数据包,发送给repeater 

在这里我们直接修改,数据包中的文件后缀名,把它再改回来。然后验证一下,如下图。

成功上传php文件,接下来进行验证,如下图,验证成功,之后跟上面是一样的,加入一些我们想查询的信息的命令即可。 

High

这一关一开始按照格式上传文件,但是有的小可爱发现失败了。

哦?怎么回事,别急别急,那是因为这一关不仅对格式有限制在你知道的情况下,它对文件大小也进行了限制,换一个小一点的文件试试。

叮咚,上传成功了。但这个时候,我们会发现如果只是简单的把一句话木马的文件后缀进行修改后仍旧无法上传,那是因为对文件头进行限制,所以简单的修改后缀已经无法满足了。接下来需要用到的是图片马,什么意思,就是把你的一句话木马文件的内容复制到图片上面,通过上传图片,把一句话木马传进去。

 

首先需要把命令版打开,敲重点,是以管理员身份打开,然后进入文件和图片存放的目录下,最好放在一个路径下面。

然后输入命令:copy 666.png /b + 1.txt /a 888.png(//666是图片,1.txt是一句话木马所在的文件,888是复制完成之后的图片命名)

之后把图片进行上传,以此成功上传,那么怎么来利用呢,这个就需要进入后面讲到的文件包含漏洞,在这里简单示范一下步骤。

进入文件包含low级别,然后复制上传的文件的地址(记住是上传之后的,不是之前的,也就是说是保存在DVWA文件夹中的) 

如上图找到文件上传后的路径, 

然后,将地址以上述地址栏中的方式进行复制。

Impossible

分析源代码

我们发现,对文件内容进行了严格地检查,对文件进行重命名,文件大小后缀都进行了限制,同时加入token。

XSS漏洞

什么是xss漏洞

XSS又叫CSS,跨站脚本攻击。它指的是恶意攻击者往web页面插入恶意的html代码。当用户浏览该页面时,嵌入到web里面的html代码会被运行,从而达到恶意攻击用户的特殊目的。(也是一种注入漏洞)

分类:(参考内容:跨站脚本漏洞(XSS)基础讲解 - 简书

·  反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

·  存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

·  DOM型(在网页上,组织页面的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM,可能是存储型,也可能是反射型)XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。

与前两者的主要区别是DOM型没有与后台服务器进行交互,而是前端DOM树解析产生的。

XSS漏洞可能带来的安全问题:

(1)窃取管理员帐号或Cookie,入侵者可以冒充管理员的身份登录后台。使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。

(2)窃取用户的个人信息或者登录帐号,对网站的用户安全产生巨大的威胁。例如冒充用户身份进行各种操作。

(3)网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。

(4)发送广告或者垃圾信息。攻击者可以利用XSS漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用。

参考内容:XSS漏洞分类及危害_lay_loge的博客-CSDN博客_xss的危害

过程:

Low(反射型)

随便输入一个东西,看看页面显示的内容,如上图。 

分析源代码,没有做任何限制。 

然后在输入框中输入payload:<script>alert(/xss/)</script>//这是javascript语句,大家可以自行学习,前端表单的执行语句是javascript。 

如上图,弹出弹框。 

<script>alert(document.cookie)</script> 

通过上述语句,成功爆出cookie。(也可以构造别的语句,得到想知道的信息,在此不多做演示)

Medium

查看源代码发现<script>标签被限制了,被替换了。

那么我们就想办法绕过它。

Payload:<scr<script>ipt>alert(1)</script>

也可以通过大小写绕过

Payload:<SCript>alert(1)</script>

High 

查看源代码,发现了更严格的过滤,此时script标签已经没法再用了,那么我们使用别的标签也可以达到我们的目的。

Payload:

<iframe src=”网址”name=”iframe_a”width=”1500px”height=”900px”></iframe>

Payload:

<img src=1 οnerrοr=alert(/xss/)>

通过上述执行我们会发现,每次注入payload是一次性的,关闭页面再次进入我们会发现不会再执行,这与后面的存储型xss最大的区别。

Impossible

分析源代码

可以看到,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,防止浏览器将其作为HTML元素

Low(存储型)

我们输入payload发现居然有长度限制,那么我们就把长度改了呗。 

选择开发者工具,检查源代码,只好到对应的语句,修改长度限制。 

成功输入语句。 

执行成功。

也可以通过burpsuite抓包进行修改。

对name的值那个修改(这里肯定会有人问为什么是name,因为message里面的东西是要存储的解析器并不会解析message里面的内容,而是要解析name里面的内容便于查询,类似于标识符的概念,用户进行后续操作时都是对name以name为唯一识别进行操作)//以上只是我个人对于这个问题的理解,只是便于理解(也不知道有没有写清楚,如果不懂的同学可以去查询其他的资料) 

好了,废话不多说我们进行下面的操作,修改之后我们forward数据包。

返回界面会发现已经执行成功了。

后续,再给大家说明一个问题,当我们再次输入另一个payload,在执行过程中有的同学会有疑问,为什么一直是1,这就跟我在上一节反射型最后一句说到的问题有关,因为是存储型的而且你的操作会和后端服务器端进行交互,那么之前的已经存储进来了,点击以后弹窗一直显示一,这个时候不要慌,当它执行完毕后,会执行下一条payload。 

在这个里面我把payload修改成了<script>alert(/xss/)</script> 

在弹出好几次1之后,会弹出xss。 

从上面结果中我们会发现,存储型xss之前输入的payload依旧还在。

Medium

这一级别与反射型xss的中级是一样的通过大小写或者双写,只不过是修改数据包。

High

这一级别与反射型xss的高级是一样的通过修改标签,只不过是修改数据包。

Impossible

分析源代码

可以看到,这次impossible在high级别的基础上对name参数也进行了更严格的过滤,导致name参数也无法进行XSS攻击。而且使用了Anti-CSRF token防止CSRF攻击,完全杜绝了XSS漏洞和CSRF漏洞。

Low(DOM型)

分析源代码

DOM xss low 服务器端没有任何php代码,执行命令的只有客户端的js代码 

我们在复选框中选择English,在上面的url地址栏中,我们会发现出现了english

然后顺势我们可以修改

通过上图,我们成功了。

Medium

我们发现在这个里面再一次对<script>标签进行了替换,我们接下来检查前端html语句。 

value的值是从这个个当中选出来的,那么我们可以通过构造闭合来执行我们的语句。

把english替换成></option></select><img src=1 οnerrοr=alert(/xss)>

那么这个语句是怎么闭合的呢

学过html语言的我们都知道<option></select>都是双标签,也就是说会识别两个标签之间的语句,那么我们就人为把它闭合起来,在执行过程中,一旦存在一对标签,那么就会执行这里面的语句,无法构成成对标签的不会执行里面的语句,而<img>是单标签,也就是说他要执行的语句涵盖在它里面。

通过构造闭合,我们成功执行xss。

High

首先查看源代码

哦莫,出现了白名单,之前我们提到过白名单是相对比较安全的,因为只有在白名单中的才是合法的,才会被执行,那么我们没有办法了吗,答案是漏。 

在这里,我们同样是构造闭合,但这个闭合和之前的可不太一样。

我们在english后面加了注释符,很多人问了注释符不就代表后面的语句不会执行了吗,那闭合又有什么用呢。

哎,这就是DOM与其他的最大的区别了因为DOM是不会和后端的服务期进行交互的,它只是利用DOM解析树,而DOM解析树依旧会解析注释符后面的语句,只要解析了就可以成功执行。

在这里要注意的是,输入语句后,很多同学会疑惑为什么没反应,别慌,你没有错,这个时候你只需要刷新一下就好了。(但如果刷新不行,可能真的是你的语句有问题)

Impossible

人家都告诉你了,服务器端啥也没有,关键在客户端。

那么客户端一般如何防御呢,那就是编码绕过。

这里对我们输入的参数(lang)并没有进行URL解码,而在其他级别中是有解码过程的decodeURI(lang)。所以我们输入的任何参数都是经过URL编码,然后直接赋值给option标签。

文件包含漏洞

什么是文件包含漏洞:

简单的来说就是服务器通过php的特性(函数的特性)去包含任意文件时,由于对包含的这个文件来源过滤不严,从而可去包含一个恶意的文件,而我们构造的这个恶意的文件来达到“邪恶”的目的(比如读取服务器的敏感文件等)

包括:本地文件包含和远程文件包含

原因:如果允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露。

函数:allow_url_fopen,allow_url_include开启(在phpstudy->其他选项菜单->php扩展及设置->参数设置,在这个里面可以打开与关闭函数)

过程:

Low

首先打开页面,然后查看源代码

我们发现它没有做任何过滤,通过get方式提交,然后在地址栏的位置输入一个地址 

如上图,错误提示。

然后上传一个本地文件地址。

将上述地址添加到地址栏中。 

如上图所示成功利用文件包含漏洞。

Medium

查看源代码,我们发现在这一级别对地址进行了过滤。

对于http的替换我们可以采用双写或者大小写绕过,而下面的斜杠主要是针对相对路径文件存储路径,但如果我们采用绝对路径上述过滤液可以成功绕过。(上一级别采用地址修改时,给大家演示的就是绝对路径,在这里就不在赘述)

如上图,我们采用双写成功绕过。

High

查看源代码,采用file类型地址,那么我们就把我们要输入的地址进行修改。 

如上图所示,成功利用漏洞。

Impossible

查看源代码,发现采用了白名单过滤,规定了传入的文件只能是这几个,那么就杜绝了文件包含漏洞。

CSRF漏洞

什么是CSRF漏洞:

csrf跨站请求伪造:是一种对网站的恶意利用。尽管听起来像跨站脚本,但它与xss非常不同,xss利用站点内受信任用户,而csrf则通过伪造来自受信任用户的请求来利用受信任的网站,与xss攻击相比,csrf则通过伪装来自受信任用户的请求来利用受信任的网站。与xss攻击相比,csrf攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比xss更具危险性。

本质来说就是在你访问网站信息的同时,盗用你的cookie,用你的身份进行一些非法操作。

危害

攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做到的事情包括:以你的名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全

过程:

Low

首先进入初级页面我们知道这是一个修改密码的,当我们输入密码进行修改后,提示修改成功后,我们会发现这也是一个get型提交。

那我们就试试直接在地址栏中修改内容,看能否执行成功。(修改内容后,我们复制链接重新打开一个界面,然后输入网址进入页面,出现下图,要注意的是我们必须使用同一个浏览器,因为在访问页面时通常存在cookie认证,否则即使点击了恶意链接也没用。) 

原密码失效。 

如上图所示,执行成功。

那么如何验证我们修改了呢,这时我们可以采用暴力破解模块。(如上图所示,成功利用了漏洞)

而在真实地攻击环境中,我们通常是给受害者发送一个链接,而在正常的情况下我们通常不会点击一个很长的看起来就不正常的链接,这个时候我们就需要好好学习社会工程学,学会利用人们的心理来达到我们的目的,诱使他们点击我们构造的链接通常情况下会把长链接构造成一个短链接,这个时候我们可以利用网上很多在线工具)

比如:站长工具:短链接生成器(就会自动帮我们生成一个短链接)

我们可以选择其中一个短连接发送给受害者,诱使他点击此链接即可。

 

我们可以通过构造一个页面。

修改密码的链接重定向到一个自己写的一个错误页面,用户点击之后以为出错了,实际已经执行了恶意代码。

点击进入链接,出现上图错误页面,但其实已经执行了语句。 

如上图所示验证成功。

输入我们修改后的密码,证明我们已经成功把密码修改了。

Medium

进入下一关,我们用上一关界面试一下,发现错误。

对比数据包

我们发现一个有referer,一个没有。这时候查看源代码

原来是对referer做了限制,那么我们把地址栏抓到的数据包发送给重发器,把在页面数据包中的referer复制过来,然后查看结果。 

如上图所示,成功修改。

High

在这一关,我们输入相关内容是发现地址带入了token,这个时候我们需要借助上一关的存储型xss来爆出token

我们首先进入存储型xss HIGH级别

<iframe src="../csrf/" οnlοad="alert(frames[0].document.getElementsByName('user_token')[0].value)"></iframe>

成功弹出token注意千万不要点击确定否则会被更新,点击确定之后新开启一个会话,token也会随之更新,我们把token加入到我们写的错误页面中地址栏的后面,诱使用户点击即可成功利用该漏洞。

注意:将low级别中的那个自己写的网页的名字改成对应的IP地址,例如192.168.179.79.html

放在攻击者服务器里,这样也可以绕过。

网页取名为ip地址是为了通过referer的验证,过滤规则是http包头的referer参数的值中必须与host相同

csrf的检测,抓取一个数据包如果去掉referer之后还有效,则可以确定存在csrf漏洞

防御:token,自定义http头

Impossible

可以看到,Impossible级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。 

以上内容是一些常见的DVWA漏洞的利用以及防御等,后续一些漏洞关卡会继续更新。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐