SQL注入漏洞

1.原理

SQL注入是一种常见的安全漏洞,它允许攻击者通过在应用程序的输入字段中插入恶意的SQL代码来执行未经授权的数据库操作。SQL注入的原理是利用应用程序对用户输入数据的不正确处理,使得攻击者能够向数据库发送恶意的SQL查询,从而绕过应用程序的访问控制并访问、修改或删除数据库中的数据。

以下是SQL注入的一般工作原理:

  • 用户输入数据的不正确处理:应用程序未正确过滤或转义用户输入的数据,将用户输入直接拼接到SQL查询中,而不是使用参数化查询或其他安全的方式来处理输入数据。
  • 构造恶意的SQL查询:攻击者利用应用程序的漏洞,向输入字段中插入恶意的SQL代码。这可以是通过表单输入、URL参数、Cookie等方式注入恶意代码。
  • SQL查询的执行:一旦恶意SQL代码被插入到查询中,应用程序会将整个SQL查询发送到数据库服务器执行,包括攻击者注入的恶意部分。
  • 数据库执行恶意代码:数据库服务器执行了恶意注入的SQL代码,这可能导致数据库泄露敏感数据、修改数据、删除数据,甚至完全控制数据库服务器。
  • 攻击者获取数据或控制:通过成功的SQL注入攻击,攻击者可以获取敏感数据,如用户凭证、个人信息,或者控制数据库服务器执行任意操作

SQL注入的诱因

特殊函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
addslashes() # 将单引号转义了,在单引号前面加了个\
htmlspecialchars() # 将特殊符号转换为html实体编码,处理xss漏洞的一个防御函数
str_replace() # 将单引号替换成\加上单引号
intval() # 将其中的字符给去掉
is_numeric()
urldecode()
// ,if(1=1,sleep(1),0)
// and(if(1=1,sleeep(1),0))
// BY id {asc,if(1=1,sleep(1),1)};
// 预编译

include_once('./common.php');

try{
$name = $_GET['name'];

$query = "SELECT name, age, email, country FROM user_details where name = ?;";
echo $query."<br>";
//
$stmt = $conn->prepare($query);
$stmt->bindValue("name", $name);

$stmt->execute();
$stmt->bind_result($name, $age,$email,$country);

while ($stmt->fetch()){
echo "$email"."<br>";
}

} catch (PDOException $e) {
echo $e->getMessage();
}
-------------------------------------------------------------------------------
$name = addslashes($_GET['name']);
$name = urldecode($name);
// ' ==> %27 #单次url编码 因为浏览器会自动解码一次
SELECT name, age, email, country FROM user_details where name = '{一号%25%32%37 union select 1,2,user(),4 %23}';