0x01 引言

这是我在阅读80vul期刊中发表的[PCH-009]Security risk of php string offset一文后,根据自己的理解,对PHP offset这一特性,从实际角度出发,写出的分析。原文地址:http://www.80vul.com/webzine_0x06/PSTZine_0x06_0x03.txt

0x02 简述

PHP对于字符串数组中存在这样一个特性,当我们并未明确声明一个字符串变量是数组时,便直接给他赋值,例如:$test=’TPCS’。而在代码后面,我们想要把这个字符串变量当做字符串数组来使用时,例如:echo $test[‘hello’],我们会得到什么?我们来看下效果,如下图:

PHP代码审计小技巧,PHP字符串偏移特性的分析

通过上图的实验,可以得知,当不存在相应的key时(hello),php会将这个字符串的偏移值为0的value(T)作为这个key的value。

0x03 利用

这个特性对我们的攻击有什么帮助呢?

现在的php服务,一般都是默认开启魔术引号,如果没有开启,在关键的参数部分,也会进行反斜杠处理。试想一下,如果某个可控变量通过数组传输。意淫太抽象了,我们还是具体一点,拿出个实例来说一下吧?。

假设一个源码中有如下代码:

PHP代码审计小技巧,PHP字符串偏移特性的分析

sql变量是将要执行的sql语句,php默认开启魔术引号,我们来看下正常提交的效果

PHP代码审计小技巧,PHP字符串偏移特性的分析

单引号被反斜杠过滤掉了,下面我们来试下另一种方式的提交,看看效果如何

PHP代码审计小技巧,PHP字符串偏移特性的分析

test已经完全脱离了可恶的单引号限制,现在是天高任鸟飞,SQL任你插啦,嘿嘿。为什么会出现这种情况呢,我们来把一些关键的变量dump出来,看下这种状况是怎么造成的。

代码:

PHP代码审计小技巧,PHP字符串偏移特性的分析

执行:

PHP代码审计小技巧,PHP字符串偏移特性的分析

这两幅图,结合我们之前所说的PHP offset这一特性的话,就很好理解了吧。我们先给xigr[]=’,由于魔术引号的限制,导致xigr[]=\’,在xigr[][uid]进行传值时,由于PHP offset这一特性,导致“\”被传进了变量。这样一来,保护SQL语句不被注入的“\”便成为了我们的帮凶,帮助我们将SQL中正常的“’”转义掉。

转自:http://forum.90sec.org/viewthread.php?tid=3482&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000