强网杯Wirte …
这次强网杯打的可以说是一败涂地了。
比赛之前踌躇满志,要全心全意肝上两天。结果总是做着做着做不下去。
闲鱼。
MISC
Welcome
题目是一个bmp文件,因为之前没做过bmp文件的隐写。所以一上来就有一点懵。最初以为是LSB隐写,翻了几遍也没有什么有效信息,然后尝试extra data,亦未果。最后试了offset,结果在100位时出了flag。
此题总结:
此题解答过程中思考混乱,不能理性分析。
对stegsolve的了解不够深入,应当了解每一个选项的具体使用以及应用环境。
ai-nimals
本来以为自己能解出来这道题的,结果果然自己机器学习学的还不行,tensorflow了解还不足。。比赛时候也不愿意静下心来好好学。其实CTF的过程中完全可以学到足以作出来这道题。。
1.题目给了一个py脚本,读脚本可知,用base64加密图片,传给服务器。判断和原图是否相同,长度必须相同,里面内容最多有config.diff_chars不同,hint中config.diff_chars的值为1024。接着利用tensorflow训练的一个模型来判断,图片中是何种动物,训练的模型给了一个GitHub地址。
2.判断是否输出的条件为if top_k[0] == 1:,根据在本机训练模型试验的结果,意思是:判断是否为狗的几率最大,就输出flag。显然与题目本意不同,所以我们只需要将给我们的原图base64之后发过去就好了。
3.发包过去的时候要注意,不能一次性全部发过去,否则会出错,所以我们每次发送1024,发一个包暂停0.5秒,最后即可得到flag。(如果出错,重试几次就好)脚本如下:
Web
Web签到
这题是一个md5及相关特性的考察。
第一层:
查看源码,见注释如下:
<!--
if($_POST['param1']!=$_POST['param2'] && md5($_POST['param1'])==md5($_POST['param2'])){
die("success!");
}
-->
MD5弱类型罢了,payload:
param1=240610708¶m2=QNKCDZO
第二层:
<!--
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!");
}
-->
这里我是从精灵表哥的blog那里看到过,因为md5传入数组是会回传两个相同的md5值,所以payload:
param1[]=1¶m2[]=2
第三层:
强制字符串转化:
<!--
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!);
}
-->
只能md5碰撞了。
碰撞好之后,我死在了怎么传上去上。
我真傻,真的。我只知道要用URlencode,却不知道什么样形式传上去才能让md5相等。做着做着发现被队友解出来了。。。。
后来知道了好几种传的方式:
- burpsuite 文件上传了解一下~
- 传URLencode后的二进制啊!!!!
- 在网上找别人碰撞好的encode啊!!! 之后才知道去年BKPCTF有类似的题。
payload:
Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
我真傻,真的。
此题总结:
burpsuite用的不熟练。
也是够了。连burp上传文件都不知道。
Three hit
这题直接没看懂。。。太菜。
看大佬说,这是tm个盲注。
要测试各个字段
发现username有正则限制,那么测试age,发现必须整数,这里可以用16进制绕过,测试一番后发现是个盲注
无力吐槽自己,脚本:
此题总结:
测试意识不足。说起来,自己对SQL注入太不精通了吧。就会打个分号,跑个sqlmap。
Python is the best language 1
flask审计题。
然而我玩了半天留言板。。。。
本来猜XSS,结果XSS能直接发出去,不是。
留言功能关键代码:
class PostForm(FlaskForm):
post = StringField('Say something', validators=[DataRequired()])
submit = SubmitField('Submit')
这里直接接受post参数,然后查看是如何添加到数据库的
form = PostForm()
if form.validate_on_submit():
res = mysql.Add("post", ['NULL', "'%s'" % form.post.data,
"'%s'" % current_user.id, "'%s'" % now()])
跳转到Add定义处
def Add(self, tablename, values):
sql = "insert into " + tablename + " "
sql += "values ("
sql += "".join(i + "," for i in values)[:-1]
sql += ")"
try:
self.db_session.execute(sql)
self.db_session.commit()
return 1
except:
return 0
看到这里发现并没有进行任何过滤,存在一个insert注入。
payload
123456',1,'2018-03-24T21:44:39Z'),(NULL,(select conv(hex(substr(load_file('/etc/passwd'),1,6)),16,10)),2,'2018-03-24T21:44:39Z')#
Crypto
Streamgame1
题目给了一个加密算法和一个key文件,根据题目名提示,查了一下是什么流加密,最终也没把算法逆向出来。结果给队友爆破出来了。
题面:
因为确实也只有2**19种可能性,很多表哥都是直接爆破的,贴一个风吹雨表哥的爆破脚本。。
总结
打CTF的方法是不是错了呢,我一直注重的是套路学习。但其实可能并不是这样,打比赛就是考的学习能力啊。看写Threehit 和 Pyhon1的write up的大佬说:
其实是一个很简单的注入,对于flask的理解其实并不是很高,只要学习个几个小时就足以应付这道题,所以对于这道题来说不会flask并不是做不出来的理由,这就表示我们不能总是把希望寄托于CTF竞赛中总会出我们见过的套路,善于学习才是提高CTF竞赛能力的最快捷径。
确实很有道理,CTF是一个学习的过程。
一定要记住这个。
题目writeup参考:
- Three hit:Pupil-XDSEC
- Python is the best language 1:Pupil-XDSEC
- stream1:风吹雨
- ai-nimals:Xp0int Team