开发者社区> bypass> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PHP字符串offset取值特性

简介:   在PHP的代码基础上,PHP字符串offset取值特性,可以拿来利用,给PHP应用程序带来安全风险。   在PHP中,可以像操作数组一样操作字符串,字符串中的字符可以用类似数组结构中的方括号包含对应的数字索引的形式来进行查找和修改,例如 $test[0]。
+关注继续查看

  在PHP的代码基础上,PHP字符串offset取值特性,可以拿来利用,给PHP应用程序带来安全风险。

  在PHP中,可以像操作数组一样操作字符串,字符串中的字符可以用类似数组结构中的方括号包含对应的数字索引的形式来进行查找和修改,例如 $test[0]。当然 字符串中字符的排列也是从零开始的。如果需要操作的字符多余一个的话,就考虑使用函数 substr()和 substr_replace()吧。

代码示例一:

<?php
$test = "Hello World";
echo $test[0];    //输出H
echo "<br/>";
echo $test[1];    //输出e
?>

  Tips:$test[0] 方括号中的数字超出范围将会产生空白。 非整数类型被转换成整数,非法类型会产生一个 E_NOTICE级别错误, 负数在写入时会产生一个E_NOTICE,但读取的是空字符串。

代码示例二:

<?php
$test = "Hello World";
echo $test[0];    //输出H
echo "<br/>";
echo $test['id']; //输出H
?>

  可以看出,$test[0]等价于$test['id']

  代码片段可以看出,对于$test['id']这种形式的字符串,在offset取值时键值会被转换为整形,也就是等同于$test[0]这种形式。

漏洞场景:

  在某平台曾经遇到某道代码审计的题目,大致还原代码如下:

示例代码:

<?php
ini_set("display_errors", "On");
error_reporting(0);
foreach (array('_COOKIE','_POST','_GET') as $_request)  
{
    foreach ($$_request as $_key=>$_value)  
    {
        $$_key=  $_value;
    }
}
//$userinfo=333333
$userinfo["username"] = $username; //==> $userinfo[0]=a 赋值以后 $userinfo=a33333
$userinfo["password"] = $password; //==> $userinfo[0]=1 赋值以后 $userinfo=133333
$_SESSION["userinfo"] = $userinfo;

var_dump($_SESSION);
echo "<br/>";
$userinfo=$_SESSION["userinfo"];   //输出 array(1) { ["userinfo"]=> string(6) "133333" }
if($userinfo["id"] == 1) {
    echo "flag{xxx}";
    die();
}
?>

漏洞分析:

  只有当$userinfo["id"] == 1时,才能得到flag,$userinfo由$_SESSION["userinfo"]赋值而来,$_SESSION["userinfo"]又由$userinfo赋值,只要通过变量覆盖将$userinfo覆盖为值1xxxx即可,具体参数流程详见示例代码。原题还有其他条件,只能覆盖$_SESSION来解题。上面自己还原的代码还可以用变量覆盖直接解题。

<?php
//?userinfo[id]=1 ini_set(
"display_errors", "On"); error_reporting(0); foreach (array('_COOKIE','_POST','_GET') as $_request) { foreach ($$_request as $_key=>$_value) { $$_key= $_value; } } var_dump($_GET); //array(1) { ["userinfo"]=> array(1) { ["id"]=> string(1) "1" } } echo "<br/>"; if($userinfo["id"] == 1) { echo "flag{xxx}"; die(); } ?>

 

参考文档:

https://github.com/80vul/webzine/blob/master/webzine_0x06/PSTZine_0x06_0x03.txt

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
php字符串比较函数
php字符串比较函数 www.111cn.net 编辑:Crese 来源:转载       比较两个字符串是否相等,最常见的方法就是使用“===”来判断,至于它和“==”的区别,简单来说就是前者强调“identical”类型也要求一样;后者要求“equal”,值相同就可以了,参考【1】。
561 0
php字符串比较函数
比较两个字符串是否相等,最常见的方法就是使用“===”来判断,至于它和“==”的区别,简单来说就是前者强调“identical”类型也要求一样;后者要求“equal”,值相同就可以了,参考【1】。或者使用strcmp来判断,但是这个能够告诉你两个字符串是否相等,但是无法告诉你在那里不同。
579 0
PHP的字符串函数
  1、字符串的连接 字符串可以使用字符串连接符(.)来连接 常见的用途是建立大块的HTML字串代码,赋值号 (=) 连接符 (.) 可以被简写合并为 (.=) 符号   2、在字符串中使用变量 这个功能让你无须使用连接符号来粘和大量的简单字符串   单引号串和双引号串在PHP中的处理是不相同的。
970 0
PHP中的字符串函数
 http://hi.baidu.com/longniao/blog/item/2d1d1938fe8630f0b311c76e.
355 0
PHP连接MySQL 8.0报错的解决办法
PHP连接MySQL 8.0报错的解决办法
0 0
PHP连接MySQL 8.0报错的解决办法
PHP连接MySQL 8.0报错的解决办法
0 0
PHP+MySQL打造XXX管理系统
PHP+MySQL打造XXX管理系统
0 0
PHP error:mysql_fetch_row() expects parameter 1 to be resource, boolean given 的错误
PHP error:mysql_fetch_row() expects parameter 1 to be resource, boolean given 的错误
0 0
SaltStack安装Apache/Mysql/PHP部署Wordpress
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。 SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信。 master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受
0 0
【PHP秒杀系统】第一篇 环境准备即MySQL的封装
【PHP秒杀系统】第一篇 环境准备即MySQL的封装
0 0
+关注
bypass
一个网络安全爱好者
文章
问答
文章排行榜
最热
最新
相关电子书
更多
yqdh_58c127bb3e4...1510402406.pdf
立即下载
复杂PHP系统性能瓶颈排查及优化
立即下载
PHP与APM_技术内幕和最佳实践
立即下载