代码审计--CTF

1. extract变量覆盖漏洞


<?php

$flag='xxx'; 
extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    { 
        echo'ctf{xxx}'; 
    }
   else
   { 
    echo'Oh.no';
   } 
   }

?>

当file_get_contents函数里面是一个不可读的路径,那么content的内容就是空,然后我们在初始化的时候将shiyan置空,那么$shiyan==$content就会成立,就会直接输出我们想要的内容。

2. 绕过空白字符

<?php

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

ini_set("display_error", false); //为一个配置选项设置值
error_reporting(0); //关闭所有PHP错误报告

if(!isset($_GET['number'])){
   header("hint:26966dc52e85af40f59b4fe73d8c323a.txt"); //HTTP头显示hint 26966dc52e85af40f59b4fe73d8c323a.txt

   die("have a fun!!"); //die — 等同于 exit()

}

foreach([$_GET, $_POST] as $global_var) {  //foreach 语法结构提供了遍历数组的简单方式 
    foreach($global_var as $key => $value) { 
        $value = trim($value);  //trim — 去除字符串首尾处的空白字符(或者其他字符)
        is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串
    } 
} 


function is_palindrome_number($number) { 
    $number = strval($number); //strval — 获取变量的字符串值
    $i = 0; 
    $j = strlen($number) - 1; //strlen — 获取字符串长度
    while($i < $j) { 
        if($number[$i] !== $number[$j]) { 
            return false; 
        } 
        $i++; 
        $j--; 
    } 
    return true; 
} 


if(is_numeric($_REQUEST['number'])) //is_numeric — 检测变量是否为数字或数字字符串 
{

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

}
elseif($req['number']!=strval(intval($req['number']))) //intval — 获取变量的整数值
{

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


trim函数会移除空白,然后也会移除

  • “\0” - NULL
  • “\t” - 制表符
  • “\n” - 换行
  • “\x0B” - 垂直制表符
  • “\r” - 回车
  • “ “ - 空格

$value = trim($value)之后$value为%0c191,四个字符,过滤了%00(NULL)
addslashes会添加反斜杠

  • 单引号(’)
  • 双引号(”)
  • 反斜杠(\)
  • NULL
    is_numeric只是检测的是否是数字,01a就不是数字,0x1十六进制是,我们的是
    is_numeric($_REQUEST['number'])这边是通过$_REQUEST[‘number’]进行判断,所以直接是false,然后进入下一个判断,下一个是判断是否是一个191,也就是开头首个数字和最后的数字是否相等,intval($req[‘number’]),$req[‘number’]是一个%0c191,然后intval之后就是191,这边如果是%00%0c191那么转换就是0这个时候是不相等的。他们两个不相等就会跳过去,然后最后得is_palindrome_number,这个函数时候number是%0c191是四个肯定是不对称所以跳过。

0x03 多重加密

0x04 sql注入_WITH ROLLUP绕过


  转载请注明: 星晴 代码审计--CTF

 上一篇
flask框架学习笔记 flask框架学习笔记
0x01 flask简介flask有两个依赖,一个是WSGI(web服务器网关接口)工具集,一个是WSGI(web server werkzeug),另一个是jinja2模板引擎,flask是一个可扩展的框架。 注解:WSGI(web se
2019-07-10 starjian
下一篇 
windows提权 windows提权
1. 漏洞收集 0day库 exploit-db 0da’y https://securitytracker.com/ https://www.rapid7.com/db/modules/ https://cxsecurity.com/
2019-05-23 starjian
  目录