SQL注入原理讲解
SQL 注入是什么SQLStructured Query Language结构化查询语言是用于操作关系型数据库的语言。网站通常通过 SQL 完成用户登录、查询信息、修改数据等操作。例如一个网站要查询用户编号为 1 的信息SELECT * FROM users WHERE id 1;正常情况下用户输入的内容应该只作为数据参与查询。SQL 注入的本质是攻击者通过用户可控的输入改变了原本 SQL 语句的结构或执行逻辑。例如网站后台有下面这段 PHP 代码$id $_GET[id]; $sql SELECT * FROM users WHERE id$id;用户访问http://localhost/Less-1/?id1服务器最终执行SELECT * FROM users WHERE id1;这是一条正常的查询。但如果用户输入1 OR 11服务器拼接后得到SELECT * FROM users WHERE id1 OR 11;原本只应该查询一个用户现在由于 OR 11 恒为真查询条件发生了改变可能返回多条记录。这就是 SQL 注入。SQL 注入有哪些类型1. 联合查询注入UNION SQL Injection这是 sqli-labs Less-1 中非常典型的利用方式。SQL 中的UNION可以把两条查询的结果合并。例如SELECT id, username FROM users UNION SELECT id, email FROM emails;它把两组查询结果合并返回。如果网站存在 SQL 注入攻击者可能通过UNION SELECT让数据库返回原本不应该提供的数据。联合查询注入通常需要满足原始查询和联合查询的列数一致。对应列的数据类型兼容。页面存在可以观察查询结果的回显位置。2. 报错注入Error-Based SQL Injection利用数据库报错信息泄露数据或数据库结构信息。例如SELECT * FROM users WHERE id1;这里的单引号不匹配可能导致 SQL 语法错误。如果网站把数据库错误直接显示在页面上攻击者可能从中获取数据库类型、SQL 结构等信息。3. 布尔盲注Boolean-Based Blind SQL Injection有些网站不会显示数据库错误也不会直接显示查询数据。但是页面会根据查询条件真假产生不同结果。例如在本地靶场中测试SELECT * FROM usersWHERE id1 AND 11;和SELECT * FROM usersWHERE id1 AND 12;第一个条件为真第二个条件为假。如果网页在两种情况下表现不同就可能存在布尔盲注的利用条件。这种方式通常需要通过多次真假判断逐步推断信息。4. 时间盲注Time-Based Blind SQL Injection当页面没有明显的真假差异时还可以利用数据库的延迟函数判断条件。MySQL 有一个函数SELECT SLEEP(3);它可以让数据库执行产生约 3 秒延迟。如果注入条件成立时请求明显变慢而条件不成立时没有延迟就可能通过响应时间推断条件真假。不过网络波动、服务器负载等也会影响响应时间所以不能仅凭一次延迟认定存在漏洞。5. 堆叠查询注入Stacked Queries堆叠查询是指一次执行多条 SQL 语句例如SELECT * FROM users WHERE id1;SELECT * FROM emails;如果数据库驱动及执行接口允许多语句执行攻击者可能借此执行额外操作。但不是所有数据库接口都支持堆叠查询。例如PHP 中普通的 mysqli_query() 默认不执行多条 SQL 语句。