1、SQL注入简介

Sql注入即攻击者利用web应用程序对用户输入数据的合法性判断或过滤不严,构造非法sql语句在管理员不知情的情况下获取数据库敏感数据,如用户隐私、管理员账号密码等的一种网络攻击手段。

2、SQL注入的类型

   数字型注入:输入参数数据类型为整型时,如数据库中的年龄、分值等,存在注入漏洞则其为数字型注入。例:

在url地址中输入:http://xxx.xx.xx/index.php?id=1 and 1=1 页面返回正常

在url地址中输入:http://xxx.xx.xx/index.php?id=1 and 1=2 页面返回错误

字符型注入:输入参数数据类型为字符型时,如数据库中的名字、密码等,存在注入漏洞则其为字符型注入。例:

在url地址中输入:http://xxx.xx.xx/index.php?id=1’ and ‘1’=’1 页面返回正常

在url地址中输入:http://xxx.xx.xx/index.php?id=1’ and ‘1’=’2 页面返回错误

两者区别:数字型注入不需要单引号闭合,而字符型注入一般需要单引号来闭合。

3、注入手法

   基于布尔的盲注:利用web页面返回值只有true和false,根据返回值判断是否存在注入点,以便获取数据库信息。

基于时间的盲注:在某些场合下,页面只有一种返回结果,需要使用具有延时功能的函数sleep()、benchmark()等,通过判断这些函数是否正常执行来获取数据库中的数据。即利用web页面响应的时间差来判断是否存在注入点。例如http://xxx.xx.xx/index.php?id=1’ and if(1=1,sleep(8),1)# 当’and 1=1为真时延迟8秒返回 ,假则直接返回,由此测试是否存在注入点。

基于错误信息的注入:有些web页面在会返回错误提示信息,根据错误信息对代码中的SQL语句的结构进行猜测与验证,回显有用的相关数据库错误信息,引导进一步注入。

联合查询注入:即将两表合并查询,但需要满足以下条件:存在注入点且有回显位;列数和数据类型要一致。

堆查询注入:利用分号 ; 结束一条SQL语句的原理,构造多条SQL语句,以执行任意非法操作。不过受环境局限很大。

4、注入一般流程

(1)SQL注入点探测;

(2)收集后台数据库信息;

(3)猜解用户名和密码;

(4)查找Web后台管理入口;

(5)入侵和破坏。

5、简单手工判断是否存在注入点

(1)加 ‘ 或 “ 如果返回页面错误则存在注入点

(2)加 and 1=1 或 ‘ and 1=1 --+ 或 ’) and 1=1 或 “) and 1=1 或者and ’1’ = ‘1返回正确

加 and 1=2 或 ‘ and 1=2 --+ 或 ’) and 1=2 --+ 或 “) and 1=2 --+或者and ’1’ = ‘2返回错误

(--(后面有个空格,因为不加空格,--直接和系统自动生成的单引号连接在了一起,会被认为是一个关键词,无法注释掉系统自动生成的单引号。)与 # 表示注释,在get请求传参注入时常使用--+的方式来闭合;如果是post请求,则可以直接使用#来进行闭合。其中#的urlencode编码为%23)

6、SQL注入工具——sqlmap

手工注入无疑是对一个信安学者对SQL注入的掌握程度的考验,但注入手段层出不穷,防注入手段也日新月异,光靠手工注入太耗人力成本了。sqlmap作为一个自动化的注入工具,可以轻易的帮助我们扫描、发现并利用给定URL的SQL注入漏洞,并且自带多个脚本,支持多种数据库如MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Firebird 、Sybase和SAPMaxDB等。学注入不学Sqlmap,简直就像出门不带手机。

6.1、 Sqlmap的五个探索等级

在sqlmap中一共有五个探测等级,默认等级为一。

等级为一时会测试get和post的数据。

等级为二时会测试HTTP头的cookie注入。

等级为三时会测试HTTP的user-agent、referer头、xff头等的注入

等级越高,包含的playload越多,探测范围越广,探测时间也相对较长。

6.2、Sqlmap 命令的使用:

-u 指定目标URL (可以是http协议也可以是https协议)

-d 连接数据库

--dbs 列出所有的数据库

--current-db 列出当前数据库

--tables 列出当前的表

--columns 列出当前的列

-D 选择使用哪个数据库

-T 选择使用哪个表

-C 选择使用哪个列

--dump 获取字段中的数据

--batch 自动选择yes

--smart 启发式快速判断,节约浪费时间

--forms 尝试使用post注入

-r 加载文件中的HTTP请求(本地保存的请求包txt文件)

-l 加载文件中的HTTP请求(本地保存的请求包日志文件)

-g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试

-o 开启所有默认性能优化

--tamper 调用脚本进行注入

-v 指定sqlmap的回显等级

--delay 设置多久访问一次

--os-shell 获取主机shell,一般不太好用,因为没权限

-m 批量操作

-c 指定配置文件,会按照该配置文件执行动作

-data data指定的数据会当做post数据提交

-timeout 设定超时时间

-level 设置注入探测等级

--risk 风险等级

--identify-waf 检测防火墙类型

--param-del="分割符" 设置参数的分割符

--skip-urlencode 不进行url编码

--keep-alive 设置持久连接,加快探测速度

--null-connection 检索没有body响应的内容,多用于盲注

--thread 最大为10 设置多线程

6.3、Sqlmap 自带脚本相关信息

apostrophemask.py              用UTF-8全角字符替换单引号字符

apostrophenullencode.py        用非法双字节unicode字符替换单引号字符

appendnullbyte.py              在payload末尾添加空字符编码

base64encode.py                对给定的payload全部字符使用Base64编码

between.py分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”

bluecoat.py   在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=”

chardoubleencode.py对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)

charencode.py      对给定的payload全部字符使用URL编码(不处理已经编码的字符)

charunicodeencode.py 对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)

concat2concatws.py   用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例

equaltolike.py                用“LIKE”运算符替换全部等于号“=”

greatest.py                   用“GREATEST”函数替换大于号“>”

halfversionedmorekeywords.py  在每个关键字之前添加MySQL注释

ifnull2ifisnull.py            用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例

lowercase.py                  用小写值替换每个关键字字符

modsecurityversioned.py       用注释包围完整的查询

modsecurityzeroversioned.py   用当中带有数字零的注释包围完整的查询

multiplespaces.py             在SQL关键字周围添加多个空格

nonrecursivereplacement.py    用representations替换预定义SQL关键字,适用于过滤器

overlongutf8.py               转换给定的payload当中的所有字符

percentage.py                 在每个字符之前添加一个百分号

randomcase.py                 随机转换每个关键字字符的大小写

randomcomments.py             向SQL关键字中插入随机注释

securesphere.py               添加经过特殊构造的字符串

sp_password.py  向payload末尾添加“sp_password” for automatic obfuscation from DBMS logs

space2comment.py              用“/**/”替换空格符

space2dash.py        用破折号注释符“--”其次是一个随机字符串和一个换行符替换空格符

space2hash.py        用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符

space2morehash.py    用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符

space2mssqlblank.py           用一组有效的备选字符集当中的随机空白符替换空格符

space2mssqlhash.py            用磅注释符“#”其次是一个换行符替换空格符

space2mysqlblank.py           用一组有效的备选字符集当中的随机空白符替换空格符

space2mysqldash.py            用破折号注释符“--”其次是一个换行符替换空格符

space2plus.py                 用加号“+”替换空格符

space2randomblank.py          用一组有效的备选字符集当中的随机空白符替换空格符

unionalltounion.py            用“UNION SELECT”替换“UNION ALL SELECT”

unmagicquotes.py   用一个多字节组合%bf%27和末尾通用注释一起替换空格符宽字节注入

varnish.py                    添加一个HTTP头“X-originating-IP”来绕过WAF

versionedkeywords.py          用MySQL注释包围每个非函数关键字

versionedmorekeywords.py      用MySQL注释包围每个关键字

xforwardedfor.py              添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF

7、SQL注入练习

靶场环境搭建:sqli-labs-master 或者 DVWA

工具:Sqlmap、burpsuite、phpstudy_pro(建站)

以sqli-labs-master为例:

运行salmap 输入参数-u和url进行检测注入点:

检测出了四种注入,并给出了注入playload

列出所有数据库:

列出当前数据库:

列出当前数据库的表:

查看uses表中的列名属性:

获取表字段中的数据:

8、Sqlmap与burpsuite的梦幻联动

Burpsuite中的CO2插件的安装:

对CO2进行配置(即sqlmap.py和使用的python路径,路径中不能有空格,否则会识别错误):

进行代理抓包并发送到CO2攻击模块:

点击run即可自动运行sqlmap:

在Options板块中可以根据自己的需要进行注入,可在detection中选择攻击等级,在Enumeration中勾选自己想要获取的信息,再次点击run即可:

如查看当前用户是否具有管理员权限:

利用burpsuite与sqlmap的联动可以更为简单的使用sqlmap,不再需要输入繁琐的命令,同时能直接将抓到的包为sqlmap所用。

9、sql注入的防御

Sql注入的防御我个人觉得主要在于权限、数据和语句审查三个方面。

(1)在权限上,我们可以进行分级管理,严格控制用户的权限,避免越级行为;

(2)在数据上,我们可以提前将数据加密,这样即使数据泄露,也仍能保证一定的安全;

(3)在语句审查上,我们可以对包含有一些特殊字符如#,+,--,”,and,等符号的sql语句进行审查及过滤,同时可进行参数化传值,避免直接将变量写入到sql语句中。

除此之外,我们还可以利用一些专门的sql安全参数,如sqlserver中的Parameters集合,它在数据库中的功能是对数据进行类型检查和长度验证当程序员在程序设计时加入了Parameters集合,系统会自动过滤掉用户输入中的执行代码,识别其为字符值。如果用户输入中含有恶意的代码,数据库在进行检查时也能够将其过滤掉。同时Parameters集合还能进行强制执行检查。一旦检查值超出范围。系统就会出现异常报错,同时将信息发送系统管理员,方便管理员做出相应的防范措施。 或者对访问者的数据进行严格的多层验证,只有通过验证的数据才能合法的访问系统。

web安全之sql注入相关推荐

  1. web安全学习-sql注入-针对mysql的攻击

    文章目录 1. 前言 补充:读取客户端本地文件到服务端mysql数据库 补充:利用全局日志写shell 补充:修改mysql的root密码 补充:配置远程登录 补充:低权限下读文件 补充:高版本mys ...

  2. 关于web安全之sql注入攻击

    前言:①这个晨讲我构思了两个星期,但是之前电脑坏了,一直拖到昨天才开始着手准备,时间仓促, 能力有限,不到之处请大家批评指正: ②我尽量将文中涉及的各种技术原理,专业术语讲的更加通俗易懂,但这个前提是 ...

  3. Web安全Day1 - SQL注入实战攻防

    声明:文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! 本专题文章导航 1.Web安全Day1 - SQL注入实战攻防 http ...

  4. 小迪安全第14天 web漏洞,SQL注入之类型及提交注入

    14 web漏洞,SQL注入之类型及提交注入 ​ 在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取, 后续安全测试中我们也 ...

  5. Web安全性测试—SQL注入

    Web安全性测试-SQL注入 因为要对网站安全性进行测试,所以,学习了一些sql注入的知识. 在网上看一些sql注入的东东,于是想到了对网站的输入框进行一些测试,本来是想在输入框中输入<scri ...

  6. web 中防止sql注入

    public class SqlInject:Page{//检测到注入后的处理方式: 0:仅警告:1:警告+记录:2:警告+自定义错误页面:3:警告+记录+自定义错误页面 private const ...

  7. SQL 登录注入脚本_常见web安全问题,SQL注入、XSS、CSRF,基本原理以及如何防御...

    1.SQL注入 原理: 1).SQL命令可查询.插入.更新.删除等,命令的串接.而以分号字元为不同命 令的区别.(原本的作用是用于SubQuery或作为查询.插入.更新.删除--等 的条件式) 2). ...

  8. mysql注入漏洞语句,web安全之sql注入漏洞

    概念 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通俗地讲,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力 ...

  9. WEB安全基础-SQL注入基础

    SQL注入:SQL Injectoin是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据库,或利用潜在的数据库漏洞进行攻击.数据和代码未分离,即数据当成了代码来执行. 万能密码:本质上 ...

  10. Web安全之SQL注入漏洞学习(一)

    Web程序三层架构 三层架构主要是指将业务应用规划为的表示层 UI.数据访问层 DAL 以及业务逻辑层 BLL,其分层的核心任务是"高内聚低耦合"的实现.在软件体系架构设计中,分层 ...

最新文章

  1. Android CheckedTextView 实现单选与多选
  2. 【opencv】(6) 图像轮廓处理
  3. 【古法炮制】最原始的解决JAVA接口跨域的问题
  4. django 设置外键_django2.0前后版本定义外键和一对一关系的差别
  5. Sweeter Than Fiction - Taylor Swift
  6. ios ffmpeg 保存mp4
  7. python怎么识别拼音-Python 获取中文字拼音首个字母的方法
  8. Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
  9. html居右显示语言设置,iOS开发:纯代码设置UIButton文字居左或者居右显示
  10. 【hihocoder - offer编程练习赛60 A】hohahola(贪心,二分)
  11. Oracle SQL多表查询
  12. C++编译过程中没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题? 的彻底解决...
  13. 「Leetcode」206.反转链表:听说过两天反转链表又写不出来了?
  14. IT公司速查手册的各大IT公司薪资和待遇内幕
  15. python 坦克大战
  16. hx711基本原理讲解
  17. BMFont 制作字体时,无法导入图片
  18. Python-脾气暴躁
  19. python爬虫获取下一页_Python爬虫怎么获取下一页的URL和网页内容?
  20. Ubuntu实用安装

热门文章

  1. ubuntu18.04桌面版安装ROS软件
  2. 面试官:请你详细说说Go的逃逸分析【文末送福利】
  3. 云服务器和VPS的区别
  4. 普中单片机开发板HC6800-EM3 v2.2 3.0无法烧录下载程序解决
  5. 点击复制内容到手机粘贴板(简洁易懂-只需五步)
  6. 如何查看windows的注册表
  7. 为什么培训IT的就业那么难?
  8. 伺服步进控制程序西门子200PLC和昆仑通泰MCGS触摸屏控制伺服步进电机程序例子
  9. 【Unity3D 教程系列第 1 篇】Unity如何去掉自带动画?
  10. Linux内存管理第八章 -- Slab Allocator (二)