ctf_show笔记篇(web入门---php特性)

目录

 php特性

89:直接数组绕过preg_match当遇到数组时会直接报错输出0

90:这里利用了intval的特性

91:这里需要细节一点

92-93:这两题的方法很多可以发散思维

94:还是利用小数绕过例如4476.0

95:这里在最前面使用%0a或者随便一个其他的添加一个字节隔离开在使用八进制就可以绕过

96:可用php伪协议或者./flag.php绕过

97:简单的数组绕过

98:php三元运算符

99:in_array函数漏洞

100:没有设置什么过滤直接命令执行就好###101题的弱化版

101:ReflectionClass 建立反射类

102:还是写一句话木马进服务器

113:和102同理只是把php改为

114:随便上传两个相同的字符

105:考察变量覆盖

106:这里直接可以用数组绕过,和绕过MD5一样,都是sha加密

107:parse_str函数

​编辑

108:简单绕过

109:这里学到了利用反序列化的__construct魔法函数来利用

110:php的内置函数FilesystemIterator的利用

111:直接利用php的全局变量

112和114:直接利用php伪协议读取

113:is_file函数能处理的长度有限制

115:

123:在php中参数加'.'会被替换掉,除非参数中含有'+'或者'空格'或者'[ ]'这些,这些会被替换为'_',并且保留'.'这一类会被替换掉的符号

125:和123差不多,但是过滤更干净了,利用函数嵌套

126:这里利用到了$a=$_SERVER['argv'];

127:利用php的特性绕过

128:新知识点

129:stripos(1,2)查找2在1中第一次出现的位置

130:直接绕过,0相当于FALLS

131:关于PHP正则的溢出

132:关于php的逻辑运算符

133:利用变量覆盖再利用curl可以传输文件信息

134:$_POST是个幌子

135:这里同样可以用curl来解,利用反斜杠绕过就可以,前提是他没有禁用反斜杠

136:tee命令,可以实现输出又能输入到文件

137:call_user_func()函数调用方法

138:相当于禁用了::

139:命令盲注###这里有个问题,{}这个括号可能跑不出来要自己加

140:让传入的两个函数运行后是0或者false或空

141:利用php计算来绕过return

142:0乘任何数都为0

143:这里和141同理,但是将取反的符号过滤了,所以这里用异或

144:也是同样的只是稍微绕了一下(使用取反,异或,或,都可以)

145:这里其他都还是和143-144一样,只是使用php的if函数的变式来绕过

146:'|','^'同样也可以当作运算符用来绕过return

147:涉及两个知识点create_function的代码注入以及php命令空间

148:异或绕过即可或者非预期

149:条件竞争或者直接在index.php中插入木马

150:这里有多种方法可以解,非预期、日志文件包含、session文件包含、临时文件上传###这里演示一种

 150_plus:这一题利用phpinfo来进行条件竞争创建webshell在服务器上


 php特性

89:直接数组绕过preg_match当遇到数组时会直接报错输出0

90:这里利用了intval的特性

payload:

num=4476%0a

4476%0a不绝对等于4476应为%0a相当于是空格

但是intval(4476%0a,0)这里intval函数用于获取变量的整数值,所以会排除掉%0a所以

intval(4476%0a,0)===4476

intval(a,b)

如果b=0那么会自己去判断a是什么进制,例如a=0x开头则是18进制,0开头则是8进制,也可以直接设置b=10进制之类的

91:这里需要细节一点

/m会多行匹配意思就是

a

php

这样也能匹配到

而这里就只能匹配第一行所以能绕过

92-93:这两题的方法很多可以发散思维

  1. 利用intval可以计算其他进制来绕过,例如使用八进制   payload:010574
  2. 或者利用intval取整的特性4476.1####92题不行
  3. 92题可以使用16进制绕过

94:还是利用小数绕过例如4476.0

这里不知道为什么4476.0可以但是4476.1或者4476.2其他的数字不行

95:这里在最前面使用%0a或者随便一个其他的添加一个字节隔离开在使用八进制就可以绕过

payload:

%0a010574

96:可用php伪协议或者./flag.php绕过

97:简单的数组绕过

原理:当md5函数加密数组时会报错NULL,当两a和b同时都是数组时,md5(a)===md5(b)等于NULL===NULL

解法2:利用明文不同但是hashi值相同的两个字符串

98:php三元运算符

三元运算符就是php的if函数的变式:

例如:$a = $b == 3?4:5;   等同于if($b == 3){$a = 4}else{$a == 5}

$_GET?$_GET=&$_POST:'flag';

等于if($_GET){$_GET=&$_POST}else{'flag'}

解析:当通过get方式传入参数时就把get传入参数改为post传入参数

$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';

因为已经表名了当通get传参直接变成POST传参所以这里应该变为

if($_POST['flag']=='flag'){$_POST=&$_COOKIE}else{'flag'}

解析:只要有通过post传输参数flag=flag,那么POST传入参数改为COOKIE传入参数

$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';

还是同理,因为了通过post传输参数flag=flag直接变成COOKIE传参所以这里应该变为

if($_COOKIE['flag']=='flag'){$_COOKIE=&_SERVER}else{'flag'}

解析:只要有通过COOKIE传输参数flag=flag,那么COOKIE传入参数改为SERVER传入参数

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

最后这里

highlight_file(if($_SERVER['HTTP_FLAG']=='flag'){$flag}else{__FILE__})

所以最后payload:

  1. ?a=1               ####随便传入一个get引用第一个方法将$_GET传参改为$_POST
  2. post传参:flag=flag       ####将$_POST传参改为$_COOKIE
  3. Cookie: flag=flag         ####将$_COOKIE传参改为$_SERVER
  4. Flag: flag          ####获取到flag

99:in_array函数漏洞

当type参数没有设置的话他不会检查数据和数组的类型是否相同

例如:

in_array(1.abc,1),一个是字符串一个是数组,但是没有设置第三个参数,就可以形成自动转换,1.abc自动转换为1

100:没有设置什么过滤直接命令执行就好###101题的弱化版

payload1:

?v1=21&v2=var_dump($ctfshow)/*&v3=*/;

payload2:

?v1=1&v2=system('ls')/*&v3=*/;

payload3:

?v1=1&v2=cp ctfshow.php 1.txt/*&v3=*/;    ####访问1.txt就可以访问

101:ReflectionClass 建立反射类

从提示可知少给了一位flag,拿到bp爆破就好

102:还是写一句话木马进服务器

substr(a,b)函数是一个截取函数,a是需要被截取的字符串,b是需要从第几位开始截取###从零开始数

call_user_func函数类似于一种特别的调用函数的方法

file_put_contents函数是一个写入字符串进文件的函数,也可以通过此函数创建文件并写入东西

构造payload:

113:和102同理只是把php改为<?=就好,这个等同于<?php echo

114:随便上传两个相同的字符

105:考察变量覆盖

foreach函数:通过get传入?a=b那么通过foreach函数使$key=a而$value=b

$$key=$$value,这里的意思就是把原本的值当作变量名用了

这里的就相当于是$$key=$$value    <>    $a=$b

106:这里直接可以用数组绕过,和绕过MD5一样,都是sha加密

107:parse_str函数

这里会通过parse_str把$v1的值给$v2有点像赋值

给v1传入flag=1,赋值以后,$v2=([flag] => 1)

108:简单绕过

ereg(a,b)类似于搜索,a是条件类似于正则,b使字符串如果b中有a的要求的东西则输出真

ereg函数存在NULL截断漏洞,导致了正则过滤被绕过

strrev()是取反函数传入abc返回cba这种

109:这里学到了利用反序列化的__construct魔法函数来利用

__cddonstruct魔法函数当使用new实例化一个对象的时候就会引用

payload:

v1=

class{

    public function __construct(){

        system('ls')

    }

}

v2=1

连起来就是echo new (class{public function __construct(){system('ls')}}1())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪兽不会rap_哥哥我会crash

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值