http://mdsec.net/addressbook/12/
UPDATE语句用于修改表中的一行或几行数据。它们经常用在用户修改已有数据值的功能中,例如,更新联系信息、修改密码或更改订单数量。
典型UPDATE语句的运行机制与INSERT语句类似,只是UPDATE语句中通常包含一个WHERE子句,告诉数据库更新表中哪些行的数据。例如,当用户修改密码时,应用程序可能会执行以下查询:
实际上,这个查询首先核实用户的现有密码是否正确,如果密码无误,就用新的值更新它。如果这项功能存在SQL注入漏洞,那么攻击者就能避开现有密码检查,通过输入以下用户名更新管理员的密码:
注解
由于无法提前知道应用程序将根据专门设计的输入执行什么操作,因此,在一个远程应用程序中探查SQL注入漏洞往往非常危险。特别注意,修改UPDATE语句中的WHERE子句可能会使一个重要的数据库表发生彻底的改变。例如,如果上面的攻击者之前已经提交了以下用户名:
那么应用程序可能会执行以下查询:
它会重新设置每一名用户的密码!
即使所攻击的应用程序功能(如主登录功能)并不会更新任何现有数据,渗透测试员也应当留意这种风险。有时候,在用户成功登录后,应用程序会使用用户提交的用户名执行各种UPDATE查询,这意味着任何针对WHERE子句的攻击可能会“复制”到其他语句中,给所有应用程序用户的资料造成严重破坏。在尝试探查或利用任何SQL注入漏洞之前,必须确保应用程序所有者接受这些无法避免的风险;同时,应该强烈建议他们在开始测试前对数据库进行完整备份。