当前位置: 首页 > article >正文

ctfshow(89,90)--PHP特性--intval函数

Web89

源代码:

include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
}

审计

GET传参num。
如果在参数num中匹配到数字,终止程序运行。
如果intval($num)=1,输出flag.

intval()函数可以获取变量的整数值,常用于强制类型转换。
返回值可以分为三种类型:
一. 返回值为0,当转换失败或传入空数组时。
二.返回值为1,当传入数组不为空时。
三.返回值为变量转换成功后的整数值。

思路

我们要让参数num中不含数字的同时让intval($num)=1。
传入非空数组即可。

https://fd97533c-67f2-456a-a94f-714edb3d0262.challenge.ctf.show/
?num[]=1

得到flag.

Web90

源代码:

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }else{
        echo intval($num,0);
    } 

审计

GET传参num.
如果num强类型比较与"4476"相同,终止程序。
如果intval($num,0)强类型比较与4476相同,输出flag.

int intval( $var, $base )
intval的第一个参数是传入的变量,第二个参数是转换为整数型所使用的进制。默认值为0,此时会根据参数 $var 的格式来选择进制:var以0开头时使用八进制;0x开头则使用十六进制;其他情况下为十进制。

例如有如下代码:

<?php
var_dump(intval(10));
var_dump(intval(012));
var_dump(intval(0xA));

//输出结果为
int(10) int(10) int(10)

转换后的有效结果都是十进制整数型。

思路

利用上述特性,我们可以传入八进制或者十六进制的4476,intval函数就会将其转换为十进制的4476.

?num=010574
?num=0x117c

也可以科学计数法绕过:

?num=4476e1

得到flag.


http://www.kler.cn/a/375861.html

相关文章:

  • 电能表预付费系统-标准传输规范(STS)(30)
  • redis分布式锁在项目中的应用总结
  • PyTorch实践-CNN-手写数字识别
  • 哈希思想及其应用
  • C++STL详解(九)map和set的使用
  • 任何python安装gdal出现的问题
  • 履带式排爆演习训练机器人技术详解
  • 从0学习React(10)
  • opencv优秀文章集合
  • 【系统架构设计师】2024年上半年真题论文: 论大数据lambda架构(包括解题思路和素材)
  • react的antd-mobile使用Steps显示物流
  • YOLOv6-4.0部分代码阅读笔记-dbb_transforms.py
  • ESP-IDF 配置 SimpleFOC 项目
  • 企业如何通过架构蓝图实现数字化转型
  • Unity 游戏性能优化实践:内存管理与帧率提升技巧
  • Android和iOS有什么区别?
  • redis详细教程(4.GEO,bitfield,Stream)
  • 自动驾驶上市潮中,会诞生下一个“英伟达”吗?
  • 基于深度学习的机器人智能控制算法 笔记
  • 【Linux】编辑器vim 与 编译器gcc/g++
  • OpenCV Python 版使用教程(二)摄像头调用
  • 二叉树选择题
  • 11.01学习
  • Linux云计算 |【第五阶段】CLOUD-DAY7
  • Shell 编程-Shell三剑客 Grep 学习
  • K8s pod 调度策略