题目来源:XCTF 4th-WHCTF-2017
0x01 题目描述
题目是个登录框,让输入自己的域名:

题目首页
0x02 题目分析
1. 输入百度的域名,baidu.com。没有响应,可以发现输入框的名字为url, 提交方式为GET方式。
输入localhost或者127.0.0.1,可以收到ping的结果。

输入localhost的结果
2. 考虑是否是命令拼接, 用 | ls 拼接,发现报错,应该是过滤了某些特殊字符

特殊字符被过滤
3. FUZZ一下,看是否有没被过滤掉的字符。(工具Wfuzz,使用方法)

发现@字符没有被过滤
4. 输入@,发现会被编码为%40(URL编码),尝试输入宽字符%bf,发现出现报错信息html格式的。

编码为%40
拷贝出来发现,用浏览器打开

发现django报错页面
出现上述报错的原因是因为,输入的参数会被传输到后端的django服务中进行解析,而diango设置了编码为gbk导致错误编码了宽字符。
联系前面的@未被过滤,查询得到

用@加绝对路径可以读取文件内容
0x03 解题流程
1. 由上面的报错信息,可以得到项目的绝对地址为“/opt/api”。再搜索django,知道其默认使用的是sqlites数据库。再次进行搜索发现类似sqlite的路径。

疑似sqlite的路径
2. 输入url = @/opt/api/database.sqlite3, 再次得到一个html文档。

执行结果
拷贝出来用浏览器打开,发现flag。
