LCTF的一道SSRF

2017-11-20  本文已影响0人  _阿烨_

http://211.159.161.162/test.php

访问是这个页面

image.png

点击后是这个页面

image.png

对比发现后端逻辑应该是用curl处理

image.png

burp抓包发现,访问百度的请求,并不是我这边发出的,而是服务器发出的,大致判断是SSRF

发现访问 http://www.baidu.com 会自动加个斜杠 http://www.baidu.com/

后端做了限制,只能访问域名是www.baidu.com的网站,
比如 https://www.baidu.com/more 然后会给你加个斜杠
构成 https://www.baidu.com/more/
类似 tieba.baidu.com map.baidu.com 这些域名都不行

刚开始的想法是构造 http://www.baidu.com/?link=sjdasjgj 类似这种的跳转,然后跳转到自己的服务器上面来,但是发现其不跳转,比如我们复制一段百度爬虫的链接
https://www.baidu.com/link?url=UBtdgmahvMOeX4yf_6vv8oCle5kmFwjF6YdABHeW9Th3QBY6Sp40x72cILvk630_c-_eR5Jp9190FsIerGNF6_&wd=&eqid=a821b49200002fe5000000065a128af1
丢进去访问发现,服务器并没有跳转。。。如下,记得url编码

image.png
万念俱灰,不知道怎么弹到自己的服务器上,一般SSRF都是弹到自己服务器上,然后调用302.php,实现内网漫游

直到我试出一个了报错,才有了点方向


image.png

才知道后端是用parse_url()处理的,然后网上搜点paper

参考链接 http://love.ranshy.com/file%E5%8D%8F%E8%AE%AE%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%BC%95%E5%8F%91%E7%9A%84%E6%BC%8F%E6%B4%9E/
利用parse_url()的缺陷,结合curl的 file:// 协议 进行本地文件读取

大致原理如下


image.png

可以猜测后端是对host做了白名单,只能是 www.baidu.com, 这样的好处是可以防止内网漫游,其实更安全的做法是对 schema也做一个白名单,限制curl 只能使用http和https协议

再给一张图详细了解一下 parse_url()

image.png

攻击方式

image.png

竟然没成功。。。。

image.png

突然想起后端逻辑会自动给我拼接个斜杠,于是我加个#

image.png

还是没成功,比赛的时候我就做到这里,赛后问了大佬才知道,#要用url编码,才能传到后端,后端解码后才会被被当成喵,注释掉斜杠,直接传#是会拼接成 /etc/passwd#/ 整体作为一个path

顿时,泪奔

image.png
image.png

最后我读了源码


image.png
<?php if(!$_GET['site']){ echo <<<EOF <html> <body> look source code: <form action='' method='GET'> <input type='submit' name='submit' /> <input type='text' name='site' style="width:1000px" value="https://www.baidu.com"/> </form> </body> </html> EOF; die(); } 
$url = $_GET['site']; $url_schema = parse_url($url); 
$host = $url_schema['host']; 
$request_url = $url."/";
if ($host !== 'www.baidu.com'){ die("wrong site"); } 
$ci = curl_init(); 
curl_setopt($ci, CURLOPT_URL, $request_url); 
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1); 
$res = curl_exec($ci); 
curl_close($ci); 
if($res){ echo "<h1>Source Code:</h1>"; echo $request_url; echo "<hr />"; echo htmlentities($res); }
else{ echo "get source failed"; } ?> 

走过路过,欢迎纠错

上一篇 下一篇

猜你喜欢

热点阅读