Fork me on GitHub

php的sprintf带来的注入隐患

前言

php是一门神奇的语言,不同函数的配合不当就有可能造成漏洞。这里记录一下由于sprintfaddslashes函数配合使用,可能造成的注入漏洞。

分析

思考下面的代码

1
2
3
4
<?php
$user = addslashes($_GET['user']);
$sql = sprintf("select * from users where type='%s' and user='$user'",'admin');
...//对sql语句进行查询

代码中使用addslashes函数对传入参数进行转义,然后用sprintf函数进行sql语句的构造。
现在假设服务器的其他配置和代码安全,并且对该sql语句不做其他转义或过滤。那么如何绕过呢?这里由于sprintf函数在使用中将$user变量直接加入到格式化控制字符串中,那么如果$user变量中含有%的话sprintf函数将解析该位置的参数,如果没有提供对应参数函数就会报错。c语言中sprintf函数会将%d,%c等解析成相应类型,PHP中也一样,那么如果传入下面的字符串会发生什么?

1
%1$' or 1#

这里加上%1表示使用sprintf的第二个参数来对应解析。这时由于字符串通过addslashes的转义在单引号前面会插入一个\,当传入sprintf时%就会‘吞掉’后面的\,从而‘’’逃逸出来,完成注入。

解决办法

严格控制sprintf的格式化控制字符串,不使用PHP的双引号解析变量的方式。

总结

这是在做ctf中学到的,由于不知道这种方式可以使‘’’逃逸出来,还是参考了搜索引擎上的文章。漏洞总是出现在函数的使用上,熟悉函数的使用和特性对漏洞的分析和挖掘是有帮助的。另外,在漏洞挖掘中要时刻注意数据的流向,说不定当中一个环节就放过了恶意数据。

-------------本文结束感谢您的阅读-------------

本文标题:php的sprintf带来的注入隐患

文章作者:r00tnb

发布时间:2018年01月03日 - 19:01

最后更新:2018年08月04日 - 22:08

原始链接:https://r00tnb.github.io/2018/01/03/php的sprintf带来的注入隐患/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创,您的鼓励是我最大的动力!