PHP相关
PHP代码审计
弱类型
===
比较时会判断类型是否相同再比较==
比较时会将字符串类型转化为相同再比较- 由此可以演化出一系列弱类型攻击方法
哈希绕过(MD5)
- 数组 array->null可以实现强相等
- "0exxxxx" == "0eyyyy" //true
- MD5哈希碰撞可以实现字符串强相等
命令注入
- 执行系统命令时注入恶意拼接的代码,一般来说web服务器的用户执行权限是www-data
- r = 4; w = 2; x = 1;
- -rwxr--r--等价于一个文件权限是744
- drwxr--r--等价于一个目录权限是744
常用shell命令
echo 'abc' | md5sum
管道%0a
%0d
换行符;
无论如何都执行&&
成功后执行||
失败后执行
Bypass
- 过滤空格的绕过
$IFS
${IFS}
$IFS$9
<
<>
{cat,flag.php}
%20
%09
- 过滤关键字的绕过
- 反斜线
\
绕过 - 两个单引号
''
绕过 - base64 hex绕过
- 通配符匹配
- 变量绕过
- 反斜线
- 双写绕过(添加自身)
代码执行
<? php eval($_POST[0]);?>
一句话木马,因为evel把字符串当代码执行- 异或绕过
- 取反绕过
- 正则表达式 ?><?=
/???/???%20*
可以匹配上 echo/bin/cat/flag.php
$f=create_function('$a, $b, $code');
HTTP参数传递
- GET方法传递
- POST方法传递
robots.txt君子协定
- 口头禁止爬虫爬取robot.txt下的内容
PHP反序列化
- 序列化serialize()将变量转化为字符串
- 反序列化unserialize()
- POP 面向属性编程(Property-Oriented Programing)
序列化对象特征
O:6:"class1":3:{s:1:"a";s:1:"1";s:4:"b";s:5:"ThisB";s:9:"class1c";s:5:"ThisC";}
O:对象名的长度:"对象名":对象属性个数:{s:属性名的长度:"属性名";s:属性值的长度:"属性值";}
- a是public类型的变量,s表示字符串,1表示变量名的长度,a是变量名。
- b是protected类型的变量,它的变量名长度为4,也就是b前添加了%00%00。所以,protected属性的表示方式是在变量名前加上%00*%00。
- c是private类型的变量,c的变量名前添加了%00类名%00。所以,private属性的表示方式是在变量名前加上%00类名%00
- 虽然Test类中有test1方法,但是,序列化得到的字符串中,只保存了公有变量a,保护变量b和私有变量c,并没保存类中的方法。也可以看出,序列化不保存方法。
魔术方法
__construct()
:具有构造函数的类会在每次创建新对象时先调用此方法。__destruct()
:析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。__toString()
方法用于一个类被当成字符串时应怎样回应。例如echo $obj;应该显示些什么。 此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。__sleep()
方法在一个对象被序列化之前调用;__wakeup()
:unserialize( )会检查是否存在一个_wakeup( )方法。如果存在,则会先调用_wakeup方法,预先准备对象需要的资源。get()
set()
当调用或设置一个类及其父类方法中未定义的属性时__invoke()
调用函数的方式调用一个对象时的回应方法call
和callStatic
前者是调用类不存在的方法时执行,而后者是调用类不存在的静态方式方法时执行。
phar反序列化
session反序列化
PHP文件上传
- 经常和文件包含结合
PHP文件包含
- 文件包含漏洞
- 本地文件包含 相对于被攻击服务器的本地文件
- 远程文件包含 相对于被攻击服务器的远程文件
php伪协议
-
file://
-
php://input
用于把input内容当作php代码执行- 在协议头输入: ?/file=php://input
?/file=php://input%00
可以用作截断- 在请求体输入:<?PHP system("ls /"); ?>`
00截断
- payload后加上
%00