Once More
http://ctf5.shiyanbar.com/web/more.php
如题目所说,是PHP相关的题目,涉及到ereg函数的漏洞,由于没有学习过PHP,所以去百度下这个函数的相关问题。得到一下信息:
语法: int ereg(string pattern, string string, array [regs]); 返回值: 整数/数组 函数种类: 资料处理 PHP函数ereg()内容说明: 本函数以 pattern 的规则来解析比对字符串 string(就是看string里的每个单元是否属于规则pattern中的一个单元)。
比对结果 返回的值放在数组参数 regs 之中,regs[0] 内容就是原字符串 string、 regs[1] 为第一个合乎规则的字符串、regs[2] 就是第二
个合乎规则的字符串,余类推。若省略参数 regs,则只是单纯地比对,找到则返回值为 true。
%00截断即遇到%00则默认为字符串的结束
然后就打开了题目,得到代码:
<?php if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) //根据百度的信息可以知道,ereg函数利用正则限制了password只能含有字母和数字 { echo '<p>You password must be alphanumeric</p>'; } else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) //password的长度不能大于8,切要大于9999999[题目入口提示了,用科学计数法]
{ if (strpos ($_GET['password'], '*-*') !== FALSE) //
{ die('Flag: ' . $flag); }
else { echo('<p>*-* have not been found</p>'); } }
else { echo '<p>Invalid password</p>'; }
}
?>
整理完信息,开始做题,因为长度要小于8,并且要大于9999999,并且入口提示要用到科学计数法,所以,试试1e8
想到我们刚才的信息中有说passworld里要有*-*,那我们试试把这个符号加进去1e8*-*,不用试,我也知道这样不对,因为password里只能有数字和字母,然后想到了函数的截断漏洞,我就在符号前面加个%00,构造一个1e8%00*-*,看看什么效果。
说是passworld里有其他字符?难道截断漏洞是已经修复了,还是不会用呢?不过我感觉自己的思路是没有问题的。审查了一会儿后,发现了一个特别的地方:http://ctf5.shiyanbar.com/web/more.php?password=1e8%2500*-*,我的URL中%被转义了,所以我就尝试把转义的修改回来,变成http://ctf5.shiyanbar.com/web/more.php?password=1e8%00*-*,回车
然后我又多看了点关于这个函数漏洞的问题,修改了URL:http://ctf5.shiyanbar.com/web/more.php?password[]=-
也可以爆出来答案,这一点等我完全弄明白了再更新