• CTF-代码审计(3)..实验吧——你真的会PHP吗


    连接:http://ctf5.shiyanbar.com/web/PHP/index.php

    根据题目应该就是代码审计得题,进去就是

    日常工具扫一下,御剑和dirsearch.py 无果

    抓包,发现返回得响应头里面有提示

    访问则拿到源码。。

    有次听培训有个学长说,做代码审计看代码顺序,先去找flag在哪儿,快速找到直接从那儿开始看。

    intval()     返回变量得整数值

    strrev()  这个函数让字符串反序.

    然后再来看代码里is_palindrome_number()得功能,函数得功能

    就是看看这个输入这个字符是不是回文数,是就返回ture。(有时候如果看不懂函数得内容可以直接翻译函数得名字,一般是对得,哈哈哈) //    回文数就是   12321 1112111 这样的第i个和n-i个字符要相等。

    ok,接下来说解题思路

    四个限制条件

    不得不说,CTF里得代码审计老是出这种矛盾得题,其实就是想让我们利用函数得漏洞绕过

    第一个 is_numeric() 可以用%00绕过,可以输入数字,所以这里第一个条件和第二个条件通过。%00可以放在开头或结尾,%20只能放在最后。

    三四个条件绕过得方法很多种

    1.intval() 处理浮点数得时候直接返回整数,所以我们直接构造 number=0.00%00

     这样得话就可以满足第三个条件满足,因为0得反序也是0

    但是代码里那个函数处理number得时候,是从第一位和最后一位相等,倒数第二位和第二位相等一次类推,所以我们直接构造0.00,0是不是回文数我不知道,但是第二位 '.'和倒数第二位’0‘是不同得,所以检测函数会判断它不是回文数,所以条件4也绕过,拿到flag。

    类似这个0.00%00 得原理还有  ’-0%00‘

    2.number=0e00%00

    这个原理和上面一样,只是把0.00 换成科学记数法而已。

    3.构造法3,这个构造法我去测试了发现不行,出处  https://blog.csdn.net/he_and/article/details/80615920

    但是看了别人得wp发现以前是可以得。

    能想出这个方法得人真是棒棒哦,也许题目就是想这么考得,因为32位最大就是 2147483647 ,value2得过程就是,先将2147483647反序,得到7463847412,而这个数字是大于2147483647这个数字得,所以intval()这个函数又会返回 2147483647,这样就使得value1和value2得值都相等了,而2147483647这个数又不是回文数,所以绕过四个条件。

    但是这个方法不行了,我也不知道为什么.

    如果服务器是64位操作系统这个方法则不行,因为9223372036854775807这个数反序后比最大小。

  • 相关阅读:
    【心情】12月22日
    【心情】12月12日
    【心情】12月8日
    【转载】信息学竞赛知识地图
    SharePoint 2013 工作流之年假审批Designer配置篇
    SharePoint 2013 状态机工作流之扩展自定义状态
    SharePoint 2013 状态机工作流之UpdateItemActivity
    SharePoint 2013 状态机工作流之日常报销示例
    SharePoint 2013 对二进制大型对象(BLOB)进行爬网
    SharePoint 2013 图文开发系列之应用程序页
  • 原文地址:https://www.cnblogs.com/tlbjiayou/p/11032388.html
Copyright © 2020-2023  润新知