实验吧web-Once More
2019-04-08 本文已影响92人
追求科技的足球
又是一个周一,oncemore,ctf也再来一道吧!
1、打开网页直接就有view code,那就view code吧。
2、看一眼程序逻辑,先把函数的意思弄懂吧。大概几个函数有的见过了,有的没见过,下面解释一下:
isset():检测变量是否设置。
① 若变量不存在则返回FALSE
② 若变量存在且其值为NULL,也返回FALSE
③ 若变量存在且值不为NULL,则返回TURE
ereg():用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。
strpos() :返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
die() :输出一条消息,并退出当前脚本,是exit()函数的别名。
3、所以这段程序的意思就是
(1)首先密码不能为空
(2)其次只能含有"a-zA-Z0-9"
(3)然后密码长度小于8位且数值大于9999999
(4)密码中要含有‘*-*’。
4、这里很显然想满足第1、2、3个要求的话,因为第三个要求很奇怪,小于8位的数字肯定都不比9999999大,因此想到采用科学记数法。只要2e9,但是这里面不能满足第四个要求,因为没有'*-*'。
5、题目中hint是ereg函数有漏洞,因此看一下ereg函数,存在两个漏洞。
(1)NULL截断漏洞:遇到%00则默认为字符串的结束,则可以使用%00截断正则匹配。
(2)只能处理字符串,遇到数组做参数返回NULL,判断用的是 === ,而“===”判断则要求类型也相同,NULL跟FALSE类型是不同的。可以进行绕过。
6、同时strpos也有第二种漏洞,它采用的是“!==”也是类型判断。
7、因此本题两种解法:
(1)既可以科学记数法加字符串截断(浏览器url输入,不然会被转码)
http://ctf5.shiyanbar.com/web/more.php?password=2e9%00*-*
(2)又可以构造数组。
http://ctf5.shiyanbar.com/web/more.php?password[]=1
小结:今天学到了ereg()的漏洞,两种绕过方式(上次的sha1函数也可以数组绕过欧,可见https://www.jianshu.com/p/654497f98be0),继续加油吧!