概述
首先声明这不是一篇完全讲SSRF原理的文章,我仅仅用我浅薄的知识介绍如何将CTFHUB技能树中与SSRF相关的题目解出,碰到一些有记录价值的题目我会顺便谈一下其中的部分原理。
附上一张图片,以便更好的理解SSRF。(网上找的)
前言
我简单谈一下在已知ssrf漏洞的条件下我们可以利用到的伪协议,
http://
:探测内网主机存活、端口开放情况,可以通过访问其它网站确定存活,如百度
gopher://
:发送GET或POST请求(需要配合http协议二次url编码上传);攻击内网应用,如FastCGI、Redis
dict://
:泄露安装软件版本信息,查看端口,操作内网redis访问等
file://
:读取本地文件,如/etc/passwd、/etc/hosts、web网站等等
其实本来还想讲一讲一些Bypass(绕过),但是后面的题目其实也都会遇到,我们在题目中碰到再一道一道的说,便于理解。一起来看看吧!
内网访问
打开GET给了一个url参数,我们用http协议盲测一下可不可以使用
可以就说明内网主机应该是存活的
题目提示了flag在本地127.0.0.1中,我们直接访问即可
flag出来了。
伪协议读取文件
这一题的考点主要是希望做题者能掌握file协议读取文件,当然题目的hint也是这么些的哈哈哈。
看提示已经猜到flag在网站目录下,流程不走了,我们直接读取
看看源码,
flag就出来了,简单吧?觉得没意思?别着急,后面会有有意思的。
端口扫描
这个题目主要是要会利用burp的爆破,思路很简单,来看看吧。
本地端口开了一个在8000-9000,如果纯手注,运气不好要一千次,所以我们利用该dict协议探测端口加上burp爆破,当然也可以用http探测端口,无所谓。
爆出了端口号为8593,我们用http协议访问一下,
POST请求
和上面几题不同,这个题要求 POST传数据,
hint留个印象,我们先用file协议看看源码,
同时,发现目录下还有一个flag.php文件
这个flag.php文件很关键,flag就藏在这里面, 通过代码审计我们需要一个key的值,因为它的全局变量读取的IP需要为127.0.0.1,所以在这里我们需要本地访问。key的值好解决,我们http一访问flag.php就会发现,
key值出了, 那怎么解决在本地的基础上POST传参呢?这里就要用到前面讲到的gopher协议传POST数据,将HTTP文件小改一下伪装成本地127.0.0.1即可。
伪装一下host,再加一个key的POST传参即可。
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
key=050a8579908e458e32497b1e96b08a28
需要对该数据进行二次url编码,第一次编码后的数据%0A替换%0D%0A,把替换后的数据进行第二次url编码,为什么要把%0A替换呢?这是因为CRLF即回车换行相当于是tcp数据流中的一个断点,所以一次编码忽略了的LF我们要在编码后加上再进行一次编码。
一次编码(%0A已被%0D%0A替换):
POST%20%2Fflag.php%20HTTP%2F1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Length%3A%2036%0D%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0D%0A%0D%0Akey%3D050a8579908e458e32497b1e96b08a28
二次编码(对第一次替换后的编码再编一次):
POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253D050a8579908e458e32497b1e96b08a28
最后打入gopher中得到如下,
上传文件
这个是在上一题gopher传POST数据的基础上升了一个档次,但解法其实也就八九不离十吧,都是利用http的请求包二次编码打入gopher而已。
这个题目有点子怪,可能需要稍微要了解一点点HTML标签的东西,因为等会我们要加个按钮。
老办法,能用file协议的话我们读读看源代码,
还是和上一题的POST传参思路一样,关键点在于这个flag.php文件,它的需要在本地127.0.0.1环境下访问,以及我们需要利用POST在/flag.php中上传一个文件,成功后会输出一个环境变量CTFHUB的值,这里面应该放的是flag。
先用http访问一下这个flag.php,看看能不能上传文件
有个文件选择,但是提交按钮到哪去了???所以这里我们要自己写一个提交按钮,前端的东西还是比较容易修改的,把如下标签插入html中即可
<input type="submit" name="errorr0">
我们随便上传一个文件,抓一手提交文件的包
随便上传什么文件都可,因为代码审计中我们知道只要上传了文件它就会打印CTFHUB全局变量的值。所以上面是我传的文件,后面就和上一题的POST上传一样了,二次URL编码,URL第一次编码后要把%0A替换为%0D%0A,是什么原因上一题也解释了,不多说了,我们直接把二次编码过后的数据打入到gopher协议中。
flag就出了。
后面几题是关键非常非常的有意思,而且它的绕过什么也很灵性,下篇文章讲。
最后
以上就是含蓄香烟为你收集整理的CTFHUB--技能树--SSRF全解(上篇)前言内网访问伪协议读取文件端口扫描POST请求上传文件的全部内容,希望文章能够帮你解决CTFHUB--技能树--SSRF全解(上篇)前言内网访问伪协议读取文件端口扫描POST请求上传文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复