whitelist_hostname = ["example.com",
"www.example.com"]
whitelist_scheme = ["http://"]
def check_hostname(url):
for i in whitelist_scheme:
if url.startswith(i):
url = url[len(i):] # strip scheme //将输入的url截取去掉http://
url = url[url.find("@") + 1:] # strip userinfo //截取去掉@之前的内容
if not url.find("/") == -1:
url = url[:url.find("/")] # strip parts after authority //截取到"/"以内的内容
if not url.find(":") == -1:
url = url[:url.find(":")] # strip port //截取到":"以内的内容
if url not in whitelist_hostname:
return (False, "hostname {} not in whitelist".format(url)) //所剩内容对比whitelist
return (True, "ok")
return (False, "scheme not in whitelist, only {} allowed".format(whitelist_scheme)
上面代码解释引用了IncludeK师傅的注解
python太菜对于url[len(i):] 这种写法可以截取字符串半天没看懂
同时发现个有趣的事情
关于@影响到url解析
如:http://127.0.0.1/flag@example.com 会解析到127.0.0.1/flag
但神奇的是http://127.0.0.1@example.com会解析到example.com
可能原因不太清楚不过有个图大家可以参考
同时对于#在url的截断作用我也不是太清楚:
大佬的解释
#后的字符
在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。
比如,下面URL的原意是指定一个颜色值:
http://www.example.com/?color=#fff
但是,浏览器实际发出的请求是:
GET /?color= HTTP/1.1
Host: www.example.com
可以看到,"#fff"被省略了。只有将#转码为%23,浏览器才会将其作为实义字符处理。也就是说,上面的网址应该被写成:
http://example.com/?color=%23fff
所以这个题很明显了,代码中会读取@后面的作为监测白名单的url,在处理的时候,会把后面白名单的内容识别,但是url请求的时候#号后面的url会被忽略。
参考文章链接
PwnTheBox - Hacking Platform - CTF Platform - CTF平台 - 网络安全竞赛平台