XSS(Stored) - 存储型XSS
原理
存储型 XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方。
如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发执行代码,这种 XSS 比较危险,容易造成蠕虫,盗窃 cookie 等。
1. Low
Low 级别源码中相关函数介绍
trim(string, charlist)
函数移除字符串两侧的空白字符或其他预定义字符,可选参数 charlist 支持添加额外需要删除的字符,如果被省略,则移除以下所有字符
"\0"-NULL "\t"-制表符 "\n"-换行 "\x0B"-垂直制表符 "\r"-回车 " "-空格
mysql_real_escape_string(string, connection)
函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义
stripslashes(string)
删除字符串中的反斜杠
漏洞利用
Low 级别的代码对输入的 message 和name 没有做 XSS 方面的过滤与检查,且存储在数据库中,因此存在明显的存储型 XSS 漏洞
输入 1 和 <script>alert('xss')</script>
,代码成功执行
2. Medium
strip_tags():剥去字符串中的 HTML、XML、以及 PHP 的标签
addslashes():在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串
htmlspecialchars():把预定义的字符转换为 HTML 实体
Medium 级别的代码对 message 参数使用了 htmlspecialchars() 函数进行编码,因此无法通过 message 参数注入 XSS 代码,但是对于 name 参数,只是简单过滤了 <script>
,可以使用大写或者双写绕过
漏洞利用
- 大写绕过:抓包,将 name 参数值改为
<SCRIPT>alert('xss')</SCRIPT>
- 双写绕过:抓包,将 name 参数值改为
<sc<script>ript>alert('xss')</script>
3. High
High 级别的代码使用正则表达式过滤了 <script>
标签,但是却忽略了 img、iframe 等其他危险的标签,因此 name 参数依旧存在存储型 XSS
漏洞利用
抓包,将 name 参数值改为 <img src=1 one rror=alert('xss')>
,成功执行
防护方法
- HttpOnly 属性
- 输入检查,检查特殊字符,XSS 特征等
- 输出检查,对输出进行编码