1.4.2 SSRF Bypass技巧

1.URL Bypass

靶场环境为CTFHub技能树-Web-SSRF-URL Bypass。

题目要求请求的URL中必须包含http://notfound.ctfhub.com,我们需要利用合适的方法绕过该限制,可以利用HTTP基本身份认证绕过。

HTTP的基本身份认证允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证,格式为http://user@domain。以@分割URL,前面为用户信息,后面才是真正的请求地址,我们可以利用这个特性去绕过一些URL过滤,直接请求http://notfound.ctfhub.com@127.0.0.1获得flag。

2.数字IP Bypass

指向127.0.0.1的地址如下。

● http://localhost/:localhost代表127.0.0.1。

● http://0/:0在Windows中代表0.0.0.0,在Linux下代表127.0.0.1。

● http://0.0.0.0/:这个IP表示本机IPv4的所有地址。

● http://[0:0:0:0:0:ffff:127.0.0.1]/:Linux系统下可用,Windows系统下不可用。

● http://[::]:80/:Linux系统下可用,Windows系统下不可用。

● http://127。0。0。1/:用中文句号绕过关键字检测。

● http://①②⑦...①:封闭式字母数字。

● http://127.1/:省略0。

● http://127.000.000.001:1和0的数量没影响,最终依然指向127.0.0.1。

3.使用不同进制代理IP地址Bypass

使用Python写一个IP地址进制转换脚本,代码如下。

4.302跳转Bypass

靶场环境为CTFHub技能树-Web-SSRF-302跳转Bypass。通过GET传参的URL,尝试访问127.0.0.1/flag.php页面,如图1-105所示。

不允许企业内部IP访问,使用file协议获取源码:?url=file:///var/www/html/flag.php。得到flag.php页面源码,如下所示。

图1-105 无法访问

与之前一样,通过REMOTE_ADDR请求头限制本地IP请求,源码中并没有之前的hacker! Ban Intranet IP,查看index.php页面的源码:?url=file:///var/www/html/index.php。得到的index.php页面源码如下。

发现其中存在黑名单,限制了127、172、10、192网段,题目提示使用302跳转方式。尝试使用短网址绕过,使用在线平台https://4m.cn/,将http://127.0.0.1/flag.php转换为短地址,如图1-106所示。

图1-106 转换短地址

利用生成的短地址构造Payload:?url=surl-2.cn/0nPI。通过浏览器发送请求,利用302跳转绕过IP限制,即可得到flag。

5.DNS重绑定Bypass

DNS重绑定(DNS Rebinding)指的是在网页访问过程中,用户在地址栏输入域名,浏览器通过DNS服务器将域名解析为IP,然后向对应的IP请求资源。域名所有者可以设置域名所对应的IP,用户第一次访问时,域名会解析一个IP。域名持有者修改绑定的IP,当用户再次访问时,会重绑定到一个新的IP上,但对于浏览器来说,整个过程都是访问同一个域名,所以浏览器认为是安全的,于是造成DNS重绑定漏洞。

攻击过程大致如下。

1)控制恶意的DNS服务器回复用户对域的查询。

2)诱导受害者加载域名。

3)受害者打开链接,浏览器发送DNS请求,获取域名的IP地址。

4)恶意DNS服务器收到受害者请求,并使用真实的IP响应,设置较低的TTL值,减少DNS记录在DNS服务器上缓存的时间。

5)从域名加载的网页中若包含恶意的JavaScript代码,构造恶意的请求将再次访问域名,导致受害者的浏览器执行恶意请求。

DNS重绑定攻击可使同源策略失效,由于同源策略是指同域名、同协议、同端口,检测的是域名而不是IP,而DNS重绑定的域名是一样的,因此同源策略就失效了。

靶场环境为CTFHub技能树-Web-SSRF-DNS重绑定Bypass。

首先使用file://协议读取index.php的源码,发现存在黑名单,限制了127、172、10、192网段,题目提示使用DNS重绑定方式,通过https://lock.cmpxchg8b.com/rebinder.html网站设置DNS,如图1-107所示。

图1-107 设置DNS

使用生成的域名构造Payload:?url=7f000001.7f000002.rbndr.us/flag.php。通过浏览器发送请求,得到flag。