进入页面看到有个输入框,见提示输入域名baidu.com测试

发现无任何回显,输入127.0.0.1或localhost测试

发现执行成功,执行的是一个ping命令
于是就想着可能是命令拼接执行,但是输入任何有关的字符串就会提示invalid url

所以可以想到系统对这些字符串进行了过滤,此外可以看到该题是通过get来传参的
于是在?url=这里,我们传递个%79后发现,%79被编码为y

看来是可以传递url编码,系统会接受并进行解析,于是我们传递%80会出现报错,url编码使用的是16进制,80也就是128,ASCII码是从0-127,所以这个时候会报错。
url编码表可以参考http://www.w3school.com.cn/tags/html_ref_urlencode.html
出现报错信息,是一段html代码,将这些代码复制到记事本后改为html文件打开

这是django报错的页面,所以是将输入的参数传到了后端的django服务中进行解析,但django设置了编码为gbk导致错误编码了宽字符(超过了ascii码的范围)
而此时想到前面的@字符没有被过滤
在比赛原题是有个提示的:

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

这是关于php curl的,于是可以找到php curl中关于@的相关知识点

所以我们能够使用@读取文件内容
再结合django的报错得知了项目的绝对路径为/opt/api

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

读取settings.py文件,这里需要注意django项目生成时settings.py会存放在项目目录下再以项目名称命名的文件夹下面。

同样在使用@读取数据库信息

在报错信息中搜索CTF得到flag。