一道小CTF

本来不想更的,因为懒。

其实是手头的项目有点积压!T T

后来今天看到了一题CTF,和同事研究了下,觉得不错。分享给了团队的学弟妹们。只不过懒,没有时间写write up,就让达写了。

-------------------------------------------

Vaf大兄弟搞了一个CTF题,题目是这样的(大牛可以略过):

最终目的就是要通过重重的ifelse难关获取到这里面的东西。

废话不多说,拿源码自己本地搭建下。

搭完后开搞。

首先第一步:从源码得知,只要4个key不为空的get传输,就可以进去第一个if

很好,成功报错,我们突破了第一个门槛的if。

接着看源码

Intval()的意思是对括号的值取整(去掉小数部分)。

我们如果要进入到if($key1 == 1) 里面,既要让intval($key)<1又要让$key1=1…...这尼玛。。。。

不过这还是很容易过去的。(实际上在0~1之间徘徊了一小会)

介绍两种方法:

1、$key1=0.99999999999999999999(输入一大串9,不行继续输)

2、$key1=0x1(16进制表示,intval(0x1)后得到为0)

得到:

结果改变,这样就成功的进去了我们要进的if块。

然后继续,我们需要改变$key2的值进入到如下红框部分,即$key2>=1 and intval($key2+$key1)<=1

这个边工作边搞定的,搞了很久。试了下$key2=0.99999999999999999999999999999、$key2=0x1无果。

最后直接$key2=99999999999999999999或者0xffffffffffffff(16进制)或者077777777777777777(八进制)

数据溢出绕过。

分析下原因,这里是为整数类型的,学过C语言的都知道(long long int最大值9223372036854775807,int最大值2147438647)

当超过这个最大值时就会发生数据溢出,因此只要$key2直接大于这个最大值(我选long long int),数据溢出后变成负数就绕过了。

我们终于走到这里了。离最后的flag只差一步之遥了。

只要$key3和$key4都是整数,并且$key3和$key4又不全是整数,就可以拿到flag了。

看到这里,是不是感觉有点不可能。哈哈。

实际上这里都是is_numeric这个函数在作怪。

这个算是php的一个黑魔法,因为当有两个is_numeric进行判断并且用and连接时,and后面的is_numeric无论判断的是不是数字皆可以绕过。

也就是说

$check = is_numeric(123) and is_numeric(123),//$check=1;

$check = is_numeric(123) and is_numeric(‘abc’),//$check=1;

看到这里,知道该怎么做了吧。

成功get。

感谢vaf大表哥平台。

提醒:可以试着将每个key的值输出,以及他们intval的值,以便观察。

后面说下,为什么要给达打码呢?因为他是色达!

本文分享自微信公众号 - 晨星先生(MoXuanIT),作者:vaf

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-04-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试中碰到的坑之包含漏洞专题

    lonelyvaf
  • 一次不完全成功的渗透

    lonelyvaf
  • oreint db 远程代码执行漏洞

    lonelyvaf
  • 由PHP小tip引发的思考

    前段时间看到有关于CTF中PHP黑魔法的总结,其中有一段只有介绍利用方法但是没有详细介绍为什么,我想了一下,思考如下,如果不对,请各位大佬多多指正~ 原话如下:...

    企鹅号小编
  • KBQA: Learning Question Answering over QA Corpora and Knowledge Bases

    一个知识库包含了大量的结构化数据。下图给出了一个关于Obama的知识图谱示例。知识库中的每一个三元组代表一个知识或某个事实。 例如,一个三元组(d,人口,390...

    DC童生
  • 无人自动驾驶的梦想:Level 2 与 Level 5 之间有着什么区别?

    具备部分自驾能力的车款已现身:让我们一同了解接下来会发生什么事。 自动驾驶车不再是科幻作品里的题材,如今已经能买到具备在上下班尖峰时间于高速公路自动行驶,还能...

    GPUS Lady
  • scala转换date提取年月日时分秒

    从数据库提取出来的时间为 String 格式,现在需要转换为 date 并提取出里面的 小时 时间段:

    机器学习和大数据挖掘
  • c++_std-numeric_limits极值接口

    在C/C++11中,std::numeric_limits为模板类,在库编译平台提供基础算术类型的极值等属性信息。

    上善若水.夏
  • p=p+1与p++的区别

    Dar_Alpha
  • 循环结构 if语句我替代语法

    通过这两者的比较,我得出了一个结论,就是while是符合条件在执行语句,do while是先执行在判断是否符合条件 这两个都一样,但是while就像我想结...

    用户7873631

扫码关注云+社区

领取腾讯云代金券