zoukankan      html  css  js  c++  java
  • 记一次CTF实验吧的代码审计

    0X01

    0X01

    Burp抓包找到hint 访问地址看源码

    <?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;

    0X02详细的函数解释

    ini_set

    PHP ini_set用来设置php.ini的值,在函数执行的时候生效,对于虚拟空间来说,很方便,下面为大家介绍下此方法的使用

    PHP ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效。无需打开php.ini文件,就能修改配置,对于虚拟空间来说,很方便。 

    函数格式:string ini_set(string $varname, string $newvalue) 

    不是所有的参数都可以配置,可以查看手册中的列表。 

    常见的设置: 

    @ ini_set('memory_limit', '64M'); 

    'menory_limit':设定一个脚本所能够申请到的最大内存字节数,这有利于写的不好的脚本消耗服务器上的可用内存。@符号代表不输出错误。 

    @ini_set('display_errors', 1); 

    ‘display_errors':设置错误信息的类别。 

    @ini_set('session.auto_start', 0); 

    ‘session.auto_start':是否自动开session处理,设置为1时,程序中不用session_start()来手动开启session也可使用session, 

    如果参数为0,又没手动开启session,则会报错。 

    @ini_set('session.cache_expire', 180); 

    ‘session.cache_expire':指定会话页面在客户端cache中的有限期(分钟)缺省下为180分钟。如果设置了session.cache_limiter=nocache时,此处设置无 效。 

    @ini_set('session.use_cookies', 1); 

    ‘session.use_cookies':是否使用cookie在客户端保存会话ID; 

    @ini_set('session.use_trans_sid', 0); 

    ‘session.use_trans_sid':是否使用明码在URL中显示SID(会话ID), 

    默认是禁止的,因为它会给你用户带来安全危险: 
    1.用户可能将包含有效的sid的URL通过email/irc/QQ/MSN等途径告诉其他人。 
    2.包含有效sid的URL可能会保存在公用电脑上。 
    3.用户可能保存带有固定不变的SID的URL在他们的收藏夹或者浏览历史记录里。 基于URL的会话管理总是比基于Cookie的会话管理有更多的风险,所以应当禁用。

    上面讲了一大堆 这里主要就是这个意思

    这两句是什么意思,谁能详细解释一下,ini_set()函数里面的俩个参数分别代表什么意思
    ini_set('display_error',!IS_ENV_PRODUCTION);
    ini_set('error_log','log/phperror.txt');
    请高手指点

    第一个参数配置文件中的变量名,第二个参数是要赋的值。
    比如配置文件中有这么一行:path=‘’
    那么ini_set('path', 'c:windows')的作用就是把这行改成
    path='c:windows'

    error_reporting(0)
    <?php
     // 关闭错误报告
     error_reporting(0);
    
     // 报告 runtime 错误
     error_reporting(E_ERROR | E_WARNING | E_PARSE);
    
     // 报告所有错误
     error_reporting(E_ALL);
    
     // 等同 error_reporting(E_ALL);
     ini_set("error_reporting", E_ALL);
    
     // 报告 E_NOTICE 之外的所有错误
     error_reporting(E_ALL & ~E_NOTICE);
    ?> 
    !isset
    isset是判断一个变量是否定义过
    即使它没有值,返回值也是true
    比如$name="";或var $name;
    那么if(isset($name))echo 1;
    它也会输出1,因为$name被定义了
    但if($name!="")echo 1;或if(!empty($name))echo 1;
    它就不会输出1,因为$name虽然被定义了,但它是空的 
    header
    header(string,replace,http_response_code)
    参数     描述
    string     必需。规定要发送的报头字符串。
    replace     
    可选。指示该报头是否替换之前的报头,或添加第二个报头。
    默认是 true(替换)。false(允许相同类型的多个报头)。
    http_response_code     可选。把 HTTP 响应代码强制为指定的值。(PHP 4 以及更高版本可用)
    die
    die() 函数输出一条消息,并退出当前脚本。
    该函数是 exit() 函数的别名。
    die(status)
    参数     描述
    status     必需。规定在退出脚本之前写入的消息或状态号。状态号不会被写入输出。
    foreach
    foreach (array_expression as $value) 输出 val1 val2 val3
    
    
    foreach (array_expression as $key => $value)  输出1=>val1;2=>val2;3=>val3;
    
    

    trim 实例
    <?php
    $str = "Hello World!";
    echo $str . "<br>";
    echo trim($str,"Hed!");
    ?>
    llo Worl
    addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
    
    预定义字符是:
    
        单引号('
        双引号("
        反斜杠()
        NULL

  • 相关阅读:
    [BZOJ1584][Usaco2009 Mar]Cleaning Up 打扫卫生
    CSS浮动
    Django by example -----1总结
    C#函数重载
    linux目录的特点
    Linux调优
    linux
    对齐方式
    19-10-25-G-悲伤
    19-10-24-H
  • 原文地址:https://www.cnblogs.com/-zhong/p/10950749.html
Copyright © 2011-2022 走看看