iscc 2017 ctf 自相矛盾 详细分析

导语

iscc2017有几道PHP题目还是有点意思,虽然是为了出题而出题但是知识点考察还是很全面的,这道感觉毁了三观的一道题真的有那么难吗?我们细细分析。

分析

源码如下:
image
首先我们看到的就是需要传入一个名字叫做iscc的json对象,然后会被转化成数组。至于json对象,长成啥样就像这样:
{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5},待会数组打印出来冒号前面的就是键,冒号后面就是值。本地测试一下如图:
image
后面的代码分成三个部分,分别对应三个变量

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

文章目录
  1. 1. 导语
  2. 2. 分析
|