ctfshow---php特性

文章详细列举了一系列PHP函数的使用,如intval、preg_match、preg_match_all、explode等,同时讨论了如何利用这些函数的特性进行代码注入和安全漏洞的绕过,涉及到正则表达式、字符串处理和变量覆盖等多个方面。

目录

web89

web90

web91

web92

web93

web94

web95

web96

web97

web98

web99

web100

web101 

web102

web103

web104

web105

web106

web107

web108

web109

web110

web111

web112

web113

web114

web115

web123

web125

web126

web127

web128

web129

web130

web131

web132

web133

web134

web135

web136

web137

web138

web139

web140

web141

web142

web143

web144

web145

web146

web147

web148

web149

web150

web150plus


web89

intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer(整数) 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

因为这里的主要是因为preg_match函数无法处理数组【这是他的一个漏洞,所以我们构建一个数组,num[ ]=后面可以随便填一些数字也可以不填,就可以直接出来。】

payload:num[]=0

web90

来了解一下intval:

语法

int intval ( mixed $var [, int $base = 10 ] )

参数说明:

  • $var:要转换成 integer 的数量值。
  • $base:转化所使用的进制。

如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

4476的16进制:0x117c

4476的8进制:010574

看本地运行的结果

就是说,如果第二个参数是0的话,会根据第一个参数输入的进制进行10进制转换

第一个就是16进制转10进制

第二个就是8进制转10进制

intval取的是我们所输入内容开头的整数,也就是说我们传入含有字符的字符串,例如?num=4476a,那么intval(“4476a”)也等于4476

payload:num=4476a

payload2:num=010574

payload3:num=0x117c

web91

preg_match 函数用于执行一个正则表达式匹配

^ 表示匹配文本的起始位置

/i   表示匹配大小写

/m  表示多行匹配

(10条消息) 正则表达式中/g /i /m /e /x /s的用法_正则表达式/g_qq_39527503的博客-CSDN博客

解释一下上面两个if就是说多行之内要有php,一行之内不能有php

paylaod:cmd=%0aphp           (%0a是换行的意思)

web92

和web90差不多,还有一种写法

可以看到4476e123是以科学计数法方式的,可以绕过第一个if判断,intval()函数如果$base为0则$var中存在字母的话遇到字母就停止读取,所以intval遇到4476e123会变成4476

paylaod:4476e123

web93

过滤了a-z用不了16进制和科学计数法了,用8进制

payload:010574

web94

这道题只需要注意一下 strpos函数是查找字符串首次出现的位置

第一个if是强等判断(即判断类型又判断内容)

第三个if的意思   传进来的字符串必须要有0,而且是不能以0开头

对于strpos()函数,我们可以利用换行(%0a)和空格进行绕过

payload1:?num=%0a010574

payload2:?num= 010574(前面加了空格,用  %20    +  都可以都是空格的意思)

payload3:?num=4476.0   (绕过强等判断)

payload4:?num=+4476.0

web95

过滤了. 用web94没用.的payload即可

web96

$_GET[u]是弱类型比较可以在前面加路径绕过比较,但是文件还是可以正常读取

payload:u=./flag.php

payload:u=/var/www/html/flag.php

web97

a要不等于b,但是md5要相等,可以用数组,MD5数组的话返回的是相同的值

payload:a[]=1&b[]=2

web98

其实就是看三元表达式(真2假3)

看下这4行的意思

//如果有get参数那么get=$_post否则get=flag

//如果get的flag变量等于flag那么get=cookie

//如果get的flag变量等于flag那么get=$_SERVER

//如果get的http_flag变量等于flag,那么输出 flag

中间的代码没有作用,因为我们不提交 flag 参数

利用第一行和第四行:先让get有参数让它为真,从而拿post数据

payload:get传参   ?1=1   (随便什么都可以)

                post传参   HTTP_FLAG=flag

另一种:get传参让它拿post数据,post传入flag=flag拿cookie数据,cookie则传入第四行的判断

payload2:get传参   ?1=1   (随便什么都可以)

                  post传参   flag=flag  (让它进入第二行的判断,拿cookie数据)

                  cookie传参  HTTP_FLAG=flag

web99

for循环里面的意思是取随机数1到36之间一个数,1到37之间一个数,1到38一个数,直到1到877,然后把每次拿到的随机数追加到allow数组里面

in_array判断allow数组里面是否有n参数,

看下我本地运行的一个结果,可以看到里面是字符串也可以判断成功的

payload:get传参  n=1.php

                post传参 content=<?php eval($_POST[a]);?>

web100

is_numeric检测变量是否为数字或数字字符串

v0那一行:赋值的优先级要高于and,所以不用管v2 v3是不是数字,只会把v1赋值给v0

if匹配v2里面不能有;号,v3里面要有;号

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

payload2:?v1=1&v2=eval($_POST[a])?>%23&v3=;

                post的a变量直接rce

?>是为了闭合,%23是#,是为了注释后面的

web101 

ReflectionClass

这个类的意思是说根据传进去的参数实例化ctfshow类或者别的类

传进去之后变成 new ReflectionClass('ctfshow')

payload:?v1=1&v2=echo new ReflectionClass&v3=;

web102

substr截取函数   从下标为2的位置截取到后面

call_user_func回调函数:调用v1函数,参数是$s

<?=`cat *`; base64加密后是PD89YGNhdCAqYDs,

16进制编码之后是 5044383959474e6864434171594473

hex2bin函数:把十六进制值转换为 ASCII 字符:(可以看到是可以把16进制还原回去

使用hex2bin函数后可以直接转换成base64的结果,然后在用伪协议base64解码写入文件

payload:v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

v1=hex2bin

前面加的11是因为substr会从第三位开始截断,所以随便写都可以

也可以用下面这个加密base64在16进制之后也是全部是数字

<?php eval ( $_POST[ _ ] ) ;

995044397761484167494756325957776749436767494352665545395456467367587942644943417049447367

web103

解法同上

web104

payload:传两个相同的数进去即可

payload 2:用数组也可以绕过

payload 3:aaK1STfY 和 aaO8zKZF 的hash值是一样的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值