记一次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

原文地址:https://www.cnblogs.com/-zhong/p/10950749.html