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
无回显攻击流程:
  1. 先调用%dtd,请求远程服务器(攻击服务器)上的evil.dtd。
  1. 再调用 evil.dtd中的 %file。%file 获取受攻击的服务器上面的敏感文件,然后将 %file 的返回结果传到%send 。
  1. 然后调用 %send; 把读取到的数据发送到远程服务器上。
 
对输入进行抓包,如下图
notion image
根据题目提示,猜测是XML注入,构造如下payload
重新发包后得到flag
notion image

42. [GWCTF 2019]我有一个数据库

进入靶场,是乱码
notion image
使用bp抓包,没有发现什么有用的信息
notion image
使用dirsearch扫描网站
dirsearch -u http://0d1bd4dc-16a1-4d36-81e9-c272439c6529.node5.buuoj.cn:81/ -x 429 -i 200,403 -t 5
notion image
访问robots.txt,结果如下:
notion image
然后根据目录扫描结果再访问phpmyadmin
notion image
在上图界面右下角可以看到phpmyadmin的版本是4.8.1,该版本存在漏洞
构造payload:
target=db_export.php%253f/../../../../../../../../etc/passwd
notion image
这说明LFI执行成功,接下来尝试访问flag
target=db_export.php%253f/../../../../../../../../flag
notion image

43. [BJDCTF2020]Mark loves cat

使用dirsearch进行目录扫描
notion image
发现有git,想到使用githack工具
使用工具拿到源码
notion image
其中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
notion image

44. [WUSTCTF2020]朴实无华

扫描目录发现robots.txt,访问结果如下
notion image
访问该php,发现响应头中有提示
notion image
访问该文件后拿到源码
level1-intval()绕过
intval函数,此函数在处理数据时会在接触到字符串时停止,因此如果输入100e2之类的数据,会解释称100,但后面在执行+1时,100e2是解释称10000的,因此此处使用科学技术法绕过。
level2-md5绕过 思路就是通过找到一个0e开头的值,且md5加密后的内容也是0e开头的,使得条件为真。那么找到了满足条件的值:0e215962017
level3-str_ireplace绕过
先用ls命令查看文件目录
notion image
然后使用%09绕过空格拿到flag:?num=1e5&md5=0e215962017&get_flag=tac%09fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
notion image

45. [BJDCTF2020]Cookie is so stable

考点是SSTI的Twig模板注入
notion image
各种语言发生ssti注入的模版
输入{{7*‘7’}},返回49表示是Twig模块
输入{{7*‘7’}},返回7777777表示是Jinja2模块
notion image
该模版有通用的payload{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} 这里的id可以替换为任意代码
notion image
payload的输入位置在POST请求中的Cookie,在PHPSESSID后添加user字段
notion image

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
notion image
看到提示除了购买者和自己,于是加入X-Forwarded-For请求头,得到flag
notion image

48. [安洵杯 2019]easy_web

进入题目发现链接自带了参数
http://780bf6be-49d3-4db5-955a-620f305286a1.node5.buuoj.cn:81/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
解码img对应的部分,经过两次base64解码,再经过一次hex解码,得到555.png
notion image
于是尝试把index.php反向处理传入参数,处理后得到TmprZ05tVWdOalFnTmpVZ056Z2dNbVVnTnpBZ05qZ2dOekE9
notion image
发送后得到index.php的base64编码
notion image
解码后关键内容如下:
关键是执行echo `$cmd`命令需要满足if判断中的两个条件
利用反斜杠绕过过滤,然后绕过一个md5强比较
payload:
notion image

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。
黑名单中过滤了configself
url_for()会返回视图函数对应的URL
我们注入{url_for.__globals__}得到
notion image
然后注入/shrine/{{url_for.__globals__['current_app'].config}},得到flag
notion image

50. [安洵杯 2019]easy_serialize_php

观察代码可以知道它的处理流程:
首先接受一个名为f的get传参并赋值给了$function
然后$serialize_info = filter(serialize($_SESSION));将整个session序列化之后交给filter函数处理,然后赋值给$serialize_info
继续看题目的源码,可以知道在$userinfo = unserialize($serialize_info);这里进行反序列化
也就是说先序列化$_SESSION,然后再经过一个过滤函数,再反序列化出来。
然后看到phpinfo()那里有提示,查看后发现
notion image
整理思路:首先传参?f=show_image
然后使用file_get_contents函数来读取文件,即让其中$_userinfo[’img’]的值为这个文件的base64编码,从而读取到该文件的内容。
但是这里不能指定img,否则会被sha1函数加密,就不能被base64_decode解码
因此这里需要通过序列化来指定读取文件的路径,由于filter函数进行了过滤,一些敏感字符替换为空了,所以长度会缩短,这里就存在反序列化字符串逃逸漏洞。
原理:在构造键值的时候某些关键字被过滤掉了,但序列化后的字符串记录的长度不会因为过滤而改变,所以就会把序列化后的字符串的结构当做值的内容给读取
d0g3_f1ag.phpZDBnM19mMWFnLnBocA==
本地输出一下序列化之后的内容
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即可查看文件
notion image
执行后查看源代码得到下面的内容
/d0g3_fllllllagL2QwZzNfZmxsbGxsbGFn
替换命令后再次执行拿到flag
notion image

51-55

51. [BSidesCF 2019]Kookie

进入之后,在左上角发现提示:存在一个账号,其用户名为cookie,密码为monster
登录之后,把cookie中username字段的值改成admin,得到flag
notion image
notion image

52. [网鼎杯 2020 朱雀组]Nmap

进入题目,查看源代码发现提示flag位置
notion image
Nmap相关参数如下
  • iL 读取文件内容,以文件内容作为搜索目标
  • o 输出到文件
notion image
看上去会把输入的内容萍姐到nmap命令中
构建下面字符串127.0.0.1' -iL /flag -o aaa
127.0.0.1' -iL /flag -o aaa
'127.0.0.1'\'' -iL /flag -o aaa'
'127.0.0.1'\\'' -iL /flag -o aaa\'
执行之后,访问相关链接得到flag
notion image

53. [NPUCTF2020]ReadlezPHP

进入页面,查看源代码,发现可疑链接
notion image
点击该链接,得到php代码如下:
构造反序列化语句,这里使用assert()函数,assert()函数会执行括号里的命令,形如assert(phpinfo())是合法的。
传参:O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
notion image
搜索flag拿到flag

54. [CISCN2019 华东南赛区]Web11

smarty模版ssti注入
notion image

55. [强网杯 2019]高明的黑客

访问题目,根据题目下载压缩包,解压后得到3002个php文件
看样子是要写脚本找到存在漏洞可以获取flag的php文件,网上找师傅的脚本,修改后如下所示:
使用phpstudy搭建一个本地网站,然后执行该脚本
notion image
notion image
根据结果访问对应php,得到flag
http://b4a3ecd3-6d0d-441c-806e-85dd01529649.node5.buuoj.cn:81/xk0SzyKwfzw.php?Efa5BVG=cat /flag
notion image
 
BUUCTF刷题笔记(WEB)21-40论文精读
Loading...