sprintf格式化字符串安全问题

先看sprintf用法:

定义和用法

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

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

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

例子1(当占位符使用):

例子2(%2表示占位符,$s表示格式化类型):

在php格式化字符串中,%后的一个字符(除了%)会被当做字符类型,被吃掉,包括'  所以造成了单引号逃逸。

%没有被吃掉

这样可能遇到php 警告,可以提交%1$吃掉后面的斜杠。

总结利用条件:

1、执行语句使用sprintf或者vsprintf拼接

2、执行语句进行了俩次拼接,第一次拼接的参数内容可控

参考文章:https://paper.seebug.org/386/

GitHub:https://github.com/Afant1
不忘初心、方得始终
Copyright@2021 Afant1
[转载文章务必保留出处和署名,谢谢!]
原文地址:https://www.cnblogs.com/afanti/p/8033191.html