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[]=-

也可以爆出来答案,这一点等我完全弄明白了再更新

 

posted @ 2019-04-17 18:07  张子木  阅读(297)  评论(0编辑  收藏  举报