type
Post
status
Published
date
Jan 14, 2026
slug
buuctf-web-21-40
summary
BUUCTF平台刷题笔记-WEB
tags
CTF
WEB
category
CTF
icon
password

21-25

21. [BJDCTF2020]Easy MD5

根据题目给的链接找到源码下载并查看
BJDCTF2020_January
BjdsecCAUpdated Feb 2, 2026
根据index.php的内容,进入该页面后会跳转到leveldo4.php
接着根据leveldo4.php的内容,满足条件后跳转到levels91.php
根据levels91.php的内容,满足条件后继续跳转到levell14.php
最后是levell14.php的内容
知道了这个逻辑,我们可以直接访问levell14.php,然后传入参数
传入数组绕过强比较
notion image

22. [MRCTF2020]你传你🐎呢

尝试上传php文件,发现被过滤,上传图片成功
先上传一个.htaccess配置文件,作用是把aaa.png当成php来解析
notion image
然后上传一句话木马
notion image
然后使用蚁剑连接,访问 http://deb8a5cb-efd7-40f4-8a47-550ea77cc2e9.node5.buuoj.cn:81/upload/bc0bf6c34fe8cf7ceb173f3ea3e33335/aaa.png
连接后进入根目录,拿到flag
notion image

23. [护网杯 2018]easy_tornado

进入靶场,在flag.txt中得到提示flag in /fllllllllllllag,然后在hint.txt中得知md5(cookie_secret+md5(filename))
搜索tornado可知它是python的一个模版,这题是一个ssti注入
查询相关资料,可知render是Tornado框架中的一个核心方法,用于将动态数据渲染到HTML模板中。它通过传递参数生成不同的网页内容
notion image
Tornado的模板引擎在渲染时,会将双花括号{{ }}中的内容识别为Python表达式并执行:
模板中的{{变量名}}会被替换为当前作用域中该变量的值。
模板上下文默认包含handler对象,通过它可以访问请求相关的所有属性和方法。

handler.settings的特殊性

handler.settingsRequestHandler的一个属性,指向Application.settings(即Tornado应用的全局配置字典)。这个字典包含敏感信息
当用户输入被直接拼接到模板中且未经过滤时,攻击者可以注入模板语法:

如果用户提交msg={{handler.settings}}
1.模板引擎会解析{{handler.settings}}
2.从当前handler对象中获取settings属性。
3.将整个配置字典渲染到页面中,导致信息泄露
查询文档可知cookie_secretsettings
notion image
14973e00-1166-4b78-95fe-f6ab1201874d
拿到cookie_secret后,根据提示进行加密,然后访问得到的结果链接,最后成功拿到flag
notion image

24. [MRCTF2020]Ez_bypass

进入靶场,源代码如下:
第一个md5强类型比较用数组绕过
第二个传入一个非数字的变量但其值等于1234567用末尾加空格绕过
notion image

25. [ZJCTF 2019]NiZhuanSiWei

使用data://伪协议来构造$text
?text=data://text/plain,welcome to the zjctf
然后变量file不能带有flag,根据下面的提示,需要查看useless.php的内容
使用php://filter绕过file=php://filter/read=convert.base64-encode/resource=useless.php
拿到base64加密后的源码
解码后如下:
使用php运行如下代码,得到序列化后的结果
结果:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
于是最终传入http://0200d3e2-81b9-408c-87b6-96052fd366f9.node5.buuoj.cn:81/?text=data://text/plain,welcome to the zjctf&file=php://filter/resource=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} 即可拿到flag

26-30

26. [极客大挑战 2019]HardSQL

网上找了一个字典
web-sercuity-sql-dictionary
131A3D7Updated Sep 1, 2025
使用bp抓包后进行爆破,看看哪些关键字被过滤,观察后发现报错注入的关键字没有被过滤,用户名输入1'or'1'#成功登入,说明闭合号是单引号
updatexml() 用于更新XML数据,它接受3个参数
在 MySQL 中使用 updatexml() 函数报错时,它通常会抛出一个 XPATH 语法错误,并将你传入的第二个参数(即 XPath 表达式)的一部分直接显示在错误信息中
第一、三个参数肯定会报错,所以我们将 database() 放在中间,这样就会执行显示出数据库名
可以再加上 concat() 函数将显示内容包裹起来,0x7e 即波浪号 ~
先显示数据库名
notion image
然后再看表,这里等号被过滤了用like代替
notion image
然后爆破字段
notion image
然后查字段内容,得到flag
notion image
这里没有显示全,使用right突破字符串限制
notion image

27. [网鼎杯 2020 青龙组]AreUSerialz

进入靶场给了php代码
审计代码可知:
  • 只有当 $op==2 的时候才可以读取文件
  • 我们需要绕过 is_valid() 函数的检测,该函数检测我们传入的每个值只能是ASCII码 32 到 125 之间的。由于 FileHandler 类中的三个属性都是受保护的,因此这里必将会用到 00 字节,我们需要想办法绕过。
php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public进行绕过即可
 
执行如下php代码得到序列化后的值
最终将该值传入参数得到flag
notion image

28. [GXYCTF2019]BabyUpload

首先尝试上传php文件,页面提示”后缀名不能有ph!”
尝试上传png,也不让,提示“上传类型也太露骨了吧!”
直接抓包跟着提示走一遍
notion image
把filename的后缀改一下,重新发包
notion image
尝试修改content-type的内容,尝试了image/gifimage/pngimage/jpeg均失败
notion image
可以看出这题需要上传image/jpeg类型,且对上传内容做了检查
可以使用如下内容进行绕过
发包后显示上传成功
notion image
访问刚刚上传得到的路径,发现服务器是Apache
notion image
因此可以上传一个.htaccess配置文件,将刚才上传的文件按php来进行解析
使用蚁剑访问刚才上传木马得到的网址并连接:
http://59c1546d-daa3-494a-8b7e-133482a1cbb3.node5.buuoj.cn:81/upload/7f2d4fb67ccb59641a93a2695a8e2e34/1.p123hp
进入后在根目录拿到flag
notion image

29. [SUCTF 2019]CheckIn

跟上一题一样,也是先抓包发一个php看一下
notion image
然后改一下filename再发一次,提示内容被限制
notion image
更改内容(上传的时候POST里的参数忘加引号了,后面重新传了一次2.png)
再发包,提示类型不是图片
notion image
查了一下提示给的函数,它读取一个图像的第一个字节并检查其签名。
因此使用GIF89a图片文件头欺骗
notion image
上传之后还没成功,这只是图片马,无法被解析运行,因此还需要用到.user.ini文件
这里看一下大佬写的文章
然后传入以下内容
notion image
最后使用蚁剑连接拿到flag
notion image

30. [GXYCTF2019]BabySQli

使用bp抓包,方便调试,输入一个admin'根据返回结果可以判断闭合使用的是单引号
notion image
然后在靶场页面输入并跳转,查看跳转后的search.php页面的源码,
notion image
Base32是一种使用32个字符集对数据进行编码的方法,这些字符包括A-Z和2-7的数字。
可以看出上面是一段base32编码,解码后得到一段base64编码值,再次解码得到sql语句
notion image
然后使用联合查询确定字段数,这道题禁用了orderby。2列时报错,3列时不报错,可以确定有3个字段
notion image
notion image
根据提示是密码错误而不是账号错误,说明账户名还是admin
接下来根据题目给的链接查看search.php的源码
可以看到他进行了一个md5加密
而且会取一行数据进行判断
mysql_fetch_row() 从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。
联合注入有个技巧。在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。
因此构造payload如下,这里name后面的第一个参数不能用admin ,因为这会导致取到真正的admin对应的数据
发包后拿到flag
notion image

31-35

31. [GYCTF2020]Blacklist

使用1' 进行注入,根据报错结果可以知道闭合是单引号
尝试使用报错注入,根据返回结果可知以下关键字被过滤
notion image
尝试堆叠注入1';show tables;获取表的名称
notion image
然后查看表中的列1';show columns from FlagHere;
notion image
然后使用handler语句来获得flag
1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;
notion image

32. [RoarCTF 2019]Easy Java

点击help按钮进行跳转,抓包发现是GET方法尝试下载help.docx文件,但是报错。在BP中右键更改请求方法,使用post方法下载,得到文件内容如下
notion image
没啥有用的信息。
接下来是前置知识:
WEB-INF是Java的WEB应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。WEB-INF主要包含一下文件或目录:
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞成因:通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的优点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,可能会引发一些的安全问题,导致web.xml等文件能够被读取。
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来(这样耦合性太高了),修改Nginx配置文件禁止访问WEB-INF目录就好了: location ~ ^/WEB-INF/* { deny all; } 或者return 404; 或者其他!
 
下载web.xml,下面是结果
根据xml文件,直接猜测Flag类的文件路径WEB-INF/classes/com/wm/ctf/FlagController.class
notion image
下载后得到的文件拿到在线网站进行反编译
结果如下:
将上面的base64编码解码之后得到flag=flag{c58ecfe4-f44e-442e-ac12-54d53f8ab6dc}

33. [CISCN2019 华北赛区 Day2 Web1]Hack World

输入1,2有结果,输入3报错,可以查到2条数据
测试数据1'可以发现是bool类型
notion image
使用布尔盲注来得到flag,脚本如下:
得到结果
notion image
这里存一下大佬的完整脚本

34. [BSidesCF 2020]Had a bad day

给了两个按钮,点击一个后url变为:http://8151e4e2-fc8e-4775-a0b3-3b24d0b829fd.node5.buuoj.cn:81/index.php?category=woofers
联想到文件包含漏洞。尝试使用category=php://filter/read=convert.base64-encode/resource=index.php
notion image
发现后端会自己加上php后缀,于是去掉php后缀重新访问,然后查看源代码得到经过base64加密后的index.php
解码后结果如下:
接下来包含flag.php文件即可?category=meowers/../flag
查看源代码,可以看到图中的提示注释
notion image
然后使用base64编码访问再解码即可得到flag
解码后得到flag

35. [网鼎杯 2020 朱雀组]phpweb

抓包,发现post有两个参数funcp
notion image
分析结果可知,func传入的是函数名,p传入的是参数
于是查看源码,使用payload:func=file_get_contents&p=php://filter/read=convert.base64-encode/resource=index.php
notion image
将base64编码后的内容解码后,相关php内容如下所示:
在代码里注意到了__destruct()函数,此函数会在类被销毁时调用,那我们如果反序列化一个类,在类里的参数中写上我们要执行的代码和函数,这样的话就会直接调用gettime函数,而不会执行in_array($func,$disable_fun),那我们就绕过了黑名单的判断
因此构造payload:func=unserialize&p=O:4:"Test":2:{s:4:"func";s:6:"system";s:1:"p";s:2:"ls";}
序列化代码
notion image
这是执行后查到的结果,接着重新查找下flag的位置信息
notion image
然后根据这个路径/tmp/flagoefiu4r93 ,得到flag
notion image

36-40

36. [网鼎杯 2018]Fakebook

使用dirsearch扫描目录,使用方法如下
访问robots.txt提示:
根据提示访问/user.php.bak,下载该文件,其内容如下:
这段话会初始化一个初始化一个cURL会话,返回一个句柄(resource)
设置cURL选项,指定要请求的URL,1 表示开启执行curl_exec()
返回响应内容而不是直接输出,这里就存在SSRF漏洞
这里先注册一个账号,如下图所示
notion image
点击蓝色部分,跳转至对应页面。理论上应该正常跳转
notion image
一直返回响应超时,也是没招了。后续就是先用sql注入,然后构造对象进行反序列化。

37. [BJDCTF2020]The mystery of ip

进入靶场,在flag处看到ip值
notion image
结合题目“ip的秘密”,可能存在XFF注入,对flag界面进行抓包
添加XFF头
notion image
最后构造下图payload,拿到flag
notion image

38. [BJDCTF2020]ZJCTF,不过如此

进入页面,php代码如下:
使用如下payload:http://83974e36-4519-44d1-b4c5-7e1ef057dfce.node5.buuoj.cn:81/?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php ,拿到编码后的next.php
base64解码后得到内容
根据上面链接的内容,构造如下payload,得到flag
notion image

39. [BUUCTF 2018]Online Tool

这段代码块检查请求中是否设置了HTTP_X_FORWARDED_FOR头部。如果设置了,它将REMOTE_ADDR设置为HTTP_X_FORWARDED_FOR的值。这通常用于处理Web服务器位于代理后面的情况。 然后这里使用escapeshellargescapeshellcmd来试图阻止命令注入,但其存在漏洞,如下文章所示
查阅资料可知,nmap存在一个参数可以将命令和结果写入到文件
因此可以使用以下payload
?host=' <?php echo `cat /flag`;?> -oG 111.php '
使用后得到沙箱sandbox变量值
notion image
然后访问刚刚写入的文件http://57433c02-6604-46e9-8cb0-ee1a642d70aa.node5.buuoj.cn:81/e6305cd14dbe6e1fc4041d81cb3fc9ee/111.php
得到flag
notion image

40. [GXYCTF2019]禁止套娃

先用dirsearch扫描
dirsearch -u http://b190317e-bfc0-46bd-b8eb-998f2b0f1b9d.node5.buuoj.cn:81/ -x 429 -i 200,403 -t 5
notion image
没发现什么有用信息,怀疑是git源码泄露。使用githack工具,如下图所示,得到index.php
GitHack
lijiejieUpdated Feb 14, 2026
notion image
拿到源码,如下:
接下来是代码审计
  • 首先是过滤了几个伪协议:data://filter://php://phar://
  • (?R)?: (?R)代表当前表达式,就是这个[a-z,_]+\(( [a-z,_]+\((?R)?\) )?\) ,所以会一直递归,?表示递归当前表达式0次或1次,例如f(g(h()))
也就是说,这是一个无参数RCE
localeconv()函数返回一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."。
因此可以构造payload
?exp=var_dump(scandir(pos(localeconv())));
notion image
然后发现我们想要的内容flag.php在倒数第二个,因此可以倒序输出第二个,使用高亮函数来获取内容
?exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
notion image
 
BUUCTF刷题笔记(WEB)1-20论文精读
Loading...