【XCTF 攻防世界】WEB 高手进阶区 Cat

题目链接https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=4658&page=2
【说在前面】:这道题需要的知识有flask,django等知识,所以部分知识我是从其他wp看的,(相关知识仍在补充中
【相关知识】:

  • php cURL CURLOPT_SAFE_UPLOAD
  • django DEBUG mode
  • Django使用的是gbk编码,超过%7F的编码不在gbk中有意义
  • 当 CURLOPT_SAFE_UPLOAD 为 true 时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求,来读取文件。当且仅当文件中存在中文字符的时候,Django 才会报错导致获取文件内容。

-----------------------------------------分割线--------------------------------------
进入链接是下面一个界面
【XCTF 攻防世界】WEB 高手进阶区 Cat
想到可能是命令注入,(利用ping语句)

但是试了好几个域名(baidu.com这样的)发现显示不出来东西

试一下baidu.com & ifconfig
显示无效的url

想到可能让输入ip地址,可以
【XCTF 攻防世界】WEB 高手进阶区 Cat
但是payload:127.0.0.1|phpinfo();仍然显示无效url

猜测我们的输入当中存在有非法字符导致命令无法执行,fuzz一下可使用的字符只剩下了数字,英文字母和.,这么一想构造任意命令执行似乎无法实现了。

这里使用的工具是kali自带的wfuzz
相关fuzz工具:网络攻防之——Fuzz工具
WFUZZ使用教程

在URL的传参处?url=这里,我们传递个%79发现传递之后变成了?url=w,看来是可以传递url编码,系统会接受并进行解析,于是我们传递%80会出现报错,url编码使用的是16进制,80也就是128,ASCII码是从0-127,所以这个时候会报错。url编码表可以参考http://www.w3school.com.cn/tags/html_ref_urlencode.html
(?url=%79转码后可以看到转成了y,?url=%7A转码后可以看到转成了z,后面一直到%7F都是非法符号,会返回Invalid URL)

报错信息中可以看到:
【XCTF 攻防世界】WEB 高手进阶区 Cat
在比赛的时候有个提示:

RTFM of PHP CURL===>>read the fuck manul of PHP CURL???

【XCTF 攻防世界】WEB 高手进阶区 Cat
意思是可以用@读取文件内容。

将所有html代码复制下来另存为一个网页(为了获取更多内容)可以看到:
【XCTF 攻防世界】WEB 高手进阶区 Cat
往下翻可以看到【XCTF 攻防世界】WEB 高手进阶区 Cat
那么可以根据这个路径,进行数据库访问
payload:[email protected]/opt/api/database.sqlite3

或者可以根据最前面的
【XCTF 攻防世界】WEB 高手进阶区 Cat
结合django的报错得知了项目的绝对路径为/opt/api

这里还需要懂一些django开发的基本知识,我感觉这道题涉及的面有点广了,django项目下一般有个settings.py文件是设置网站数据库路径(django默认使用的的是sqlites数据库),如果使用的是其它数据库的话settings.py则设置用户名和密码。除此外settings.py还会对项目整体的设置进行定义。

读取settings.py文件,这里需要注意django项目生成时settings.py会存放在以项目目录下再以项目名称命名的文件夹下面
payload:[email protected]/opt/api/api/settings.py
然后搜索database可以获得相关信息
payload和前一个一样

然后,在数据库页面搜索xtf得到flag【XCTF 攻防世界】WEB 高手进阶区 Cat
参考:https://www.cnblogs.com/chalan630/p/13216583.html