DVWA-XSS
XSS概念:由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
XSS类型:
反射型XSS:只是简单地把用户输入的数据反射给浏览器,简单来说,黑客往往需要去诱使用户点击一个恶意链接,才能攻击成功。
存储型XSS:将用户输入的数据存储在服务器端,每次用户访问都会被执行js脚本。
DOM型XSS:文本对象模式xss,通过修改页面的DOM节点形成的XSS,可存储型、可反射型,只取决于输出地点。
XSS的应用场景:
1.利用xss获得cookie 2.重定向 3.钓鱼网站 4.DDOS
-----------------实验讲解-----------------
反射型XSS:
(一)将DVWA的级别设置为low
1.1查看源代码,可以看到没有对参数做任何防御处理措施,直接输出
1.2尝试一般的XSS攻击
click1 #点击click1时弹出xss3
(二)将DVWA的级别设置为medium
1.分析源码,可以看到使用str_replace函数只对参数进行了简单的替换,过滤
(三)将DVWA的级别设置为High
1.分析源码,可以看到,使用了preg_replace正则表达式 函数,对参数进行过滤,查看源码可以看到对
(四)将DVWA的级别设置为Impossible
1.分析源码,可以看到使用htmlspecialchars函数对参数进行html实体转义,此时就无法利用XSS漏洞了
存储型XSS:
(一)将DVWA的级别设置为low
1.分析源码,可以看到首先对两个参数使用trim函数过滤掉两边的空格,然后KaTeX parse error: Undefined control sequence: \” at position 70: …ipslashes函数过滤掉”\̲”̲,对name参数中使用mysql_real_escape_string函数转义SQL语句中的特殊字符
了解即可
2.从上面的代码可以看到,没有防御XSS漏洞,只防御了SQL注入漏洞
DOM—XSS:
DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
1 查看服务端代码,什么也没有
查看页面源代码
解释script代码
if (document.location.href.indexOf(“default=”) >= 0) #判断 “default=” 是否存在
var lang = document.location.href.substring(document.location.href.indexOf(“default=”)+8) # 取出 default 的值 并 赋值给变量lang document.write("" + decodeURI(lang) + “”); 写入"decodeURL(lang)
所以我们插入的 javascript 代码可以在 decodeURL(lang) 被执行 (了解即可)
构造攻击语句
http://127.0.0.1/dvwa-master/vulnerabilities/xss_d/?default=English
写入页面的效果是这样的
Medium
查看服务端源代码
array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。
由服务端代码 可知 Medium 级别过滤了
构造攻击语句
http://127.0.0.1/dvwa-master/vulnerabilities/xss_d/?default=English
写入页面的效果是这样的
首先闭合了标签 和 标签
利用 img标签的onerror事件
javascript,img标签支持onerror 事件,在加载图像的过程中如果发生了错误,就会触发onerror事件,从而执行 JavaScript
high
查看服务端源代码
白名单 只允许 传的 default值 为 French English German Spanish 其中一个
构造攻击语句
http://www.dvwa.com/vulnerabilities/xss_d/?default=English #
写入页面的效果是这样的
由于 form表单提交的数据想经过JS过滤,所以注释部分的javascript代码不会被传到服务器端(也就符合了白名单的要求)
我们写一个html 验证一下English #是否可行