题目描述和此题关系不大,刚开始尝试输入www.baidu.com时,并没有返回任何的结果,可能是没有进行域名解析。后来尝试输入**127.0.0.1**,ping通了。那么,就利用管道符尝试一下,能否遍历出服务器当前目录下的文件,返回Invalid URL,依旧是没有获得什么有用信息。
看到域名有%7C这样的url编码,所以就尝试了一下是否能用宽字节(大于等于%80)这样的编码进行注入,果然发现了报错。把报错的<title>
放到百度搜索,发现原来这是django的典型报错(从报错信息中,也能看出是django)。对于报错原因,自己分析了一下,可能是因为服务器在收到像%80这样的宽字节时,无法解析而报错。
据说,在比赛的时候放出了这么一条hint:RTFM of PHP CURL===>>read the fuck manul of PHP CURL???
1 | CURL是一个利用URL语法在命令行方式下工作的文件传输工具。curl是一个利用URL语法在命令行方式下工作的文件传输工具。 |
上面的方法,只能传输字符串,但是使用这样的语句file=@FILE_PATH,就可直接调用CURL传输文件:
是怎么看出用这个路径地址的呢,django的settings.py(配置文件)一般存在于你创建的文件目录下的同名目录。然后通过配置文件的报错,我们找到数据库的信息,database.sqlite3
,还是利用CURL传输文件,最后通过查看数据库文件的报错得到flag。
这题也反思出一个安全问题,之所以会有如此多的报错,还是开发人员的不严谨导致,settings.py中的Debug模式开启时,如果代码出现了bug,浏览器和控制台就会打印报错,帮助开发者更快的找到错误,在开发完毕的时候就需要关闭Debug模式(Debug=false),避免出现源文件的泄露。