Note:

1) PHP中的数据类型

PHP一共支持八种数据类型,

4种标量类型,boolean(布尔型),integer(整形),float/double(浮点型)和string(字符串类型),

2种复合类型,array(数组),和object(对象),

2种特殊类型,resource(资源)与null.

2)  intval()函数所引发的溢出

Intval()函数最大的值取决于操作系统位数,

32 位系统最大带符号的 integer 范围是 -2147483648 ~~ 2147483647,

64 位系统上,最大带符号的 integer 值是 -92233720368547758078 ~~ 92233720368547758077

当超过相应的最大值时会发生溢出(如:32为系统:2147483648时会溢出为2147483647)

利用:判断数值上是回文,字符本身不是回文

@ 如果参数为2147483647,那么当它反过来时,由于超出限制,所以依然等于2147483647,即为数值上回文

@ 其它方法判断(科学计数法)如果参数为0e-0,那么当它反过来时,数值上还是0,即为数值上回文

3)is_numeric()函数所引发的SQL注入以及其它问题

is_numeric()函数判断参数是否是数值型数据(常见:十进制,十六进制)

@ is_numeric()函数对于空字符%00,无论%00放在前后都可以判断为非数值,而%20空格字符只能放在数值      后,当%20放在数值前时,函数会对数值前面的空格字符进行跳过,接着后面的判断

@ SQL注入

简单例子

$s = is_numeric($_GET['s'])?$_GET['s']:0;

$sql="insert into test(type)values($s);";     //是 values($s) 不是values('$s'),后者将会解析成字符串不变

当参数为0x31206f722031转化为ASCII时为 1 or 1(特殊SQL关键字)

将该参数插入数据库之后,如果再重新查询这个表的字段出来,不做过滤带入另一个SQL语句,将会造成2        次注入.

PHP代码中尽量不要使用该函数,如果要使用这个函数,建议使用规范的sql语句,条件加入单引号,这样16进制0x31206f722031就会在数据库里显示出来,而不会出现1 or 1

Link : http://ctf5.shiyanbar.com/web/PHP/index.php 

考点  :PHP源码审计


进去之后发现就一句话,没什么用,抓包发现返回的数据包头部有一个文本文档,访问之后是一段PHP代码

<?php

$info = "";
$req = [];
$flag="xxxxxxxxxx";

ini_set("display_error", false);
error_reporting(0); 

if(!isset($_POST['number'])){
   header("hint:6c525af4059b4fe7d8c33a.txt");

   die("have a fun!!");
}

foreach([$_POST] as $global_var) {
    foreach($global_var as $key => $value) {
        $value = trim($value);  //trim() 函数移除字符串两侧的空白字符或其他预定义字符
        is_string($value) && $req[$key] = addslashes($value); //addslashes() 函数在指定的预定义字符前添加反斜杠。这些字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL字符)
} 

function is_palindrome_number($number) { //回文函数
    $number = strval($number);   //将数组及类之外的变量类型转换成字符串类型
    $i = 0;
    $j = strlen($number) - 1;
    while($i < $j) {
        if($number[$i] !== $number[$j]) {
            return false;
        }
        $i++;
        $j--;
    }
    return true;
} 

if(is_numeric($_REQUEST['number'])){   //判断传入的参数是否是数值

   $info="sorry, you cann't input a number!";

}elseif($req['number']!=strval(intval($req['number']))){

     $info = "number must be equal to it's integer!! ";  

}else{

     $value1 = intval($req["number"]);           //intval()函数将字符串转化为数值
     $value2 = intval(strrev($req["number"]));   //strrev()函数反转字符串

     if($value1!=$value2){
          $info="no, this is not a palindrome number!";
     }else{

          if(is_palindrome_number($req["number"])){
              $info = "nice! {$value1} is a palindrome number!";
          }else{
             $info=$flag;
          }
     }

}

echo $info;

?>

PHP代码审计之后,最后打印flag需要$_POST['number']满足以下条件:

1) 不能为空,且不能传递数值型数据

2)该数所反转的整数值应该和它本身的整数值相等

$value1 = intval($req["number"]);           //intval()函数将字符串转化为数值
$value2 = intval(strrev($req["number"]));   //strrev()函数反转字符串
$value1=$value2

3) 不能是一个回文数

构造$_POST['number']使其满足条件

不能传递回文数据,又让该数所反转的整数值应该和它本身的整数值相等,前后矛盾,

但可以利用intval()函数溢出进行解决问题,$_POST['number']=%002147483647(通过返回的数据包可知是32的操作系统)即可,intval(strrev(2147483647))发生溢出等于2147483647,即$value1=$value2=2147483647

另一种方法,利用科学计数法进行解决问题,$_POST['number']=%000e-0即可,即$value1=$value2=0

你真的会PHP吗?的更多相关文章

  1. App你真的需要么

    随着智能手机.移动路联网的普及,APP火的一塌糊涂,APP应用可谓五花八门,街上经常看到各种推广:扫码安装送东西,送优惠券.仿佛一夜之间一个企业没有自己的APP就跟不上时代了. 有时我在想:APP,你 ...

  2. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  3. 你真的会玩SQL吗?之逻辑查询处理阶段

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  4. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  5. 您真的理解了SQLSERVER的日志链了吗?

    您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...

  6. 你真的会玩SQL吗?和平大使 内连接、外连接

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  7. 你真的会玩SQL吗?三范式、数据完整性

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  8. 你真的会玩SQL吗?让人晕头转向的三值逻辑

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  9. 你真的会玩SQL吗?EXISTS和IN之间的区别

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  10. 你真的会玩SQL吗?无处不在的子查询

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

随机推荐

  1. hdu1814 Peaceful Commission

    hdu1814 Peaceful Commission 题意:2-sat裸题,打印字典序最小的 我写了三个 染色做法,正解 scc做法,不管字典序 scc做法,错误的字典序贪心 #include &l ...

  2. 201771010126 王燕《面向对象程序设计(Java)》第十二周学习总结

    实验十二  图形程序设计 实验时间 2018-11-14 1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: 创建空框架 . 在Java中,常采用框架(Frame) ...

  3. SpringBoot+ Mybatis 搭建

    spring boot+mybatis整合   LZ今天自己搭建了下Spring boot+Mybatis,比原来的Spring+SpringMVC+Mybatis简单好多.其实只用Spring bo ...

  4. node01

    ---恢复内容开始--- 1.node初体验 安装完成node,写好相应的js代码后,在cmd中node 文件名即可完成编译执行过程. 2.尝试使用node搭建一个简单服务器 //引入http模块 c ...

  5. Qt5+MSVC2015编译器编译发布的Release程序运行崩溃,如何查找崩溃的原因??

    除了加log信息,还有什么方法?? ==================================2019/4/26============================= 1 常见的c++内 ...

  6. AtiveMQ初次连接的 http error:503 连接错误 Prolem accessing /.Reason : Service Unavailable

    503错误 说明是服务器内部的错误了 这是 为什么嫩  这是因为你的Linux虚拟机(我用的是centos版本的)的机器名 和 你的 ip地址的映射关系 不一致  导致访问失败 查看机器名的地址:ca ...

  7. idea远程打断点

    (1)用如下方式启动jar java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar durati ...

  8. 七种经典排序算法及Java实现

    排序算法稳定性表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是不稳定的,否则是稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 下 ...

  9. Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖

    什么是ui-router ui-router是AngularUI库最有用的组件之一(AngularUI库由AngularJS社区构建).它是一个第三方路由框架,允许通过状态机制组织接口,而不是简单的U ...

  10. [Swift]LeetCode239. 滑动窗口最大值 | Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...