您的位置:首页 > 其它

攻防世界WEB进阶——Cat wp

2019-07-31 18:54 1231 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_42499640/article/details/97891977

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

先输个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
没问题可以正常传输

变成了p

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

尝试输入%80(ascll码128)
报错
页面返回报错信息

通过报错信息判断后台至少运行了 php 和 django


OK懵了
看看大佬的wp
发现关键点在curl文件上传php组件
搜了一下
关键又在CURLOPT_POSTFIELDS这个参数

CURLOPT_POSTFIELDS

全部数据使用HTTP协议中的 “POST” 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ‘;type=mimetype’ 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似’para1=val1&para2=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头不是啊

有没有大佬帮忙给教一下ORZ
谢谢大佬,给大佬磕头ORZ

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

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

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

CTRL+F 搜一下database

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

看看
payload:

?url=@/opt/api/database.sqlite3

CTRL+F
搜索ctf

拿到
WHCTF{yoooo_Such_A_G00D_@}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: