打开题目看一眼,就觉得应该是命令执行
试了下www.baidu.com,loli.club,都没反应,然后尝试了下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.036 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.036/0.036/0.036/0.000 ms
测试||
、&&
、;
,无一例外,全都报错
到这里就一点思路没有了,看了wp后,才知道当输入大于%7F的值时,网站会报错,回显的内容是一堆html代码,将其保存到html文件中打开:
可以看到后台是django,因为Django使用的是gbk编码,超过%F7的编码不在gbk中有意义,所以%80会报错。
并且知道了路径为/opt/api
。
但是只有这些信息还是不够,其实这道题目原本是有一个提示:
RTFM of PHP CURL===>>read the fuck manul of PHP CURL???
在文档中curl_setopt
有这么一项:
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项目下一般有个settings.py文件是设置网站数据库路径(django默认使用的的是sqlites数据库),如果使用的是其它数据库的话settings.py则设置用户名和密码。
于是就可以使用@/opt/api/settings.py
来读取数据库路径。
需要注意一点的是,django项目生成时settings.py会存放在以项目目录下再以项目名称命名的文件夹下面,也就是@/opt/api/api/settings.py
。
然后由于Django编码的原因报错,在错误信息里面可以看到数据库路径
最后去读取数据库,即可得到flag。
但其实最后一步读取settings.py并没有必要,当输入%80报错时,报错回显的信息中就包含了很多敏感信息,其中就包括数据库路径。