extract变量覆盖
第二行的$flag我们是不知道的。
第三行对于get方式获得的值进行了extract()函数处理。
第六行,对$flag进行了读取并且用trim函数移除了左右两侧并且赋值给content。
第七行判断通过get得到的shiyan值是不是和content相等。
我们一开始就不知道$flag的值,怎么构造shiyan的值和它相等?
对extract()函数进行分析。
extract()函数引入变量,当冲突的时候,会引入新的变量,意思也就是覆盖原来的变量。
题目中对于get方式得到的值进行了extract(),我们再构造一个flag不就可以覆盖掉原来的flag了吗?
一开始我构造的是?shiyan=1&flag=1,但是是错误的。这里就理解错了覆盖这个含义了。
图片上写的很清楚了,数组中有同名元素的时候,会覆盖,那么元素不同的时候呢?我只让flag=1,其他的变量就没有了吗?
所以直接构造?shiyan=&flag=,直接让他变为空。这样就不用管flag里其他的元素是什么了。
` 第二种解法,如果php://可以用的话,直接POST重新写flag的值,并且保证a和falg的相等就可以。`
url二次编码绕过
①eregi()判断get方式获取到的id值是否和hackerDJ相等。做完这题目发现并没有关这个函数什么事。
②绕过eregi()我先尝试了把hackerDJ进行url编码,但是没有卵用,浏览器会自动给你进行url解码。
③然后看第二段内容,对url再进行一次解码,不懂为什么这么做,就是因为这个urldecode才导致了这次绕过。
④我们对hackerDJ进行两次url编码,变为%25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41
。
我们再来从头看代码。
⑤浏览器首先对 %25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41
进行url解码,变为%68%61%63%6B%65%72%44%4A
,这串字符相当于hackerDJ进行了一次url编码。hackerDJ和%68%61%63%6B%65%72%44%4A
相比,不相等,所以可以绕过第一次的eregi()函数。
⑥来到第二部分代码,对id又进行一次解码,直接变为hackerDJ。这下子就绕过了。
⑦主要还是觉得那个urldecode()函数的问题吧,没有这个函数就不会发生绕过。
数组返回NULL绕过
思路一:eregi的00截断,构造?password=a%00--
思路二:构造数组。ereg和strpos是对字符串进行操作,如果是数组,他就会返回null。?password[]=a
弱类型整数大小比较绕过
①is_numeric 判断是不是数字字符串,构造?password=1337a,即可绕过is_numeric函数。后边的弱类型比较,1337a和整数比较, 1337a会转化为1337,大于1336,绕过、
②?password[]=,也可以绕过,不知道数组和整数进行弱类型比较的时候具体是怎么回事,百度也没搜到,自己试了几个数,猜测数组永远大于整数。
③?password=1337%00
,或者?password=1337%20,这是函数is_numeruc()本身的漏洞。弱类型比较,这两个都花转化为整数1337.
十六进制与数字比较
首先get方式得到的值赋值给$temp,将这个变量代入函数。
来看这个函数:
flag的值我们一开始是不知道的,这个是需要求的。
$one和$nine是获取数字1和9的ascii的值。这个会在后边的判断用到。
number是数字字符串 。
然后执行一个循环,判断你的输入是不是整数 。
我们来举个例子:?password=3735929054
$dight在每次循环挨次存入3735929054的每一位数,然后顺序和数字字符串中的每一个数比较。
详细说一下过程,get得到3735929054,然后把第一个整数3存入dight,3在于1~9之间,字节return false,退出循环。
这样肯定不行的,无论怎么都会出现0~9的数字,只要有0~9数字,一定会输出false.
题目说了,16进制,我们先看下3735929054的十六进制是什么?
0xdeadc0de,这个没有数字0~9,是不是可以绕过呢?后边还有个if判断,必须是number和password的值相等。十进制和十六进制比较的时候,强弱比较类型是没有关系的。构造?password=0xdeadc0de.
这一定会绕过吗?纯是运气好,我们那串十进制数字转化为16进制刚好没有0~9。举个例子:如果字符串是912082呢?十六进制为0xdead2,当比较到最后一位时数字是2,在0~9,return false。
ereg正则%00截断
题目要求:get方式获取到password的值,这个password必须是a-z,A-Z,0-9,说白了就是英文字母加数字。
但是还得要求里面含有"-"这个字符。另外一个就是,要求输入password小于八位还得大于99999999,这里采用科学计数法。
%00截断和科学计数法绕过
①怎么绕过ereg,题目要求有-,所以可以构造?password=123%00-
②绕过长度限制,科学计数法,1e8就代表着100000000,大于99999999因此?password=1e8%00-
③这里有个问题啊,可能bugku表面的代码不和实际的代码一个样子,-实际上应该是*-*
,并且他错误提示也是给你提示*-*
没有找到,猜测这里应该是某种文本编辑器把两个*
作为控制字符了吧。
值得一提的是,%00只代表一个字符。
数组绕过
?password[]=
首先,ereg函数判断数组时候会返回null,null和false进行强类型比较(===)的时候是不相等的。所以绕过了ereg函数。
strpos比较数组也会返回null,原理和ereg一样,所以直接就绕过了。