dvwa-xss
XSS
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。
HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,
DOM
DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
LOW
我也很好奇注入点会在哪里?然后根据页面的设计点了一下
你会发现所做出的的选择会显示在url上
看看源代码
牛,没有防护
运行成功
MEDIUM
来看看源码
这里先检查了default参数是否为空,如果不为空则将default等于获取到的default值。这里还使用了stripos 用于检测default值中是否有 <script ,如果有的话,则将 default=English
stripos() 函数返回字符串在另一个字符串中第一次出现的位置。
如果没有找到该字符串,则返回 false。
如果区分大小写的话,算了试一下,无弹窗,返回了English
这里使用了<img scr=1 onerror=alert(‘hack’)>,没有回显,但是成功注入进了蓝色那行中,那么这里只要先将提前注入,即可将语句闭合,实现xss注入
HIGH
这里对default的内容,通过switch枚举进行判断
这里可以通过#进行注入
原理:在URL中#
表示的是一个锚点。在浏览器识别url的时候,会把#
后的字符当做页面的定位,然后加载页面的时候,直接定位到指定的标签。因此#
后面的字符是不会被浏览器发送到服务器端的。这样就实现了绕过服务器端的防御机制。而依赖DOM修改html结构执行的是js代码,这个执行过程是在客户浏览器端的,因此实现了不经过服务器就可以实现xss注入。
IMPOSSIBLE
防护都在客户端了
看了前端的代码感觉和前面挺像的
就拿之前的攻击代码试了一下
都进了框里
#也是不能使用的
与high的前端代码比较后发现
这里的lang
没有像之前一样经过decodeURL
解码。因此输入进去的数据都会经过url编码呈现到页面上。
REFLECTED
当用户在网站的地址栏输入URL,从服务器端获取到数据时,网站页面会根据返回的信息而呈现不同的返回页面,如果这个时候恶意用户在页面中输入的数据不经过验证且不经过超文本标记语言的编码就录入到脚本中,就会产生漏洞
LOW
我输什么就hello什么,那我直接放一段代码
1 |
|
看看源码
好家伙,这波是真的零防护
MEDIUM
拿之前的代码试了一下,发现回显中<script*>与</script*>都不见了
查看源代码
果然,这里过滤了<script*>那用
1 |
|
即可,
当然也可以大小写混写,
1 |
|
以及双写的方式进行绕过
1 |
|
HIGH
直接看源码吧
preg_replace() 函数用于正则表达式的搜索和替换,
.*具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。
这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
直接用
1 |
|
绕过即可
IMPOSSIBLE
anti-csrf 好久不见
同时,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。
STORED
存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,黑客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。这种类型的漏洞 可以使恶意用户将javascrip永久性的存储在数据库中。
LOW
看得出来,这里对name的输入进行了长度限制,那不如在message处注入,但是我这里试了多次之后
并没有回应(之后刷新后发现,均注入成功且出现弹窗),抓个包试试好了
我在name处改写了代码后,放包,出现弹窗,再加上之前在message处写的,所以弹出了两次
来看看源代码
1 |
|
相关函数介绍
trim(string,charlist)
函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。
mysql_real_escape_string(string,connection)
函数会对字符串中的特殊符号(\x00,\n,\r,\,’,”,\x1a)进行转义。
stripslashes(string)
函数删除字符串中的反斜杠。
可以看到,对输入并没有做XSS方面的过滤与检查,且存储在数据库中,因此这里存在明显的存储型XSS漏洞。
MEDIUM
上面为输入,底下为输出,你会发现<script*>被过滤了,尝试一下双写与大小写混合
无弹窗
无弹窗
最后显示如下
看了源代码,发现漏洞在name上,抓包进行注入即可成功
1 |
|
strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用标签。
addslashes() 函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤了<script*>字符串,仍然存在存储型的XSS。
HIGH
看完源码后发现,这里只对<script*>一系列进行防护,并没有对其余的尖括号有防护措施
1 |
|
即可成功
IMPOSSIBLE
看了源码发现均使用了htmlspecialchars函数,解决了XSSstored的问题。从网上了解,该函数若使用不当,依然存在绕过的机会。
参考链接:
https://baike.baidu.com/item/XSS%E6%94%BB%E5%87%BB/954065?fr=aladdin
https://www.cnblogs.com/yyxianren/p/11381304.html
https://blog.csdn.net/qq_36119192/article/details/82932557
https://www.freebuf.com/articles/web/123779.html
https://blog.csdn.net/weixin_44720762/article/details/89637370
- 本文作者:Almond
- 本文链接:http://example.com/2021/02/18/dvwa-xss/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!