漏洞原理xss(cross site script)跨站脚本攻击,指的是攻击者往web页面插入恶意脚本代码,当用户浏览时,嵌入web页面里的脚本代码就会执行,从而达到恶意攻击用户的特殊目的,它主要分为俩种类型
1. 存储型XSS(持久型):攻击者将恶意脚本存储在目标服务器上,每当用户访问受感染的页面时,恶意脚本就会执行。
2. 反射型XSS(非持久型):攻击者诱使用户点击一个链接,该链接将恶意脚本作为输入传递给服务器,然后服务器将这个脚本反射回用户的浏览器执行。
3. DOM型(非持久型):
漏洞危害XSS攻击的常见目标是盗取用户的cookie和其他敏感信息,这些信息可以用来进行会话劫持、身份冒充等进一步攻击。如何防御?
1. 输入验证:网站开发者需要对用户输入进行严格的验证和过滤,避免将不受信任的数据直接输出到HTML中。
2. 输出编码:当将用户输入的数据输出到页面时,使用适当的编码方法(如HTML实体编码)来转义可能被浏览器解释为脚本的特殊字符。
3. 对输出内容进行编码:在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。
漏洞复现Upload-Labs靶场(1-20关)
第一关(URL传参)分析URL中的参数有个nanme
根据XSS原理,注入恶意脚本,尝试注入payload
?name=
第二关(输入框注入)尝试注入payload
分析源码,红色框上面部分被转义了,没有什么绕过方法,但是下面部分,仔细看,如果我们嵌套一个反标签符号呢?payload如下
"><"
第三关(事件注入)
尝试使用上一关的内容进行绕过,被转义,只能想想其他办法了
在JavaScript中有一个函数onfocus,用于输入框input,select,a标签获得焦点的事件
这里我们给他一个函数即可,payload如下
' onfocus=javascript:alert() '
此时再点击这个input框,使其获得焦点,触发onfocus事件
第四关(引号类型)
使用上一关的结果进行注入,尝试失败
分析源码,发现外围是双引号,双包单了,不符合javascript 的onfocus事件绑定
切换payload为双引号即可
" onfocus=javascript:alert() "提交payload后,需要点击input框,触发onfocus事件
第五关(a标签注入)
尝试输入脚本标签,被强行切换为scr_ipt
使用上一关的方法" onfocus=javascript:alert() ",事件名称也被强行转换了
这里就要用到a标签的 href属性了,尝试注入
分析源码,并无异常转换,只是少了个">和 <",构造payload">xx<"
发现页面多了个标签,此时既可以点击此标签
第五关,over!
第六关(大小写绕过)
使用上一关结果,尝试注入">xx<"
分析源码,href变成了hr_ef
尝试onfocus绕过,失败
尝试大小写,发现没有对大小写进行验证
//第一种,脚本注入" >< "//第二种,焦点事件" ONDOCUS=javascript:alert() "//a标签href属性的"> x <"
over!
第七关(双拼写)
一样,使用上一关方法尝试,发现此时对大小写也进行了验证。
不难发现,这里面进行了小写转化,将检测出来的on,script,href给删掉了,但是没有关系,我们可以利用****双拼写****来绕过。
" >
第八关(Unicode编码)
尝试使用大小写
失败,对字符进行了强行转换,而且使用了强制小写字母
尝试使用双写,也以失败告终
这里我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议
javascript:alert()利用在线工具进行Unicode编码后得到,在线Unicode编码解码
javascript:alert()
第九关(指定字符绕过)
先看看过滤了什么
" src data onfocus ";$safeOutput = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');echo $safeOutput; // 输出: <script>alert('xss');</script>尝试注入RefererREFERER:
注入成功,但是他把我们的<和>这些尖括号给去掉了
那么可以尝试使用onfocus事件,并且把隐藏的input给显示出来,payload如下
REFERER:" onfocus="javascript:alert()" type="text" "over!
第十二关(User-Agent)
上一关使用的referver,这一关我们猜测使用cookie,开始尝试
发送请求,果断打开源码,尝试个鬼,用的user-agent
尝试使用如下payload,添加到请求头后面
" onfocus="javascript:alert()" type="text" "
over!
第十三关(Cookie)
这关想都不要想,一定是Cookie!有人不服嘛,不服顺着网线来打死我 (´。✪ω✪。`)
先查看源码,然后抓包,或者说,直接抓包
俩个东西似曾相识哈,复制上一关的payload,开始注入
" onfocus="javascript:alert()" type="text" "
鼠标点击input输入框,使其获得焦点,成功!
第十四关
由于本关因iframe调用的文件地址失效,无法进行测试。
第十五关
来到了第十五关,直到看到如下图片,啊??????
再看看源码,没有一点头绪啊,之前用的方法全部没作用了
使用burp suite抓包试试。。。。。。
无奈,只能看php源码了,有一个SRC参数,关键他还使用了htmlspecialchars()
累了,煞了我吧
看网上是这样子说的
这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如