SQL注入是一种常见的安全漏洞,通过它攻击者能获取到数据库中的敏感信息。以下,我们将逐步解析一个SQL注入的实例,以理解其操作流程。首先,输入ID=1,我们能获取到ID、FirstName、Surname信息。这表明在特定参数位置存在可被利用的注入点。通过输入ID=’,未出现错误,初步判断此注入点对输入的长度不敏感。进一步,尝试输入1 or 1=1,未能成功遍历数据表。这提示我们可能在面对数字型注入。猜测字符型注入,输入1' or '1'='1,后成功遍历数据库中所有内容,成功展示了字符型注入的威力。接下来,我们使用order by [num]语句进行测试,输入1' order by 1 --(加空格)来测试查询结果长度,继续输入1' order by 2 --(空格)和1' order by 3 --(空格),判断出查询结果为2列。使用内置函数database(),user(),version()能获取数据库账户名、数据库名称及版本信息。通过1' and 1=2 union select 1,2 --(空格)注入,可以读取到查询结果的第一列和第二列的值。利用1' and 1=2 union select user(),database()注入,成功获取数据库用户为root@localhost及数据库名为dvwa。注入1' and 1=2 union select version(),database()获取数据库版本信息及数据库名称。注入1' and 1=2 union select 1,@@global.version_compile_os from mysql.user获取操作系统信息。查询mysql数据库中的所有数据库及表时,注入1' and 1=2 union select 1,schema_name from information_schema.schemata尝试获取信息,但结果返回错误。通过注入1' and exists(select * from users)成功猜解dvwa数据库中的表名为users。注入1' and exists(select [表名] from users)尝试猜解字段名。具体到字段名,如first_name和last_name。最后,注入1' and 1=2 union select first_name,last_name from users来获取表中字段内容。在实际的渗透环境中,这步骤对于查找存储管理员账户信息和密码至关重要。