如果 % 符号多于 arg 参数,该函数可取代add

2019-07-13 作者:编程   |   浏览(110)

PHP sprintf() 函数

做PHP开发这么长时间,还真没有真正关注过安全的问题,每次都是以完成项目为主,最近在网上看到了一篇关于安全的文章,看完以后才注意到自己以前的项目都存在着很大的安全漏洞,于是挑了一个项目进行了测试,发现很容易就中招儿了。在这里我会分享自己写的一个测试的例子来说明PHP中的session是如何不安全的,以及在项目中如何加强其安全性。
小鱼儿玄机30码,对于session的原理机制,网上有很多好的文章来介绍,我们可以自行查阅。下面直接分享测试用的例子。
这个测试的例子主要就是一个登录页,登录成功以后可以修改密码,就这样一个简单的功能。
界面如下

 1.准备工作

函数介绍

把百分号(%)符号替换成一个作为参数进行传递的变量:

小鱼儿玄机30码 1

  (1)PHP 版本5.6.17 下载地址  PHP官网  脚本之家 下载地址

update_option()用于更新数据表中存在的选项值。该函数可取代add_option,但不及add_option灵活。update_option会检查并判断选项是否已经存在。如果不存在,用add_option ('option_name', ‘option_value')添加选项。除非用户需要指定add_option的选项参数,否则update_option()是一个可同时添加和更新选项的两用函数。
注意:wp_load_alloptions将要加载(或不加载)某个选项时,update_option()无法更新。在这种情况下,应在使用update_option()函数后使用delete_option。

<?php
$number = 2;
$str = "Shanghai";
$txt = sprintf("There are %u million cars in %s.",$number,$str);
echo $txt;
?>

首先是在项目入口的地方使用函数 session_start() 开启了session。这样当客户端发起请求的时候,会产生一个身份标识 也就是 SessionID。通过cookie的方式保存在客户端,客户端和服务端每次的通信都是靠这个SessionID来进行身份识别的。
登录成功以后,会将 用户id、用户名存入session中

  (2)Nginx 版本1.8.0 下载地址  Nginx官网  脚本之家 下载地址

函数用法

定义和用法

$_SESSION[‘userid'] = 用户id
$_SESSION[‘uname'] = 用户名

  (3)MySQL 版本5.7.10 MySQL官网  脚本之家 下载地址

<?php update_option( $option_name, $newvalue ); ?>

sprintf() 函数把格式化的字符串写入变量中。

以后所有的操作都是通过判断 $_SESSION[‘userid']是否存在来检查用户是否登录。代码如下:

2.php的安装与配置

函数参数

arg1、arg2、 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。

if(isset($_SESSION['userid'])) return true;

  直接解压下载好的php包,到D盘wnmp目录(D:wnmp),这里把解压出来的文件夹重命名成php5。进入文件夹修改php.ini-delelopment文件为php.ini,并用Editplus或者Notepad 打开来。找到

$option_name

注释:如果 % 符号多于 arg 参数,则您必须使用占位符。占位符位于 % 符号之后,由数字和 "$" 组成。

对于修改密码接口的调用是通过ajax  post的方式将数据传输到服务端的。

extension_dir = "ext" 更改为 extension_dir = "D:/wnmp/php5/ext"

(字符串)(必需)需要更新的选项名称。在Option Reference中列出了可以升级的有效默认选项。

语法

$.post("接口*******",
  {
     oldpass:oldpass,
     newpass:newpass,
     userid:uid,
  },
  function(data){
     data = eval('('  data  ')');
     $('.grant_info').html(infos[data.info]).show();
  }
);

常用扩展,去掉最前面的";"

默认值:None

参数 描述
format

必需。规定字符串以及如何格式化其中的变量。

可能的格式值:

  • %% - 返回一个百分号 %
  • %b - 二进制数
  • %c - ASCII 值对应的字符
  • %d - 包含正负号的十进制数(负数、0、正数)
  • %e - 使用小写的科学计数法(例如 1.2e 2)
  • %E - 使用大写的科学计数法(例如 1.2E 2)
  • %u - 不包含正负号的十进制数(大于等于 0)
  • %f - 浮点数(本地设置)
  • %F - 浮点数(非本地设置)
  • %g - 较短的 %e 和 %f
  • %G - 较短的 %E 和 %f
  • %o - 八进制数
  • %s - 字符串
  • %x - 十六进制数(小写字母)
  • %X - 十六进制数(大写字母)

附加的格式值。必需放置在 % 和字母之间(例如 %.2f):

  • (在数字前面加上 或 - 来定义数字的正负性。默认情况下,只有负数才做标记,正数不做标记)
  • ' (规定使用什么作为填充,默认是空格。它必须与宽度指定器一起使用。例如:%'x20s(使用 "x" 作为填充))
  • - (左调整变量值)
  • [0-9] (规定变量值的最小宽度)
  • .[0-9] (规定小数位数或最大字符串长度)

注释:如果使用多个上述的格式值,它们必须按照以上顺序使用。

arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
arg 可选。规定插到 format 字符串中第三、四等 % 符号处的参数。

注意,我这里将这段代码写在了html页面中,所以说如果看到了html代码,也就知道了接口地址了。
修改密码的接口是这样实现的,首先是判断用户是否登录,如果登录才会进行密码的修改操作。
测试例子的实现思路大概就是上面介绍的那样。
利用SessionID攻击 1. 首先是获取SessionID,当然攻击者获取此标识的方式有很多,由于我的水平有限,至于如何获取我在这里不做介绍。我们可以模拟一下,先正常访问此项目,然后通过浏览器查看SessionID,以此得到一个合法的用户标识。可以在请求头中看到此项ID

  extension=php_curl.dll
  extension=php_gd2.dll
  extension=php_mbstring.dll
  extension=php_mcrypt.dll
  extension=php_mysql.dll
  extension=php_mysqli.dll
  extension=php_pdo.dll
  extension=php_pdo_mysql.dll
  extension=php_xmlrpc.dll

$newvalue

PHP printf() 函数

 Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0 

nginx支持配置,去掉前面";"

(混合)(必需)当前选项名称的新值。新值可以是一个字符串、数组、对象或序列化的值。

输出格式化的字符串:

得到sessionID以后,如果此用户登录成功,那么服务端的session里就有此用户的信息了。
2. 获取到SessionID以后,假如攻击者已经知道修改密码的接口,就可以直接修改此用户的密码了。如果攻击者还没有得到接口地址,可以通过查看页面代码找出接口地址。可以使用如下的命令

  ;cgi.fix_pathinfo=1

默认值:None

<?php
$number = 9;
$str = "北京";
printf("在%s有 %u 百万辆自行车。",$str,$number);
?>
#curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" 页面地址

  ;cgi.force_redirect = 1

函数实例

本文由小鱼儿玄机30码发布于编程,转载请注明出处:如果 % 符号多于 arg 参数,该函数可取代add

关键词: 小鱼儿玄机30码