Web入门篇(1-…自己更新)
信息搜集
信息泄露可以参考https://blog.csdn.net/a597934448/article/details/105431367
Web1
第一题就是最简单的f12,找到flag
Web2
给的提示是这个
进入之后发现题目上写着无法查看源代码,按f12和右键都无法打开
选择在火狐浏览器中把更多工具中的网页开发者工具打开,找到flag
试着在网站的JS代码中把false都改为true
没啥用…
记载一下大佬的四种方法:
这里有4种方法,第一种方法是直接禁用JavaScript,这个就自行搜索吧。我这里说一下火狐的禁用JavaScript。
1.先开一个新的标签页,然后在Firefox的地址栏里输入,about:config , 然后按enter键进行检索。
2.这里会弹出三思而后行,直接确定,然后在搜索栏搜索javascript.enabled,这时显示的ture,然后点击右边的箭头,这时就会出现JavaScript变成了flase,如果想恢复的重复上面的步骤。
第二种方法是用一种协议来查看源码,协议是view-source,这个协议是早期的浏览器支持的一个协议,后来Microsoft考虑安全性,对于WindowsXP pack2以及更高版本以后IE就不再支持此协议。但是这个方法在FireFox和Chrome浏览器都还可以使用。
使用方法是view-source:url
第三种方法是使用burp suite直接进行抓包,然后使用repeater进行重新发包。
第四种方法是直接使用ctrl+u直接查看源代码。
Web3
题目提示:
所以我们打开bp,抓一下题目的包
右键选择send to repeater
到repeater界面选择send,在右边的网站response报文中找到flag
Web4
提示:
想到flag可能在网页的robots协议里,在网址后加/robots.txt
发现有个flagishere.txt,直接访问这个文件,得到flag
Web5
提示:
这里直接在url中查看index.phps.
这里为啥是index.phps而不是index.php,phps文件是php的源代码文件,通常用来提供给用户(访问者)查看php代码,因为用户无法直接通过web浏览器看到php文件的内容,所以需要用phps文件代替。
这里只要不用php等已经在服务器中注册过的MIME类型为文件即可。
它的MIME类型为:text/html, application/x-httpd-php-source, application/x-httpd-php3-source。
打开得到flag
Web6
题目提示说,解压源码到当前目录,测试正常。那么我们输入常见的源码包名字www.zip,然后下载压缩包。
下载后打开
有两个文件,先打开index.php,里面写着flag in fl000g.txt
但我们打开fl000g.txt后,发现里面不是flag
所以我们在网页里直接访问,得到flag
Web7
这里提示的是版本控制。
这里先了解一下基础知识。git文件导致的源码泄露,.git文件是开发人员在开发过程中使用 Git(分布式版本控制系统)做开发时产生的隐藏目录,该文件包含一些版本信息和网站源码,数据库信息等敏感信息。
原理利用
1、通常开发人员在开发时,通常将源码提交到远程的托管网站(如Git hub)方便管理与交互,等到开发最后阶段,再将源码从远程服务器上下载到 web 目录下, 如果开发人员忘记将其中的 .git文件删除,则可以通过 .git文件恢复网站源码,来获取一些敏感信息;
2、开发人员对站点使用 Git 对版本进行控制,实现自动部署,如果配置不当,直接将 .git文件加载到线上环境,这样便引起了.git文件泄露。
如何利用这个漏洞呢。
这道题是十分简单的。但是一般的话是利用在获取 Git Hacker 工具包:
git clone https://github.com/WangYihang/GitHacker.git
cd Git Hacker
下载 .git 文件并使用python脚本自动恢复该目录下的文件:
python GitHacker.py http://6c7e2a80-81d9-4ac0-a658-d349a99b5b43.node3.buuoj.cn/.git/
获取到文件之后使用grep查找字符串。
这道题的话直接在url里输入/.git
Web8
这里先说一下SVN,SVN是程序员常用的源代码版本管理软件。
1.在使用SVN管理本地代码过程中,会自动生成一个隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使隐藏文件夹被暴露于外网环境,这使得渗透工程师可以借助其中包含版本信息追踪的网站文件,逐步摸清站点结构。
2.在服务器上布署代码时。如果是使用 svn checkout 功能来更新代码,而没有配置好目录访问权限,则会存在此漏洞。黑客利用此漏洞,可以下载整套网站的源代码。
使用svn checkout后,项目目录下会生成隐藏的.svn文件夹(Linux上用ls命令看不到,要用ls -al命令)。
svn1.6及以前版本会在项目的每个文件夹下都生成一个.svn文件夹,里面包含了所有文件的备份,文件名为 .svn/text-base/文件名.svn-base
svn1.7及以后版本则只在项目根目录生成一个.svn文件夹,里面的pristine文件夹里包含了整个项目的所有文件备份
关于如何获取里面的内容。
第一可以使用用SQLiteStudio软件打开 wc.db文件,我们看到 NODES 表,看到 local relpath栏 和 checksum栏,checksum栏里的sha1后面的那串数字就是pristine文件夹里的那堆文件的文件名,pristine里的00~ff文件夹,其实是文件名的前两位,而local relpath就是原始的文件名。
checksum栏里的sha1sha1后面的那串数字就是pristine文件夹里的那堆文件的文件名,pristine里的00~ff文件夹,其实是文件名的前两位,而local relpath就是原始的文件名。
第二种是使用svnexploit进行测试。
当svn>1.6,访问wc.bc文件,就可以读取到所有的网站目录。
利用svnexploit直接进行dump
![img](https://i-blog.csdnimg.cn/blog_migrate/6cdf3be735e7e953327b9bc612901b7c.png)
当svn<1.6时。
先使用svnexploit。
![img](https://i-blog.csdnimg.cn/blog_migrate/9fb9f3559bcf1e4efa64f5597ea8ab65.png)
然后在使用Seay-SVN工具测试
![img](https://i-blog.csdnimg.cn/blog_migrate/db96bbb28f87ac4674c0df9c335621d6.png)
还是说一下这道题吧。
直接在url输入/.svn/即可获得flag
Web9
一、vim备份文件
默认情况下使用Vim编程,在修改文件后系统会自动生成一个带~的备份文件,某些情况下可以对其下载进行查看;
eg:index.php普遍意义上的首页,输入域名不一定会显示。 它的备份文件则为index.php~
二、vim临时文件
vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是submit,则它的临时文件
.submit.swp。如果文件正常退出,则此文件自动删除。
这道题的话,直接访问index.php.swp
Web10
ookie是某些网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地终端上的数据(通常经过加密),由用户 客户端 计算机暂时或永久保存的信息。
这里提示利用cookie,直接使用bp抓包,然后进行重放包。就找到了flag
这里的flag需要进行处理。这里使用的是Unescape解码就是去掉"%u"后,将16进制字符还原后,由utf-16转码到自己目标字符。
Web11
提示告诉我们域名隐藏着信息,所以我们直接打开域名解析网站域名查询http://dbcha.com/,搜索flag.ctfshow.com
Web12
进入题目后,在最下角发现一个反馈热线,也就是电话号码,联系到提示
直接在url后面加/admin,密码是电话号
得到flag
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-asOxBhf1-1681382099949)(image-20221013194836917.png)]
Web13
在页面最下面发现小写的document。
点开之后发现了泄露了信息。包括后台登录网址,还有账号密码。
Web14
editor也是会泄露网站信息的。
这里是一个上传框。
这里找到上传图片的地方。
这里打开图片空间,然后找到var文件。
![img](https://i-blog.csdnimg.cn/blog_migrate/b2e0e5fedc01ec53c3434ab2a69163e2.png)
依次打开www/html/nothinghere/fl000g.txt。
然后尝试在url里面访问/nothinghere/fl000g.txt
![img](https://img-blog.csdnimg.cn/img_convert/a3720c636b07780fde0af5d0e6debc97.png
Web15
这里题目提示了公开的信息比如邮箱,可能造成信息泄露,产生严重后果
这里先查看页面有啥可以利用的信息。这里可以在页面底端找到了QQ邮箱。
这里可以先从qq入手,看看有啥可以利用的信息。
然后有了管理员的信息,直接找后台登录。
这里我直接在url访问/admin/
这里先不用暴力破解,先是使用忘记密码,看一下咱们的信息能否用上。
这里问的是那个城市,这里的qq信息成功用上。
填写上西安,然后重置密码。
利用重置的密码登录。得到flag
Web16
这里利用的php探针没有及时删除,对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露。
php探针是用来探测空间、服务器运行状况和PHP信息用的,探针可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息。是一个查看服务器信息的工具。
比如查看服务器支持什么,不支持什么,空间速度等等状况。
这里在url里输入/tz.php,这里使用的是雅黑php探针。
这里在url里输入/tz.php?act=phpinfo,然后直接ctrl+f搜索flag。
Web17
这里提示备用sql文件泄露
直接下载备份sql文件,在url里输入/backup.sql,backup是备份的意思。
Web18
这里是一个闯关游戏,一旦得分到了101分就给flag。
这里先查看源码。
这里提示了一个/js/Flappy_js.js文件。这里直接访问。
这里大于100分之后的代码进行Unicode解码
“你赢了,去幺幺零点皮爱吃皮看看”
这里说的是110.php。
Web19
这里直接f12查看源码。
这里找到了账号和密码。
这里得使用post传参。
我使用的是火狐里面的HackBar,使用post发送数据。
username=admin&pazzword=a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04
Web20
mdb文件是早期asp+access构架的数据库文件,文件泄露相当于数据库被脱裤了。
根据题目提示访问路径/db/db.mdb,下载mdb文件
然后使用记事本查看。
爆破
Web21(https://www.cnblogs.com/007NBqaq/p/13220297.html)
题目首先给了一个附件dic.zip,打开发现是网站后台密码的字典。应该就是让我们用这个进行爆破
题目给的第一个提示是tomcat认证。
首先认识一下Tomcat:Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
接下来回到本题,首先不做操作进入题目,是一个登录界面
我们打开bp的拦截功能,再次进一次题目,可以发现登陆界面是get传参。
我们尝试随便输入一个账号和密码,Authorization: Basic YWRtaW46MTIzMTIz ------->输入的用户名/口令以base64的形式传输,并且是以账号:密码这样的形式传输的。
知道这些之后我们准备用bp爆破模块的迭代器模式进行爆破
将该数据包发送到BP的爆破模块,选中base64编码后的用户名和密码。
来到intruder这个界面,我们首先要选中我们刚才找到的base64编码过的账号和密码,因为这里是我们要准备用迭代器替换的payload。鼠标选中之后点击右边的add就添加好了,然后我们点击上方的payloads
这一块是选择我们想要使用的爆破模式,第二行的payload type选择custum iterator(即自定义迭代器)
这一块是具体的构造模块,因为我们刚才已经弄清楚了网站传参的形式是账号:密码,所以我们构造也是按照这个形式来构造。
选择position1,然后在底下添加admin(姑且猜测是默认用户名)
选择position2,添加:(这里是英文的:)
选择position3,这里选择load…,然后导入我们前面下载的密码字典附件
因为网站是以base64编码传输的参数,所以我们要在之后的传输处理中添加一条使用base64编码
选择add----encode----base64-encode,然后把底下的URL-encode these characters取消勾选,因为base64编码完之后结尾可能会有==,为了不影响最后结果所以这么做
然后返回最上面选择start attack就开始爆破啦
还没跑完,但我们已经找到了一条回复报文是200的,200意味着成功访问,点击它的response报文,得到flag
(之前的构造payload其实可以只选择后面的密码部分,不过为了好理解这里把三个部分都选中了)
Web22
这里页面失效了,猜测是先让我们爆破出子域名,然后访问flag.ctf.show就能得到flag,不过做不了,直接提交flag
Web23
题目源代码:
![image-20221028201921560](image-20221028201921560.png)
注释完后的代码:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 11:43:51
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0); #禁用错误报告
include('flag.php'); #引入flag.php
if(isset($_GET['token'])){ #isset()检测变量是否设置,$_GET['token']是通过get方式传过来的值
$token = md5($_GET['token']);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){ #substr(string,start,length)为返回部分字符串,===指变量类型一样,比较对象时判断的是对象
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){ #intval()获取变量的整数值
echo $flag;
}
}
}else{
highlight_file(__FILE__);
}
?>
知道题目是要我们返回一个token值,这里直接使用脚本进行爆破:url根据容器替换。
import requests
a = "3abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012456789"
for i in a:
for j in a:
url ="http://ebcf3b38-6be5-40a9-af5e-03a49f84cdd1.challenge.ctf.show/?token="+str(i)+str(j)
req = requests.get(url=url).text
if "ctf" in req:
print(req)
exit()
else:
print(url)
Web24
题目源代码:
还是先注释一下:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:26:39
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0); #禁用错误报告
include("flag.php"); #引入flag文件
if(isset($_GET['r'])){ #get传参过来的r参量
$r = $_GET['r'];
mt_srand(372619038); #随机数播种,但是使用随机数时是用mt_rand()函数
if(intval($r)===intval(mt_rand())){ #参数r的整数值是否等于随机值
echo $flag;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
?> Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022
需要注意的是,mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机数。从PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数 因此不需要播种,并且如果设置了seed参数生成的随机数就是伪随机数,意思就是每次生成的随机数是一样的。
因为这里只使用了一次mt_rand()函数,所以我们可以直接写一个简单的php去跑一下相同种子的情况下出来的r是多少,然后构造payload即可。
这里直接在kali中去跑,kali可以直接运行php,看的一些教程是使用了php_mt_seed这个脚本,但本题貌似可以不用,直接构造?r=1155388967就得到flag了。
Web25
源代码就不放了,直接放自己注释好的代码:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:56:57
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
#之后为了省篇幅会把上面的省略
error_reporting(0); #禁用错误报告
include("flag.php"); #引用文件
if(isset($_GET['r'])){ #r传参
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8))); #substr(string,start,length)为返回部分字符串,将(flag参数的md5值取前8位从16进制转10进制)作为种子
$rand = intval($r)-intval(mt_rand()); #rand为r-伪随机数,这里判断的是r与伪随机数相等
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){ #cookie值=mt_rand()两次运用之和
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022
可以看出是要构造出一个get传参为伪随机数且cookie值为两伪随机数之和这样一个get请求。
因为只有当r和mt_rand相等才能运行之后的代码,所以我们需要先试出mt_rand()函数第一个伪随机数。这里我们用r=0来尝试,因为这样得到的就是rand参数的值,得到的值为516466300。
然后我们可以使用php_mt_seed脚本逆推出可能的种子。
通过验证可以得到种子为533657153
mt_rand()函数两次之和为959299364(每个人的种子应该是不一样的)
然后输入传参即可得到flag
(要注意的一点是每次关闭instance再打开会改变seed,所以建议是一次性做完)
Web26
这一题原意是通过BP抓包之后暴力破解密码,但是出现非预期解是抓包之后直接post就得到了flag,不需要输参数。
得到flag为ctfshow{588f4330-7b00-4e6b-bd2f-2e952d38ac05}
或者也可以像web21那题一样爆破
Web27
进去是一个教务管理系统,底下有录取名单和学生学籍信息查询系统,还有用户登录。猜测应该是通过录取名单和学生学籍信息查询系统得到学生的学号和密码,之后登录获得flag。
点击录取名单下载附件
之后选择第一名同学在学生学籍信息查询系统中开始爆破。
用bp抓包,选择身份证号中间缺少的8位进行爆破
我们知道身份证号中间8位是出生日期,这里可以使用攻击载荷中的日期进行爆破,按照下图设置。
成功爆出其出生日期为19900201
之后使用正确的身份证号进行查询得到学号和密码
之后登录得到flag
Web28
这题需要爆破目录,爆破的时候把后面的删掉,只要爆破目录即可
还是用bp抓包爆破
攻击类型选择cluster bomb,选择两个目录作为位点
像这样设置
之后就得到了flag
文件执行
其他类似的好玩的还有
1、<>重定向符号
2、KaTeX parse error: Undefined control sequence: \x at position 25: …分隔符 3、空格的另一种写法 \̲x̲20 4、{}命令执行 5、利…和反引号`(如果反引号里面有数据,则优先处理里面内容)
8、利用shell结束符;分号
9、利用逻辑符号&& ||
ps:windows考虑 ^链接
Web29
<?php
error_reporting(0);
if(isset($_GET['c'])){ #传参c
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){ #preg_match为正则匹配,c中出现flag则过滤flag,否则就执行c语句。i是大小写不敏感的搜索
eval($c);
}
}else{
highlight_file(__FILE__);
}
所以我们的传参c既要执行flag文件又不能包含flag,因此我们通过绕过方式双引号/单引号绕过。因为成对的闭合单双引号可以直接抵消。这里cat命令不知道为什么也用不了,所以用了tac
Web30
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){ #过滤了flag/system/php
eval($c);
}
}else{
highlight_file(__FILE__);
}
这里把system与flag、php都过滤了
system绕过:可以使用passthru等函数绕过
flag.php:可以使用引号绕过fl"“ag.p”"hp,也可以使用通配符绕过fl*
payload:
?c=passthru('ls');
?c=passthru('tac fl*');
Web31
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c))
这次连单引号和空格都被过滤了,这时候可以考虑用二次传递或者套娃来做
**二次传递:**通过传两个参数来绕过检测
payload:
?c=eval($_GET[1]);&1=system('ls');
?c=eval($_GET[1]);&1=system('tac flag.php');
if中检测的是eval($_GET[1]);并没有出现违法字符,但我们通过eval与&1将命令传递进c中并且能被执行
**套娃:**这里介绍两种套娃的方式get_defined_vars()、localeconv()
需要用到的函数:
get_defined_vars() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
array_pop() 是删除并返回数组最后一个元素
current() 返回数组中的当前元素的值。别名是 pos()
next() 返回数组中的下一个元素的值。
end()最后一个
scandir() 函数返回指定目录中的文件和目录的数组。
print_r() 函数用于打印变量,以更容易理解的形式展示。
localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."
current() 函数返回数组中的当前元素的值。别名是 pos()
array_reverse() 函数将原数组中的元素顺序翻转,创建新的数组并返回。
read_file()、highlight_file()和show_source()读出源码
get_defined_vars():
print_r(get_defined_vars()); 可以看到当前的所有参数名称以及当前值。
可以看到有很多参数,其中post参数中还没有一个具体的值,所以我们尝试用hackbar传入一个可以执行的命令
可以看到这次post的值就是我们上传的值,我们套娃的意图是把我们想要执行的命令先存入系统,想要使用的时候直接调用系统中的值就不会被过滤了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Xt5hwM5-1681382099971)(image-20221204162747521.png)]
current() :返回数组中的当前元素的值。别名是 pos()
next() :返回数组中的下一个元素的值。
使用next函数给它取出来:print_r(next(get_defined_vars()));
可以看到我们已经将第二个数组拿了出来,接下来我们需要做的是取出它里面的值。
array_pop() 是删除并返回数组最后一个元素
使用array_pop()将值取出来
print_r(array_pop(next(get_defined_vars())));
这下我们传入的参数实际上就等于print_r(system(‘ls’));所以我们想要应用的话只要把print_r改为eval即可
接下来只要把system()中改为cat flag.php即可,这里需要注意的是页面没办法直接显示源代码,因此可以在空白页面右键点击显示源代码。或者可以使用highlight函数
localeconv():
scandir() 函数返回指定目录中的文件和目录的数组。
localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."
这道题将.给过滤了,所以可以使用localeconv()代替点,scandir(.),使用前面提到的current()/pos()将.给取出来
即print_r(scandir(pos(localeconv())));
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZDb2Oc0-1681382099982)(image-20221204164927278.png)]
可以看到取出了scandir(.)指定目录下的文件,目前认为应该就是所有文件。可以看到flag.php是数组下标为2。
所以我们可以先将数组逆转然后使用next)()函数,之后用highlight_file()函数显示flag.php文件的源代码即可。
Web32
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c))
除了之前的几个,新过滤了括号和分号。
include函数可以不使用括号,分号的话可以使用?>代替
这里还运用到了php伪协议的知识 ,可以参考这个,大佬写的很详细
php://filter可以获取指定文件的源码。当它与包含函数结合时,php://filter流会被当做php文件执行,所以我们在这里需要对其进行编码,让它不执行,从而导致任意文件读取。
利用filter协议读文件±,将flag.php通过base64编码后进行输出。这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。
而使用的convert.base64-encode,就是一种过滤器。
payload:
?c=include$_GET[0]?>&0=php://filter/read=convert.base64-encode/resource=flag.php
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdR2ed0U-1681382099983)(image-20221204171730398.png)]
得到了一串base64编码,之后我们随便找个在线base64解码网站即可。
得到flag
Web33-36
接下来几题添加的过滤因素不影响之前payload 的使用,因此都可用web32的payload得到flag。
需要注意的是web36这题过滤了数字,因此我们需要把参数换成字母。
转存中…(img-1mU06Qzy-1681382099983)]
Web32
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c))
除了之前的几个,新过滤了括号和分号。
include函数可以不使用括号,分号的话可以使用?>代替
这里还运用到了php伪协议的知识 ,可以参考这个,大佬写的很详细
php://filter可以获取指定文件的源码。当它与包含函数结合时,php://filter流会被当做php文件执行,所以我们在这里需要对其进行编码,让它不执行,从而导致任意文件读取。
利用filter协议读文件±,将flag.php通过base64编码后进行输出。这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。
而使用的convert.base64-encode,就是一种过滤器。
payload:
?c=include$_GET[0]?>&0=php://filter/read=convert.base64-encode/resource=flag.php
[外链图片转存中…(img-zdR2ed0U-1681382099983)]
得到了一串base64编码,之后我们随便找个在线base64解码网站即可。
[外链图片转存中…(img-MBbD70aU-1681382099983)]
得到flag
Web33-36
接下来几题添加的过滤因素不影响之前payload 的使用,因此都可用web32的payload得到flag。
需要注意的是web36这题过滤了数字,因此我们需要把参数换成字母。