xss-lab
xss
XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面中执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览该页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等。
XSS属于代码注入的一种,它允许攻击者将代码注入到网页,其他用户在浏览网页时就会受到影响。
level1
get传参输入,调用alert()函数来触发弹窗
<script>alert()</script>
level2
尝试上一关的办法,失败
还是get传参,第一个被进行html实体转义,第二个没有,所以要用‘’闭合避免,实体转义就是为了确保一些特殊字符能被正确解析,就把他转换成特定实体表示形式来确保解析
"> <script>alert()</script> <"
level3
随意输入,看源码
这关是单引号试试看
看wp,原来是符号也被实体化了,htmlspecialchars函数只针对<>大于小于号进行html实体化,wp中用onfocusonfocus,来避开使用<>
“onfocus”在 HTML 中是一个事件属性,当一个元素获得焦点时触发。例如,当一个文本输入框被用户点击或通过键盘操作选中时,就会触发“onfocus”事件,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,再配合js为协议来执行alert
上传' οnfοcus=javascript:alert() '后再点击输入框出发onfocus事件
level4
双引号,尝试使用上一关的办法,确实是把单引号改成双引号
level5
还是<input>标签,双引号尝试上一关的办法
可以看到字符被异化成o_nfocous了,看wp是说有转换成小写字母的函数,不能用大小写绕过,要使用<a>href标签法<a>href标签法
当点击<a>是会出发跳转,可以是网站也可以是js代码,这题就是用这个来执行js代码
"> <a href=javascript:alert()>xxx<a> <"
level6
尝试onfocus条件还是一样
看wp得知,上面我们可以看到o被禁用了,题目源码提示了禁用语句,但是我这里的源码找不到,不论是开发者模式,还是直接看源码都没有
这边看一下wp中的代码
可以看到一些字符串会被替代成对应的字符串,没有添加大小写变化,所以可以用大写绕过,对应语句,_前面的字符变成大写
"> <a hRef=javascRipt:alert()>xxx<a> <"
level7
和往常 一样是input标签双引号
一样的去尝试用ahref标签
可以看到一部分字符被删除了,从上一关wp可以发送测试关键字字符串" OnFocus <sCriPt> <a hReF=javascript:alert()>
可以看到on、script、href都被删除了或者替换成空值了,这边不知道有没有禁用大小写,尝试之后发现是禁用了的,wp上用的是双写字母绕过
"> <a hrehreff=javasscriptcript:alert()>xxx</a> <"
level8
这次显然没有引号,同样是get传参,而且它给你设置了a href标签等于我们输入的内容,所以我们尝试将之前使用a href标签时的内容填进去
可以看到输入的还是有被替换,尝试大小写绕过也是失败的,但是我们不知道具体替换的时字符还是字符串,是什么字符串,所以也不能去用双写字符绕过,去看wp时给了源码
显然可以知道src被替换了,但是这次不是替换成空字符,所以也不能用双写字符串绕过,wp是使用href的隐藏属性自动Unicode加密,也就是将我们输入的字符串进行Unicode加秘密之后再输入网站,将javascript:alert()加密
level9
这次添加了引号,可以看到我们输入的是not bad,href却显示您的连接不合法,也就是在输入过程中,他还添加了一个验证,这边还是看不到验证的源码,去wp里看
可以看到我们输入的字符串中要包含有http://,否则就是不合法,单纯加上去又不行,但是可以看到确实是通过了验证
看了wp才知道是因为输入的字符串解码之后就不是我们要执行的js代码了,所以要把http注释掉
javascript:alert()/* http:// */
level10
本题没有输入框,但其实就看传参方式而已,get就直接url,post就用hackbar,用测试字符尝试一下,是get传参
可以看到没有字符被替换,只有特殊字符被异化了,下面的代码显示有三个隐藏的输入项,看wp得知是get传参t_sort,并过滤掉了<>号,为什么过滤了<>我也没搞清楚,因为不能闭合标签所以我们用不了a href标签,但可以用' οnfοcus=javascript:alert() ',因为这里输入框被隐藏了,需要添加type="text",注意这里要用双引号
t_sort=" οnfοcus=javascript:alert() type="text
level11
比上题多了一行隐藏代码
"http://xss-lab/level10.php?t_sort=%22%20οnfοcus=javascript:alert()%20type=%22text"
wp中说明,t_ref的<input>标签是http头referer的参数,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,显然我们是从上一条跳过了的,http头的referer会记录,但是这个要怎么用呢
这边是抓包之后加一个referer去测试字符串
返回看源码
可以看到<>被删了,所以我们可以用" οnfοcus=javascript:alert() ",同样是构造referer
Referer: " οnfοcus=javascript:alert() type="text
沿用上一罐的直接改
level12
将referer替换了,像是系统的版本,看之前抓包的图片也可以知道要改user-agent,沿用上一罐的直接改
level13
又换了一个隐藏,要怎么判断这个隐藏是什么传参方式?
这边看wp,他的源码又和我不一样
说是通过这句话判断是cookie,还是直接抓波发送测试字符串发现只删除<>,所以用
" οnfοcus=javascript:alert() type="text
level14
源码里又两个网站一个404报错了
另一个也看不出什么,看wp知道是网站坏了,原本的思路是向那个网站发送一个带xss代码的图片,这个可以在属性中编辑,之后向网站发送图片以达到弹窗的目的
level15
出现了ng-include AngularJS ng-include 指令详解-CSDN博客
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include
属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
1.ng-include,如果单纯指定地址,必须要加引号
2.ng-include,加载外部html,script标签中的内容不执行,不能加载,如果需要控制器处理需要在主页中注册
3.ng-include,加载外部html中含有style标签样式可以识别
4.ng-inclue,记载外部html中的link标签可以加载
这边看wp时先测试包含文件,包含的时=是第一个的地址
可以看到两关并起来了,然后传参测试字符串?src=" ' sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
看源码双引号、<>被过滤了,wp上说不能直接用会直接弹窗的东西,要用手动的,这是为什么XSS跨站脚本攻击实例与防御策略-CSDN博客
可以在这里面选择,这里选择<img>,然后选择在第一关弹窗
?src='/level1.php?name=<img src=1 οnmοuseοver=alert()>'
我也尝试用这个关弹窗可是不行,又是为什么
level16
这边是先传参测试字符串?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> j
对比可以看到字母小写化了,script和/替换都成空格,那么就是绕过了,选择其他的来代替被替换的字符,wp中是使用回车替代空格,回车的url编码是%0a,在上面的攻击脚本中找一个不用/使用即可
<img%0Asrc=1%0Aοnmοuseοver=alert()>
level17
还是先测试
发现前后没什么区别,看wp发现是使用embed标签是 HTML 中的一个标签,用于在 HTML 文档中嵌入外部内容,如音频、视频、插件等。但是现在的版本已经不用embed标签了,所以点开它嵌入的图片是乱码,正确的解法是在这个图片中去构造弹窗payloadembed标签的使用方法和属性详解_<embed>-CSDN博客
?arg01=a&arg02= οnmοuseοver=alert()
level18
这题和上一题显然是一样的,本来以为是过滤会不一样,结果看wp就是一样的连payload都是一样的
level19
一样要在镶嵌入的图片里去发送payload
level20
同上