image.png
    打开题目看一眼,就觉得应该是命令执行
    试了下www.baidu.com,loli.club,都没反应,然后尝试了下127.0.0.1,有回显了

    1. PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
    2. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.036 ms
    3. --- 127.0.0.1 ping statistics ---
    4. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
    5. rtt min/avg/max/mdev = 0.036/0.036/0.036/0.000 ms

    测试||&&;,无一例外,全都报错
    image.png
    到这里就一点思路没有了,看了wp后,才知道当输入大于%7F的值时,网站会报错,回显的内容是一堆html代码,将其保存到html文件中打开:
    image.png
    可以看到后台是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&para2=val2&...‘,也可以使用一个以字段名为键值,字段数据为值的数组。 如果value是一个数组,Content-Type头将会被设置成multipart/form-data。 从 PHP 5.2.0 开始,使用 @ 前缀传递文件时,value 必须是个数组。 从 PHP 5.5.0 开始, @ 前缀已被废弃,文件可通过 CURLFile 发送。 设置 CURLOPT_SAFE_UPLOADtrue 可禁用 @ 前缀发送文件,以增加安全性。

    总结一下就是可以使用@读取文件内容。
    django项目下一般有个settings.py文件是设置网站数据库路径(django默认使用的的是sqlites数据库),如果使用的是其它数据库的话settings.py则设置用户名和密码。
    于是就可以使用@/opt/api/settings.py来读取数据库路径。

    需要注意一点的是,django项目生成时settings.py会存放在以项目目录下再以项目名称命名的文件夹下面,也就是@/opt/api/api/settings.py
    然后由于Django编码的原因报错,在错误信息里面可以看到数据库路径
    image.png
    最后去读取数据库,即可得到flag。

    但其实最后一步读取settings.py并没有必要,当输入%80报错时,报错回显的信息中就包含了很多敏感信息,其中就包括数据库路径。