sprintf格式化字符串安全问题
先看sprintf用法:
定义和用法
sprintf() 函数把格式化的字符串写入变量中。
arg1、arg2、++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
注释:如果 % 符号多于 arg 参数,则您必须使用占位符。占位符位于 % 符号之后,由数字和 "\$" 组成。
例子1(当占位符使用):
例子2(%2表示占位符,$s表示格式化类型):
在php格式化字符串中,%后的一个字符(除了%)会被当做字符类型,被吃掉,包括'\ 所以造成了单引号逃逸。
%没有被吃掉
这样可能遇到php 警告,可以提交%1$吃掉后面的斜杠。
总结利用条件:
1、执行语句使用sprintf或者vsprintf拼接
2、执行语句进行了俩次拼接,第一次拼接的参数内容可控
参考文章:https://paper.seebug.org/386/