sql注入简介

00x 什么是sql注入
sql注入是一种将sql代码插入或添加到应用(用户)的输入参数中,
之后再将这些数据传递给后台的sql服务器加以解析并执行的攻击。
01x sql注入产生的过程
如果开发人员无法确保在从Web表单、cookie、输入参数等收到的
值传递给sql查询之前已经对其进行验证,通常就会出现sql注入漏洞。
02x sql注入分类:
按照注入点类型分类分为:数字型、字符型 、搜索型
数字型注入:
即传入sql服务器解析的参数是数字型(在sql表中字段的类型是数字型)
表结构如下:
《》
执行 sql查询的语句
《》
类似url:
http://127.0.0.1/index.php?user_id=1
构造参数执行过程
《》
由数字型sql执行语句知道构造注入参数时只需 使用空格就可以插入新的sql函数,
从而影响原sql语句的执行结果(以上为例即1+payload)。
字符型注入 :
即传入sql服务器解析的参数不是数字型(在sql表中字段的类型不是数字型如:字符、时间等)
表结构如下:
《》
执行sql查询的语句如下:
《》
类似url:
http://127.0.0.1/index.php?admin=admin
构造参数如下:
《》
由字符型sql执行语句知道构造sql注入参数时,需要先将上一个参数进行前后闭合,中间的参数即为攻击者想要执行的sql语句
(以上为例即admin’+payload+and ‘1’=‘1)
搜索型注入 :
其实传入的参数也是字符型,只不过执行的sql查询的语句不同,可以当作是字符型的特殊类型。
执行SQL查询的语句:
《》
类似url
http://127.0.0.1/index.php?search=o
构造参数如下:
《》
原理和字符型一样前后闭合。
按照提交方式分类分为:GET型、POST型、Cookie型、HTTP头部注入
http协议简介
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,
所有的WWW文件都必须遵守这个标准。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
http请求方法
序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。
get型注入注入点存在get请求的某个参数中;post型注入注入点存在post数据中;
cookie型注入注入点存在cookie参数中;http头部注入注入点存在http请求头部的某个字段中
《》《》

按照执行效果来分类分为:基于布尔的盲注 、基于时间的盲注、
基于报错的注入、联合查询注入、堆查询注入、宽字节注入
基于布尔的盲注
可以根据嵌入的sql真假条件返回的页面结果判断是否存在sql注入
基于时间的盲注
不能根据页面返回结果判断是否存在sql注入,可以根据嵌入的sql
时间延迟语句判断页面响应时间从而进一步判断是否存在sql注入。
时间函数
a)mysql数据库:
5.0.12及以后版本sleep()函数;5.0.12以前版本benchmark()函数。
1)区别:benchmark()函数向查询中引入了一个可变但非常显著的延迟,而
sleep()函数则强制产生一个固定延迟。
2)通用mysql二分搜索推断漏洞
’ union select if(ascii(substring(…),i,1))>k,sleep(1),1)#
’ union select if(ascii(substring(…),i,1))>k,benchmark(100000000,rand()),1)#
其中i是由子查询(…)返回的第i个字节,k是当前二分搜索的中间值。
3)通用的mysql逐位推断漏洞
’ union select if(ascii(substring(…),i,1))&2j=2j,sleep(1),1)#
’ union select if(ascii(substring(…),i,1))&2j=2j,benchmark(100000000,rand()),1)#
其中i是由子查询(…)返回的第i个字节,j是我们关心的位
b)PostgreSQL数据库
8.1及8.1以下版本sleep()函数;8.2及8.2以上版本使用pg_sleep()函数
1)二分搜索法漏洞推断
使用堆叠查询和用户自定义pause()函数的注入字符串:
’ ; select case when (ASCII(SUBSTR(…,i,1))>k) THEN pg_sleep(1) END;SELECT NULL,…NULL;–
’ || (select case when (ASCII(SUBSTR(…,i,1))>k) THEN PAUSE(1) ELSE 1 END);–
其中,i是子查询(…)返回的第i个字节,而当k是当前二分搜索的中间值。
2)通用的PostgreSQL逐位方法漏洞推断
’ ; select case when (ASCII(SUBSTR(…,i,1))&2j=2j) THEN pg_sleep(1) END;SELECT NULL,…NULL;
’ || (select case when (ASCII(SUBSTR(…,i,1))&2j=2j) THEN PAUSE(1) ELSE 1 END);–
其中i是由子查询(…)返回的第i个字节,j是我们关心的位
c) SQL Server数据库
waitfor关键字,用法:waitfor delay ‘00:00:15"
1) 通用SQL Server二分搜索推断
’ ; IF ASCII(SUBSTRING((…),i,1))>k waitfor delay ‘00:00:05’; –
其中,i是子查询(…)返回的第i个字节,而当k是当前二分搜索的中间值。
2) 通用SQL Server逐位推断
’ ; IF ASCII(SUBSTRING((…),i,1))&2j=2j waitfor delay ‘00:00:05’; –
其中i是由子查询(…)返回的第i个字节,j是我们关心的位
d) Oracle数据库
Oracle数据库使用DBMS_LOCK包,这个包提供了sleep()函数和其他函数,其调用如下:
BEGIN DBMS_LOCK>SLEEP(n); END;
该方法存在很多约束。1、不能将它嵌入子查询中;2、默认情况下除了数据库管理员外,其他用户均无法使用DBMS_LOCK包
如果注入点位于PL/SQL块中,可使用如下代码来产生延迟:
if (bitand(ascii(substr(…),i,1)),2j)=2j) then dbms_lock,sleep(5);end if;
其中i是由子查询(…)返回的第i个字节,j是我们关心的位
基于报错的注入
页面会返回错误信息或者直接返回sql语句
可以使用如下代码:
a、’
b、and 1=1/and 1=2
联合查询注入
可以使用union
堆查询注入
可以同时执行多条语句
宽字节注入
04x sql注入防御
1)使用参数化语句
大多数编程语言和数据库访问API可以使用占位符或绑定变量来向SQL查询提供参数(而非直接对用户输入进行操作)。
优势:数据库可以根据提供的预备语句来优化查询,从而提高后续查询的性能。
缺点:如果正在调用的数据库功能在存储过程或函数的实现中使用了动态SQL,那么仍然可能出现SQL注入漏洞 。
2)输入验证
输入验证是指测试应用程序接收到的输入,以保证其符合应用程序中标准定义的过程。它可以简单到将参数限制成某
中类型,也可以复杂到使用正则表达式或业务逻辑来验证输入。分为白名单验证(包含验证或正验证)和黑名单验证(排除
验证或负验证)
3)编码输出
确保对包含用户可控输入的查询进行正确编码以防止使用单引号或其他字符来修改查询。
如果正在使用LIKE子句,请确保对LIKE中的通配符恰当的编码。
4)规范化
将输入解码或变为规范格式后才能执行输入验证过滤器和输出编码。
尽可能使用白名单输入验证并拒绝非规范化格式的输入
5)通过设计避免sql注入
使用存储过程以便数据库层拥有较细粒度的许可。
可以使用数据访问抽象层来对整个应用施加安全的数据访问
设计时,请考虑对敏感信息进行附加控制
05x sql防御绕过
Web应用通常会使用输入过滤器来防御包括sql注入在内的常见攻击。
1)使用大小写变种
2)使用sql注释
3)使用URL编码
4)使用动态查询执行
SQL Server 使用EXEC函数:
EXEC(‘SELECT password from tblUsers’)
Orcale 使用EXECUTE IMMEDIATE命令
DECLARE pw VARCHAR2(1000);
BEGIN
EXECUTE IMMEDIATE ‘SELECT password from tblUsers’ INTO pw;
DBMS_OUTPUT.PUT_LINE(pw);
END;
5) 使用拼接
Orcale:‘SEL’||‘ECT’
MS-SQL:‘SEL’+‘ECT’
MySQL:‘SEL’ ‘ECT’
6) char函数(Orcale为CHR)构造单独的字符
如select=CHAR(83)+CHAR(69)+CHAR(76)+CHAR(69)+CHAR(67)+CHAR(84)
其他函数如Orcale中的REVERSE、TRANSLATE、REPLACE和SUBSTR函数
7) 使用空字节(如tab)
8)嵌套剥离后的表达式
有些过滤器会先从用户输入中剥离特定的字符或表达式,然后再按照常用的方式处理剩下的数据。
如果被剥离的表达式中包含两个或多个字符,就不会递归应用过滤器。如selselectect
9) 利用截断
10)宽字节注入

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值