一、XSS的形成原理
xss中文名“跨站脚本攻击”,
xss也是一种注入攻击,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器解析执行导致用户被攻击信息泄露。
常见危害:cookie窃取,session劫持,钓鱼攻击,蠕虫,ddos等
二、XSS的分类
1、反射型xss
反射型xss一般出现在URL参数中及网站搜索栏中,由于需要点击包含恶意代码的URL才可以触发,并且只能触发一次,所以也被称为“非持久性xss”
过程:攻击者在URL中插入xss代码,服务端将URL中的xss代码输出到页面上,攻击者将带有xss代码的url发送给用户,用户打开后受到xss攻击
在DVWA环境下练习
LOW源码:
漏洞分析与利用:
通过GET方式获取name值,且并未对name值进行处理,导致此处可以进行js脚本注入。
构造js脚本:
<script>alert(/反射型xss/)</script>
执行脚本
浏览器上观察执行后的url:
dvwa/vulnerabilities/xss_r/?name=<script>alert(%2F反射型xss%2F)<%2Fscript>#
可以看到页面的请求方式就是通过GET请求。
标签定义及使用说明
<script> 标签用于定义客户端脚本,比如 JavaScript。
<script> 元素既可包含脚本语句,也可以通过 "src" 属性指向外部脚本文件。
JavaScript 通常用于图像操作、表单验证以及动态内容更改。
medium源码:
漏洞分析与利用:
medium源码相对于low级别的源码,区别在于增加了str_replace函数,基于黑名单思想,将<script>替换成空字符,若按照之前的js脚本执行会不成功,这里可以多写入一个<script>,把中间的<script>标签替换为空之后 <scri 与pt>重新组合一个<script>,成功执行代码。
也可以利用大小写来绕过过滤,如<ScriPt>
或者可以构造别的标签 如<img src=0 οnerrοr=alter(/xss/)>(当src不成立时,触发onerror事件,执行alter(/xss/))
构造脚本:
<scri<script>pt>alert(/反射型xss/)</script>
执行脚本
str_replace() 函数:字符替换(区分大小写)
该函数区分大小写。 str_ireplace() 函数执行不区分大小写。
该函数是二进制安全的。
high源码:
漏洞分析与利用:
pre_replace函数执行一个正则表达式的搜索与替换。从<开始,匹配script字符以及穿插在script之间的各种字符组合(意思是只要有script这六个字符一起出现,可以不连续,都将匹配出来被替换成空字符),最后的i表示不区分大小写。这样按照上面的思路多写一个script无法绕过这个黑名单,<scrscriptipt>可以匹配出来。
此时,只能使用其他标签,如<img>.
构造脚本:
<img src=0 onerror=alert(/反射型xss/)>
执行脚本:
impossible源码:
漏洞分析与利用:
impossible级别的代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击。然后再用htmlspecialchars函数将name中的预定义字符转换成html实体。
源码使用htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
函数预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ' (单引号)成为 '
- < (小于)成为 <
- > (大于)成为 >
该函数会把输入的<script>,或<img>标签转换成实体直接输出,这样标签就无法发挥作用了。
impossible级别是安全代码,无法绕过。