尝试访问

http://mdsec.net/addressbook/32/

2.INSERT语句

INSERT语句用于在表中建立一个新的数据行。应用程序通常使用这种语句添加一条新的审 计日志、创建一个新用户账户或生成一个新订单。

例如,如果一个应用程序允许用户自我注册,指定他们自己的用户名和密码,就可以使用下面的语句将用户资料插入users表中。

img237a

如果username或password字段存在SQL注入漏洞,那么攻击者就可以在表中插入任何数据,包括他自己的ID和privs值。然而,要想这样做,攻击者就必须确保VALUES子句的其他部分正常运行。特别是其中数据项的个数与类型必须正确。例如,当注入username字段时,攻击者可以提交以下输入:

img237b

它将建立一个ID为9999,privs为0的账户。假如privs字段用来决定账户权限,那么攻击者就可以利用它创建一个管理用户。

有时,攻击者完全盲目地注入一个INSERT语句也能够从应用程序中提取出字符串数据。例如,攻击者可以拦截数据库的版本字符串,并把它插入自己用户资料的一个字段中;正常情况下,浏览器将显示数据库的版本信息。

img004  提示  当设法注入一个INSERT语句时,可能无法提前知道需要提交多少个参数或参数的类型。在前面的示例中,可以通过在VALUES子句中持续增加一个新的字段,直到应用程序创建了确实想要的用户账户,从而解决上述问题。例如,当注入username字段时,可以提交以下输入:

img237c

由于大多数数据库都会隐式地将一个整数转换为一个字符串,可以在每个位置都使用一个整数。在这个示例中,不管其他字段如何,它将生成一个用户名为foo、密码为1的账户。

如果发现使用值1仍然遭到拒绝,可以尝试使用值2000,许多数据库也会隐式地将它转换成基于数据的数据类型。

确定注入点之后的正确字段数后,在MS-SQL中,测试员可以任意添加另外一个查询,并采用本章后面部分将介绍的基于推断的技巧。

在Oracle中,则可以在insert查询内发布subselect查询。使用本章后面部分将介绍的基于推断的技巧,该subselect查询可能导致主查询成功或失败。