什么是跨站脚本攻击

跨站脚本( Cross-site Scripting ) 攻击,攻击者通过网站注入点注入客户端可执行解析的payload(脚本代码),当用户访问网页时,恶意payload自动加载并执行,以达到攻击者目的(窃取cookie、恶意传播、钓鱼欺骗等)。为了避免与HTML语言中的CSS相混滑,通常称它为“XSS”

危害

获取用户信息:(如浏览器信息、ip地址、cookie信息等 )
钓鱼:(利用xss漏洞构造出一个登录框,骗取用户账户密码,提示登录过期,模拟一个网站的登录框,将用户名、密码发送到攻击者服务器
注入木马或广告链接:有些在主站注入非法网站的链接,对公司的声誉有一定的影响后台增删改网站数据等操作:配合CSRF漏洞,骗取用户点击,利用s模拟浏览器发包
xss蠕虫:
微博蠕虫:只要看过某人的微博就是自动关注某人
贴吧蠕虫:看过某个帖子就是自动回复这个帖子

漏洞类型及利用场景

1.反射性XSS 可用于钓鱼、引流、配合其他漏洞如CSRF等
2.存储型XSS 攻击范围广,流量传播大。可配合其他漏洞
3.DOM型XSS 配合、长度大小不受限制。

反射性XSS

特点:仅执行一次,非持久型;参数型跨站脚本
主要存在于攻击者将恶意脚本附加到ur的参数中,发送给受害者,服务端未经严格过滤处理
而输出在用户浏览器中,导致浏览器执行代码数据。

反射性XSS利用场景

见框就插,改url参数

我们测试一下DVWA的low等级
我们输入hello 他返回hello
我们测试h1 hello 是否会变成一级标签 可以成功
我们就可以利用script 的alert 警示框 也可以成功



array_key_exists判断这个数值里面有没有这个name的值和这个name值是否不为空 他会输出这个name的值 他没有进行这个进行过滤 过滤一般分替换大小写和替换特殊符


设置为Medium等级
我们通过看源代码发现他只是把script替换成空白 没有进行大小写区分
我们可以通过写SCRIPT全部大写来绕过




我们等级设置为high
当我们输入hello 正常运行
当我们输入h1 一级标签他变大了
当我们输入script 他直接变成了alert(1)
我们通过看源代码发现他做了一个script替换成空白
那我们第一种写在sciprt标签中不可用 第二种写在scr指定的文件也不可用 那我们可以用某个事件处理器img src=1 οnerrοr=alert(1) 发现可以成功 说明我们的思路是对的
这个思路就是 我们让他去找一个为1的文件 这个事件有个是路径不存在他会报一个错叫onerror 我们可以写script的代码




我们设置为impossible
我们看源代码发现他使用了htmlspecialchars 这个函数的意思是吧预定义的字符 & 这些转换为HTML实体 防止浏览器将其作为HTML的元素

反射性XSS利用场景

首先没有对onclick进行过滤 %20是空格
我们分析到mann后面的“闭合前面的value 后面的”闭合后面的“ 使得onlick单独出来

在搜索框加/” 闭合前面标签 这个123是不存在的 他会执行onerror这个后面代码 eval是把后面的执行代码进行执行

存储型XSS

特点: 持久型
主要存在于攻击者将恶意脚本存储到服务器数据库中,当用户访问包含恶意相关数据的页面
时,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。

存储型XSS利用场景


我们设置low等级
可以看到没有做任何的过滤
我们输入正常的值、h1的值和script的值


我们设置为Medium
srtip_tag(string,allow)函数去除字符串中HTML、XML以及PHP的标签
addslashes(string)返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串
这个htmlspecialchars函数我之前说过了 他会把特殊字符变成实体
下面还有一个替换将script替换成空 这个str_replace是不区别大小写的
但是我们可以看到又两个输入框一个是name一个是Message
我们对name的长度进行修改然后把script写进去


设置为high
srtip_tag(string,allow)函数去除字符串中HTML、XML以及PHP的标签
htmlspecialchars函数把特殊字符变成实体
preg_replace替换空白不区分大小写
那我们第一种写在sciprt标签中不可用 第二种写在scr指定的文件也不可用 那我们可以用某个事件处理器img src=1 οnerrοr=alert(1) 发现可以成功 说明我们的思路是对的
这个思路就是 我们让他去找一个为1的文件 这个事件有个是路径不存在他会报一个错叫onerror 我们可以写script的代码





我们看看impossible
查看源代码,发现使用内置的PHP函数来转义任何改变输入行为的值,并且使用token验证来防止CSRF攻击。
最下面的date->的部分是对SQL注入的防范,采用了预编译语句。这个到SQL注入通关的时候再分析。

DOM型XSS

特点:通过JavaScript操作document,实现dom树的重构
主要存在于用户能修改页面的dom,造成客户端payload在浏览器中执行
ducument.URL获取该网页地址

DOM型XSS利用场景

我们看到源代码是没有任何防护的 我们可以查看html的源代码
我们看到这个值是default我们直接=script即可




查看Medium
stripos(string,find,start) 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
header() 函数向客户端发送原始的 HTTP 报头。
当匹配到



我们设置high
通过看源代码我们可以知道用了switch这个选择结构如果不等于这几个的时候则是默认english
可以加入注释符 “#”,注释后边的内容不会发送到服务端,但是会被前端代码所执行。


impossible
我们看到源代码没有任何防护 我们查看html的源代码
并没有对我们输入的内容进行URL解码,所以我们输入的任何内容都是经过URL编码,然后直接赋值。因此不存在XSS漏洞。