PHP语言学习之你真的会PHP吗?
小标 2019-02-22 来源 : 阅读 985 评论 0

摘要:本文主要向大家介绍了PHP语言学习之你真的会PHP吗?通过具体的内容向大家展示,希望对大家学习php语言有所帮助。

本文主要向大家介绍了PHP语言学习之你真的会PHP吗?通过具体的内容向大家展示,希望对大家学习php语言有所帮助。

PHP语言学习之你真的会PHP吗?

刚刚做了实验吧的题目,现在整理一下


写出解题思路,希望能够帮助到那些需要帮助的人


所有的wp都是以一题一篇的形式写出


主要是为了能够让读者更好的阅读以及查找,


希望你们不要责怪!!共勉!!!


你真的会PHP吗?分值:30


来源: 实验吧


难度:中


参与人数:4163人


Get Flag:714人


答题人数:888人


解题通过率:80%


你真的会PHP吗?


会?还是不会?


解题链接: //ctf5.shiyanbar.com/web/PHP/index.php 


解题思路:这一题可以get需要知识点,也可以回忆一下关于以前的知识


点击链接,进行抓包处理就会得到:


进入这个链接就会得到://ctf5.shiyanbar.com/web/PHP/6c525af4059b4fe7d8c33a.txt


<?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); 
        is_string($value) && $req[$key] = addslashes($value); 
    } 


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"]);
     $value2 = intval(strrev($req["number"]));  

     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;


接下来进行代码审计:


if(is_numeric($_REQUEST[‘number‘])){
    
   $info="sorry, you cann‘t input a number!";//条件1:输入的不能只是数字
 
}elseif($req[‘number‘]!=strval(intval($req[‘number‘]))){
      
     $info = "number must be equal to it‘s integer!! ";  //条件2:输入的值经过变整型又变成字符型后应该与原来一样
 
}else{
 
     $value1 = intval($req["number"]);
     $value2 = intval(strrev($req["number"]));  
 
     if($value1!=$value2){//条件3:输入的值直接变成整型应该和其颠倒之后再变成整型一样
          $info="no, this is not a palindrome number!";
     }else{
          
          if(is_palindrome_number($req["number"])){//条件4:输入的不能是回文,就是颠倒和原来不能一样
              $info = "nice! {$value1} is a palindrome number!"; 
          }else{
             $info=$flag;
          }
     }
 
}
 
echo $info;


我看writeup看到有两种解法:


利用intval溢出


intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。
举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。


64 位系统上,最大带符号的 integer 值是 9223372036854775807。


通过上面我们知道服务器的操作系统是32位的,所以我们构造2147483647就可以同时满足2,3条件。


通过把空字符可以绕过is_numeric的判断(如%00,%20),所以我们构造以下poc,


number=2147483647%00 和number=2147483647%20都可。 
我们来看上面的payload是怎么绕过上面的条件的,


首先因为我们post的number中包含%00或者%20这样的空字符,


所以在is_numeric判断时,会返回false,接下来 
$req[‘number‘]!=strval(intval($req[‘number‘])) 
intval会忽略掉我们的空字符%00与%20,所以这里也就绕过了,然后:


$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"])); 


这两个值要相等,由于我们输入的number已经达到了intval的最大值,


所以当执行strrev后,得到7463847412这个值,这个值经过intval转换为2147483647,所以这两个值相等了。 
但是2147483647又不是回文数,所以得到flag。


注:strval会忽略掉%00与%20 
注:如果你输入number=’1’这样的字符,后台存储的字符串时’\’1\”,意思就是会把引号作为你输入的字符串的一部分。


这是个很奇怪的特性,大家可以测试一下 
注:其中很多细节,我是通过把源码拷贝到本地执行得到的结果,大家也可以测试一下自己的想法。



0x02科学记数法绕过


因为要求不能为回文数,但又要满足intval(req["number"])=intval(strrev(req["number"])=intval(strrev(req[“number”])),


所以我们采用科学计数法构造poc为number=0e-0%00,这样的话我们就可以绕过。 
一定要时-0,才不会被判定为回文数


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言PHP频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程