CTF中,PHP代码注入是一种比较常见且实用的技术,而通过构造一个带有注入点的PHP id参数,我们就可以进行PHP代码注入。那么,怎样才能实现这一操作呢?具体来看一下下面的实例。
访问地址:www.test.com/index.php?id=1
1.字符型注入
访问地址:www.test.com/index.php?id=1%27
此时,虽然id=1%27,但是执行的却是id=1'。因为在URL参数里,%27恰好是转义后的单引号(')字符。PHP对于单引号是个敏感字符,会认为它是一段字符串结束标志,于是id=1'就成为了$id=“1'”。
2.数字型注入
访问地址:www.test.com/index.php?id=1 and 1=1
数字型注入不同于字符型注入,它通过and或or,将多个条件拼凑在一起,来实现注入。观察上述URL地址,其中id是1,and后面接的是1=1,所以原本的SQL语句就变成了select * from news where id=1 and 1=1。由于1=1是恒成立的,所以查询结果不会受到影响。
3.函数型注入
访问地址:www.test.com/index.php?id=1 and extractvalue(1,concat(0x5c,(select version())))
函数型注入是利用SQL注入函数,来实现我们想要的功能。上述URL地址中使用了extractvalue 和concat函数,从而将MySQL的版本信息注入到SQL查询语句中,从而获取了数据库的版本信息。关于SQL注入函数的使用,需要有一定的编程经验和知识积累,因此有一定的难度。
总结
以上介绍的仅是其中的几种注入方式,实际上还有其他很多方式可以实现PHP代码注入。对于开发者来说,防范SQL注入攻击至关重要,可以采用预处理语句、过滤用户输入等方式来尽可能的避免注入漏洞。同时,在CTF中,我们也需要了解这些注入技术,从而在竞赛中获取更高的分数。