在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();
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"] == ) {
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();
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"] == ) {
echo "flag{xxx}";
die();
}
?>

关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。

参考文档:

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

PHP字符串offset取值特性的更多相关文章

  1. SNF快速开发平台MVC-EasyUI3.9之-WebApi和MVC-controller层接收的json字符串的取值方法和调用后台服务方法

    最近项目组很多人问我,从前台页面传到后台controller控制层或者WebApi 时如何取值和运算操作. 今天就都大家一个在框架内一个取值技巧 前台JS调用代码: 1.下面是选中一行数据后右键点击时 ...

  2. Python 字符串——巧取值和列表——巧取值 对比

    Python 字符串——巧取值和列表——巧取值 对比 1.字符串取值实例: samp_string = "Whatever you are, be a good one." for ...

  3. python基础(数字、字符串、布尔值、字典数据类型简介)

    一 执行第一个python程序 1.下载安装python2.7和python3.6的版本及pycharm,我们可以再解释器中输入这样一行代码: 则相应的就打出了一句话.这里的print是打印的意思.你 ...

  4. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作

    Visual Studio 2017中使用正则修改部分内容   最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...

  5. 选中没有选中的复选框,匹配含有某个字符串的正则,json取值的两种方法,把变量定义在外面跟里面的区别

    一.筛选没有选中的复选框:not("input:checked") 二.匹配有VARCHAR的字符串:".*VARCHAR.*?" 三.json取值的两种方法 ...

  6. javascript中json对象json数组json字符串互转及取值

    今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下: 1.json类型的字符串转换为json对象及取值 var jsonString = '{"bar" ...

  7. C# 后台解析json,简单方法 字符串序列化为对象,取值

    如果后台是一个JSON的字符串格式如下: string str = "{\"Success\":true,\"Msg\":\"成功!\&qu ...

  8. setlocale(LC_ALL, ""); 取值为空字符串" "(注意,不是NULL),则locale与本地环境所使用的编码方式相同(在本地化时,应该很有用);

    在C运行库提供的多字节字符-宽字符转换函数:mbstowcs()/wcstombs()中,需要用到全局变量locale( locale encoding ),以指定多字节字符的编码类型 1. 功能: ...

  9. javascript中json对象与字符串互转及取值

    一.   json字符串转换为javascript对象,并取值 var answer = '{"id":0}' var value= JSON.parse(answer); //转 ...

随机推荐

  1. php 常用的标签比较

    eq或者 equal 等于 neq 或者notequal 不等于 gt 大于 egt 大于等于 lt 小于 elt 小于等于 heq 恒等于 nheq 不恒等于

  2. html5与css3学习实践--基础的内容划分标签

    从位置上划分出网页的区域以后,就需要用到网页的内容标签了,比如<article>.<aside>.<nav>.<p>.<h1>等.网页中,这 ...

  3. python3 异步模块asyncio

    yield方法引入, 这里存在的问题是,如果你想创建从0到1,000,000这样一个很大的序列,你不得不创建能容纳1,000,000个整数的列表. 但是当加入了生成器之后,你可以不用创建完整的序列,你 ...

  4. C++ 结构体和枚举

    共同体 共同体(union) 是一种数据格式, 它能够存储不同的数据类型, 但只能同时存储其中的一种类型.也就是说, 结构可以同时存储int.long 和 double, 共同体只能存储int.lon ...

  5. Lamp后端开发技能表v0.1(转)

    专业技能 Linux 阿里云服务器免费购买 服务器环境搭建 常用命令:慕课网-Linux达人养成计划 编辑器vim:床用命令.模式等等 shell Apache/Nginx 环境配置 一些配置项的参数 ...

  6. Eclipse初次java开发问题总结-2

    今天对之前写的servlet程序做了个简单的性能测试发现了一些问题,经过解决这些问题没有再重现,有些问题自己确切知道原因,有的则不太确定. 1.配置文件读取问题 项目中使用.properties作为配 ...

  7. MyBatis整合Spring MVC

    前面几篇文章已经讲到了mybatis与spring 的集成.目前主流的Web MVC框架,除了Struts这个主力外,还有Spring MVC,主要是由于 Spring MVC 配置比较简单,使用起来 ...

  8. Kilo 版 Keystone 数据库结构

    在安装完keystone并利用keystone-manage命令同步数据库后,mysql(我使用的存储后端)中新加了如下表: +------------------------+ | Tables_i ...

  9. javapms部署之后首页不能正常显示问题

    今天在ligerui的技术群里看见了javapms,于是就到官网逛了逛 首先要做的就是了解了javapms使用到的技术 然后下载了程序安装包javapms_v1.1_beta(官网下载失败了,就bai ...

  10. Java排序算法——堆排序

    堆排序 package sort; public class Heap_Sort { public static void main(String[] args) { // TODO 自动生成的方法存 ...