这道题脑洞挺大的,还没给hint,比较扯,不过知识点还是很有意思的
0x00 预备知识点
- cURL的post文件上传
- php的curl上传组件
- python字符编码
- django的debug模式
0x01 cURL
什么是cURL?
curl是一个利用URL语法在命令行方式下工作的文件传输工具。curl是一个利用URL语法在命令行方式下工作的文件传输工具。
它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,
上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
原来php默认并不进行此项功能的扩展,但还是有的,只是没有让它生效罢了。打开PHP安装目录,搜索以下三个文件 ssleay32.dll、libeay32.dll和 php_curl.dll,
高级用法:
curl post上传文件
上面的两种请求,都是只传输字符串,我们在测试上传接口的时候,会要求传输文件,其实这个对于
curl
来说,也是小菜一碟。我们用
-F "file=@__FILE_PATH__"
的请示,传输文件即可。命令如下:curl localhost:8000/api/v1/upimg -F "file=@/Users/fungleo/Downloads/401.png" -H "token: 222" -v
0x02 PHP的cURL组件
PHP中包含了cURL组件,语法和cURL差不多,在PHP5.5后,CURL_SAFE_UPLOAD
选项会控制是否使用新的上传方式。
具体的参看这篇文章:https://jasonhzy.github.io/2016/05/04/php-curl-file/
0x03 python的字符编码
总的来说字符编码是python的一大败笔。
具体的参看这篇文章:https://www.cnblogs.com/huxi/articles/1897271.html
而在这道题中,django后端使用的gbk编码,超过编码范围的内容会引起报错。
0x04 django的Debug模式
对于django这样的后端框架,我们可以在项目的settings.py
中设置打开debug模式,这样我们在出错的时候就可以看到具体的信息了。
对于这道题,他开了debug模式。
0x05 解题
首先,第一眼看到这道题,ping?这不就是一个很经典的命令注入?但是事情没有那么简单。
我们发现127.0.0.1;ls
还是其他的payload都会显示invalid url
,开始我想的是可能有过滤,然后各种绕过,
结果都没用。最后看了WP,才知道是怎么回事。
发现命令注入不行,然后进行FUZZ测试(扯淡),然后发现了我们输入字符编码,不会报错,但是%80
会出错,于是我们看到了django的报错信息,我们知道了gbk
的编码方式,也发现了接口与请求方式。
这样,我们就知道了,这个应用的整体架构
我们给php发出请求,php把请求发送给本地部署的django,然后得到结果
结合hint:RTFM of php cURL
我们就知道这道题该怎么做了:
由于django本地部署,而且php使用的cURL组件,所以这里,我们使用前面讲的php的cURL文件上传,
@/opt/api/database.sqlite3
这样,我们就把这个数据库文件的内容post给了django,但是牛逼的因为编码问题,他报错了
于是,就这么巧妙地,我们就看到了数据库里面的内容。
尽管整个过程都写满了扯
字,但是不得不说,设计的巧妙以及知识点的串联很有意思。
网友评论