代码编织梦想


前言:学习了一段时间渗透测试,个人最直观的感受就是渗透测试的思路问题,渗透测试其实并不像是纯技术研究,当你对一个技术点、知识点进行深究的时候,你会发现要涉及的方面、考虑的问题有太多太多,在遇到一个问题的时候往往不能从单方面的技术难点解决这个问题,而是要从多个方面考虑,尤其是面对一些漏洞并需要去解决这些漏洞的时候。你需要首先要掌握这个漏洞产生的原理,为什么会有这个漏洞?这个漏洞是如何产生的?要如何利用这个漏洞?这个漏洞应该如何修复?要看出其中的可利用之处,然后再想考为什么会错误,看看这个问题到底出在哪里,然后再去思考的渗透的思路,只要思路正确,并且有足够有耐心,总会有所突破。以上是个人最近的一些观点,以下是我在这段时间内对sql注入漏洞的探索及对其的思路理解,内容纯手打,很详细,希望能够对大家有所帮助。

什么是SQL注入?

SQL注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql 语句来实现对数据库的任意操作。

SQL注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞之一。

SQL注入漏洞有两个关键条件:

  • 用户能控制输入的能容,即参数用户可控。
  • Web应用把用户输入的内容带入到数据库中执行,从而参数可带入数据库的查询。

SQL注入漏洞产生的原因

在设计不良的程序当中没有进行严格的过滤的情况下,这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而执行,因此遭到数据泄漏或者数据的破坏。

通常是由以下几个原因造成

  • 不当的类型处理;
  • 不安全的数据库配置;
  • 不合理的查询集处理;
  • 不当的错误处理;
  • 转义字符处理不合适;
  • 多个提交处理不当。

一句话概括:对用户输入的参数未进行严格的过滤处理以及不安全的数据库配置

SQL注入漏洞的危害

  • 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露,脱取数据库中的数据内容(脱库),可获取网站管理员帐号、密码悄无声息的进行对网站后台操作等。
  • 网页篡改:通过操作数据库对特定网页进行篡改,可严重影响正常业务进行。
  • 网站被挂马:将恶意文件写入数据库,修改数据库字段值,嵌入网马链接,进行挂马攻击。
  • 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  • 文件系统操作:列取目录、读取、写入shell文件获取webshell,远程控制服务器,安装后门,经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  • 执行系统命令:远程命令执行,可破坏硬盘数据,瘫痪全系统。

SQL注入分类

SQL注入点根据不同维度可分为:

根据请求方式分类:

  • GET方式请求注入
  • POST方式请求注入

根据注入点参数分类

  • 整数型注入
  • 字符型注入
  • 搜索型注入

根据SQL注入点反馈类型分类(重点)

  • union类型
  • 基于错误显示
  • 布尔类型
  • 基于时间
  • 其他类型

根据Web应用的数据库类型分类(数据库样式扩充)

  • MySQL
  • SQLServer
  • Oracle
  • Access

事实上SQL注入的方法有很多种,按数据类型可以分为数字型、字符型和搜索型,按提交方式可分为GET型,POST型,Cookie型和HTTP请求头注入,按执行效果有可以分为报错注入、联合查询注入、盲注和堆查询注入,其中盲注又可分为基于bool的和基于时间的注入。从查询语句及可看出来这里是字符型的注入同时也是GET型注入和表单注入,
数字型注入查询语句为:SELECT * FROM user WHERE id=1,
搜索型注入为查询语句为:SELECT * FROM user WHERE search like '%1%'

在知道查询语句的情况下我们很容易辨别是否存在注入及注入类型,很多时候我们并不知道查询语句是什么,所以我们可以这样判断,在URL或者表单中输入一个单引号或者其他特殊符号,页面出现错误说明此页面存在SQL注入,如果页面正常显示说明有字符被过滤或者不存在注入,读者可自行测试,如果存在注入可以进一步判断注入类型,在URL或者表单中输入0 or 1,如果可以查到数据,说明是数字型注入,如果输入0’or 1#,查到数据说明是字符型注入,方法不唯一。总之数字型注入不需要使用单引号闭合前面的单引号就可以执行SQL语句,而字符型必须闭合前面的单引号,然后才可以执行SQL语句,同时也需要把后面的单引号闭合,而注释就是很好的一种闭合后面的单引号的方法。

下面我们来看一下DVWA上的一个SQL注入案例:
GET型注入很容易从URL中看出来,如图,网页的URL为:http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1,浏览器通常使用?来表示GET方法传递参数,而使用POST传递参数是不会显示到URL中的,因此URL中含有?说明就是使用GET方法传递参数,如图:
在这里插入图片描述

注入方法可以直接在URL中提交注入语句,需要注意的是,在URL提交SQL语句,需要将注释符#进行URL编码,有时候所有SQL语句都需要URL编码,如图:
在这里插入图片描述

SQL注入方法详解—>传送门

寻找正确的SQL注入点

  • 识别Web应用所接收的所有数据输入,有界面的可以直接通过浏览器检测,无界面的API接口可以通过使用类似Burp Suite工具截取请求包进行测试。一般商用的web扫描器都具有扫描SQL注入的功能,相比手动检查效率更高。
  • 如果参数是字符类型。提交一个单引号(’)作为目标查询的数据,观察是否会造成SQL错误,如果发现错误或其他异常行为,同时提交两个单引号(’’),如果这个输入会使错误或其他异常行为消失,则该参数可能存在SQL注入漏洞。其它的变形payload还有’ and ‘1’='1, ’ or ‘1’='1等布尔表达式。
  • 如果参数是数字类型。尝试输入一个和原来数字等价的简单数据表达式。比如原始值为2,则尝试提交1+1或者3-1(注意要对+、-等符号做URL编码,1+1应为1%2b1)。如果应用返回和之前相同的响应,则该参数可能存在SQL注入漏洞。同样可以使用类似and 1=1,or 1=1等其他判断方式。
  • 在某些情况下,可以使用其他判断SQL注入的技巧,比如参数后面添加用来产生延时的函数,通过页面延时时间判断是否存在注点。还可以使用Union查询,或者堆叠查询。(在判断基于时间注入点之前可以先确定注入点的后端数据库类型,以便减少无用的测试量。)(limit注入可以尝试,比较少见。)
  • 在系统过滤或者转义掉某些特殊字符时,尝试使用一些绕过方式,例如大小写转换,编码,宽字节绕过等。Sqlmap有一些用来绕过的tamper脚本可以尝试。

SQL注入总结

SQL注入技术不是单凭一篇博客就可以讲完的,这里只告诉大家一些SQL注入的原理及常见的几种SQL注入的形成原因及利用方法,后面遇见在详解其他方法。有很多讲SQL注入的书,个人认为Justin Clarke写的《SQL注入攻击与防御》很不错,类似的书还有很多,如果想自己深入学习,可以寻找适合自己的书。

SQL注入的一般步骤:

  • 测试网页是否存在SQL注入
  • 判断SQL注入类型
  • 利用SQL语句查询数据库当前用户及数据库
  • 利用SQL语句查询表名、列名、字段名以及字段值

如何防御SQL注入及修复方法

注入问题都是因为执行了数据项中的 SQL 关键字,那么,只要检查数据项中是否存在 SQL 关键字不就可以了么?
的确是这样,但是SQL注入的防御并不是一件简单的事情,之前我也上网查资料,大多数采取的办法也是最简单粗暴的办法就是 对用户的输入做一些escape处理,但这是不够的。这种基于黑名单的方法或多或少都存在一些问题。(在sql保留字中,用户提交的正常数据也有可能会使用这些单词,从而对用户的正常数据进行了误杀)。

那么该如何正确的防御呢?

1、使用预编译语句,绑定变量
使用预编译的sql语句,sql语句的语意不会发生改变。在sql语句中,变量用?表示,攻击者无法改变sql语句的结构。

2、使用存储过程
使用存储过程的效果和使用预编译语句类似,其区别就是存储过程需要先将sql语句定义在数据库中。但需要注意的是,存储过程也可能存在注入问题,因此应该尽量避免在存储过程内使用动态的sql语句。

3、检查数据类型进行数据校验

  • 检查数据的输入类型,在很大程度上可以对抗sql注入。比如用户在输入邮箱时,必须严格按照邮箱的格式;输入时间、日期时,必须严格按照时间、日期的格式等等,都能避免用户数据造成破坏。但数据类型检查并非万能的,如果需求就是需要用户提交字符串,比如一段短文,则需要依赖其他的方法防范sql注入。

  • 首先,尽量避免使用常见的数据库名和数据库结构。SQL 注入并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成 功攻击的概率。

  • 其次,使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好 的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入的发生。

  • 另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操作。比如我们稍加修改,首先使用 execute()方法来保证每次执行仅能执行一条语句,然后将数据项以参数的方式与SQL执行语句分离开来,就可以完全避免SQL 注入的问题。或者进行数据转义也是可以避免SQL注入。

4、权限限制
严格限制 Web 应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限, 从而最大限度的减少注入攻击对数据库的危害。**请记住永远不要使用超级用户或所有者帐号去连接数据库!**当数据库被攻击时将损伤限制在当前表的范围是比较明智的选择。 通过权限限制可以防止攻击者获取数据库其它信息,甚至在获取getshell之后利用数据库执行Shell命令等 操作。

5、日志处理
当数据库操作失败的时候,尽量不要将原始错误日志返回,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。除此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显然,日志并不能防止任何攻击,但定期审计数据库执行日志可以跟踪是否存在应用程序正常逻辑之外的 SQL 语句执行。日志本身没用,要查阅其中包含的信息才行。毕竟,更多 的信息总比没有要好。

6、最后
当然,做好数据库的备份,同时对敏感内容(比如三四要素信息)进行加密是最重要的。安全性问题可能永远不会有完美的解决方案,但只要做好最基本的防护措施,才能在发生问题的时候亡羊补牢,保证最小程度的损失。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_42250835/article/details/111600840

对一次入门bluecms v1.6的渗透-爱代码爱编程

记一次对bluecms v1.6 sp1的渗透测试 文章目录 记一次对bluecms v1.6 sp1的渗透测试前言一、复现环境二、seay审计三、进行SQL注入四、后台getshell 前言 本次主要是对此CMS的渗透,没有对代码进行详细审计。运气很好,用seay审计时第一个ad_js.php有sql注入。然后进行验证,确实没有误报。后面

.NET程序的反编译-爱代码爱编程

.NET程序的反编译 一个简单的C# program: using System; namespace dotnetapp { class Program { static void Main(string[] args) { Console.WriteLine("What is your favourite Web Applicat

access注入详解-爱代码爱编程

目录 Access数据库手工注入判断注入点判断数据库类型判断可以进行什么类型的注入联合注入布尔盲注偏移注入注入原理偏移注入移位溢注简介溢注过程 Access数据库 是一种非常简单但是功能完整的数据库,很适合小型网站创建,可以很轻松管理表和列,有很多管理工具 手工注入 判断注入点 1.这里采用墨者学院提供的SQL手工注入漏洞测试环境 h

PowerShell常用命令及使用方法-爱代码爱编程

PowerShell 依托.NET Framework平台可以实现非常强大的功能,而且普适性强,Win7及以上系统自带,隐蔽性好,可以直接在内存中运行,能够绕过部分杀软,现将平日操作及内网渗透过程中常用命令及使用方法总结如下。 文章目录 一、常用命令(一) PowerShell.exe(二) cmdlet 命令二、脚本规则三、应用场景

PHP 基础-爱代码爱编程

简介 PHP (超文本预处理器)原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。自20世纪90年代国内互联网开始发展到现在,互联网信息几乎覆盖了我们日常活动所有知识范畴,并逐渐成为我们生活、学习、工作中必不可少的一部分。据统计,从2003 年开始,我国的网页规模基本保持了翻

【渗透测试】--- FCKeditor文本编辑器漏洞-爱代码爱编程

FCKeditor编辑器漏洞 FCKeditor编辑器是一款强大的所见即所得文本编辑器,现在已经更名为:CKEditor 一、fckeditor的常见敏感目录(FCK有时要小写) (1) 查看版本信息 1 ---- /FCKeditor/editor/dialog/fck_about.html2 ---- /FCKeditor/_whatsnew.

信息泄漏漏洞-爱代码爱编程

文章目录 那么到底什么是信息泄漏漏洞?信息公开的例子有哪些?信息泄露漏洞如何产生的?信息泄露漏洞的影响是什么?如何评估信息泄露漏洞的严重性如何防止信息泄露漏洞? 题外话:“信息泄漏”,“泄漏出来的信息”这玩意儿也算是个洞??? 要知道在渗透初期,渗透测试人员会针对目标进行信息收集这是必不可少的,甚至可以说信息收集贯穿了渗透测试的每一个每一个阶

公司敏感信息收集-Git信息泄漏漏洞与GitHack使用方法-爱代码爱编程

文章目录 “.git”泄漏漏洞与危害Git信息泄露原理GitHack的使用方法 Git是一个开源的分布式版本控制系统,能够有效的实现对软件版本的控制。版本控制是软件研发过程中项目的开发与管理的标准做法,能够追踪项目从开始到结束的整个过程,对企业的研发技术团队来说,是团队协作的桥梁,有助于团队多人协同。 Git传送门 然而在代码发布的时候,存在

子域名的信息收集-爱代码爱编程

文章目录 子域名枚举检测工具搜索引擎枚举第三方聚合服务枚举HTTP证书透明性公开日志查询爬虫提取子域名DNS域传送漏洞发现子域名 子域名,也就是二级域名(也存在三、四级子域名),是指顶级域名、父域名下的下一级域名。比如 news.baidu.com 和 tieba.baidu.com 这两个域名就是 baidu.com 下的子域名。 假设被渗透

SQLMAP工具介绍、基本命令及简单使用-爱代码爱编程

文章目录 工具介绍基本命令获取目标拓展语句 工具介绍 sqlmap是一款自动化的SQL注入工具,其主要功能就是自动化扫描,发现并利用给定的URL的SQL注入漏洞,内置了很多绕过的插件。 支持现在几乎所有的数据库MySQL、Oracle、Microsoft SQL Server、Microsoft Access、IBM DB2等。 支持代理,优

SQLMAP使用手册-爱代码爱编程

文章目录 SQLMAP入门及简单用法判断URL是否存在注入点针对不需要登陆的URL进行SQL注入探测对于需要登录的网站通过抓取 http 数据包进行探测查看数据库的所有用户查看数据库所有用户名的密码查看数据库当前用户判断当前用户是否有管理权限列出数据库管理员角色爆出所有的数据库爆出当前的数据库爆出指定数据库中的所有的表爆出指定数据库指定表中的所有的

文件上传漏洞及常见的利用方式-爱代码爱编程

文章目录 概述“文件上传”漏洞与“WebShell”文件上传漏洞的原理“文件上传漏洞”被利用植入“WebShell”后的常见安全问题:上传检测流程概述上传服务器文件命名规则常见的检测方式“文件上传漏洞”-本地验证检测绕过客户端本地JS绕过(Javascript检测)客户端白名单绕过“文件上传漏洞”-服务端检测绕过服务端检测绕过(MIME类型检测)服