[其他] iscc 2017 ctf 自相矛盾 详细分析

[复制链接]
查看5383 | 回复1 | 2017-5-29 18:51:28 | 显示全部楼层 |阅读模式
导语
感觉毁了三观的一道题真的有那么难吗?我们细细分析。
分析
源码如下:
%E8%87%AA%E7%9B%B8%E7%9F%9B%E7%9B%BE%E6%BA%90%E7%A0%81.jpg
首先我们看到的就是需要传入一个名字叫做iscc的json对象,然后会被转化成数组。至于json对象,长成啥样就像这样:
{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5},待会数组打印出来冒号前面的就是键,冒号后面就是值。本地测试一下如图:
%E8%87%AA%E7%9B%B8%E7%9F%9B%E7%9B%BE2.jpg
后面的代码分成三个部分,分别对应三个变量
1.数组a中的bar1键对应的值要不是数字,但是值要比2016大,这里用的是php比较中的一个问题,字符串和数字比较时系统会把字符串转化成intval类型,如: ‘12asd’会被转化成12 ‘a’会转化成0 ,所以这里面直接构造bar1是2017a
2.bar2键要是一个数组,长度是5,并且数组中的第一个元素还要是数组,难点在下面,数组中的值需要有nudt但是有要没有,这里用到了array_search
的一个弱类型比较问题,array_search的查找相当于==也就是说只要里面有0就可以绕过,所以构造 bar2为 [[0],0,1,2,3]
3.传入的cat可以是一个数组或者字符串,但是后面的矛盾再次说明要利用strcmp的漏洞,所以必须是数组,strcmp如果数组和字符串比较返回值一定是0也就是假,也说明d是字符串。先看最后一个条件,说明d和c[0]里面一定有一个含有isccctf2017,但是回到上一个条件,两个里面不能有3或1或c
想到了eregi的%00截断漏洞c[0]=isccctf2017 d=%00,构造这样的语句:
&cat[0]=isccctf2017&cat[1][]=1&dog=%00
综合起来就是iscc={“bar1”:”2017a”,”bar2”:”[[0],0,1,2,3]”}&cat[0]=isccctf2017&cat[1][]=1&dog=%00




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

匿名
御结冰城 该用户已被删除