存储型XSS也是XSS的一种,其他两种是反射型和DOM型。反射型和存储型的区别是:反射型只能作用一次,存储型在每次加载页面的时候都会触发。
用户需要在表单中输入标题和内容,之后输入的信息会在页面中显示出来,这种格式就像是贴吧、论坛、留言板的形式。
在有了反射型XSS的基础后,我们可以按照反射型XSS的思路分别对标题和内容两个输入框进行弹窗测试。
Payload:
<script>alert(/xss/)</script>
在标题中输入时发现长度有限制,可以在网页源代码下通过修改控制长度的参数就可以完成跳出前端字符长度的限制。按照如下的步骤定位到参数后,双击修改maxlength的参数。
![DVWA | 存储型XSS DVWA | 存储型XSS]()
继续尝试,发现弹窗了两次,证明标题和内容两个地方都可以进行XSS攻击。之后刷新页面发现也弹出两次窗口,这是因为在网页刷新的时候会加载我们刚才的内容,只要有用户进入到当前页面都可以触发。
切换到中级难度后要先重置数据库将low等级下存储的XSS语句删除掉。
更改标题的最大长度,输入payload后发现<script>标签被过滤了,与反射型XSS一样,尝试用双写、大小写、img标签等进行尝试。
Payload:
<scr<script>ipt>alert(/xss/)</script>
<sCRipt>alert('xss')</scRIpt>
<img src=1 onerror=alert(/xss/)>
发现用双写、大小写、img都可以在标题处触发xss,而内容处无法触发。
分析代码后发现标题处只是将<script>标签替换为空,很容易就可以绕过。内容处使用了strip_tags()函数、addslashes()函数以及htmlspecialchars()函数去对参数进行过滤,无法绕过进行XSS攻击。
![DVWA | 存储型XSS DVWA | 存储型XSS]()
函数解析:
addslashes():函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、 、NULL。
strip_tags():函数过滤字符串中的 HTML、XML 以及PHP的标签。
htmlspecialchars():把预定义的字符 < 、> 、& 、’ 、”转换为HTML 实体,防止浏览器将其作为HTML元素。
查看代码,发现服务器将中级难度下对内容进行严格过滤的方式改为对标题的过滤,而内容方面只用了正则匹配的方式过滤script标签,虽然避免了用双写和大小写绕过,但是可以使用img标签进行弹窗。
Payload:
<img src=1 onerror=alert(/xss/)>
![DVWA | 存储型XSS DVWA | 存储型XSS]()
使用了Anti-CSRFtoken防止CSRF攻击,使用了stripslashes()函数、预编译和htmlspecialchars()函数对标题和内容都进行了过滤,无法实现攻击。
![DVWA | 存储型XSS DVWA | 存储型XSS]()
原文始发于微信公众号(仙友道):DVWA | 存储型XSS
评论