攻防世界WEB进阶——Cat wp

首先打开题目是个发现是个云端测试
提示输入域名

先输个baidu.com

没反应
输入百度的ip 220.181.38.148
反馈了

	PING 220.181.38.148 (220.181.38.148) 56(84) bytes of data.

--- 220.181.38.148 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

再输入127.0.0.1
反馈了

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.064 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.064/0.064/0.064/0.000 ms

可以看出执行了ping并返回结果
试试用管道执行命令
127.0.0.1 | ls
返回Invalid URL

看来是行不通

因为这是传输的域名
通过url参数传递数据
所以应该可以传递url编码

试一试%70
没问题可以正常传输
攻防世界WEB进阶——Cat wp_第1张图片
变成了p

进行fuzz
发现超过0x7F(127)都会报错
url编码使用 16进制 编码
标准ascll码范围是0-127
超过127都会报错

尝试输入%80(ascll码128)
报错
页面返回报错信息
攻防世界WEB进阶——Cat wp_第2张图片
通过报错信息判断后台至少运行了 php 和 django
攻防世界WEB进阶——Cat wp_第3张图片

攻防世界WEB进阶——Cat wp_第4张图片
OK懵了
看看大佬的wp
发现关键点在curl文件上传php组件
搜了一下
关键又在CURLOPT_POSTFIELDS这个参数

CURLOPT_POSTFIELDS

全部数据使用HTTP协议中的 “POST” 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ‘;type=mimetype’ 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似’para1=val1¶2=val2&…’,也可以使用一个以字段名为键值,字段数据为值的数组。 如果value是一个数组,Content-Type头将会被设置成multipart/form-data。 从 PHP 5.2.0 开始,使用 @ 前缀传递文件时,value 必须是个数组。 从 PHP 5.5.0 开始, @ 前缀已被废弃,文件可通过 CURLFile 发送。 设置 CURLOPT_SAFE_UPLOAD 为 TRUE 可禁用 @ 前缀发送文件,以增加安全性。

网站是使用Django进行开发的,结合PHP可以通过在参数中注入@来读取文件的漏洞,依次查看python的配置文件和数据库得到flag的内容

不清楚大佬是怎么知道php版本是不是5.5.0版本及以上的
也就是说@前缀有没有废弃 CURLOPT_SAFE_UPLOAD 有没有被设置为TRUE

以为是通过Content-Type头被设置为multipart/form-data来看的
但是我的Content-Type头不是啊
攻防世界WEB进阶——Cat wp_第5张图片
有没有大佬帮忙给教一下ORZ
谢谢大佬,给大佬磕头ORZ

接下来就比较简单了
通过@构造payload读取文件

先看看django的配置文件 settings.py
payload:

?url=@/opt/api/api/settings.py

CTRL+F 搜一下database
攻防世界WEB进阶——Cat wp_第6张图片

数据库为sqlite3
django默认使用sqlite3数据库,看来题主没有做任何修改

看看
payload:
?url=@/opt/api/database.sqlite3

CTRL+F
搜索ctf
攻防世界WEB进阶——Cat wp_第7张图片

拿到
WHCTF{yoooo_Such_A_G00D_@}

你可能感兴趣的:(ctf)