注入攻击

1.注入攻击的本质,是把用户输入的数据当做代码执行。两个关键条件:

(1)用户能够控制输入

(2)原本程序要执行的代码,拼接了用户输入的数据。

2.SQL注入:错误回显能为攻击者提供极大的便利。

(1)盲注:服务器没有错误回显时完成注入攻击。

(2)Timing Attack:利用BENCHMARK()函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种边信道攻击。

3.数据库攻击技巧:

(1)union select

(2)Sqlmap

(3)读写文件的技巧:首先通过LOAD_FILE将系统文件读出,再通过INTO DUMPFILE将该文件写入系统中,然后通过LOAD DATA INFILE将文件导入创建的表中,最后就可以通过一般注入技巧直接操作表数据了。前提是当前数据库用户有创建表的权限。(除了可以使用INTO DUMPFILE外还可以使用INTO OUTFILE,区别:DUMPFILE适用于二进制文件,会将目标文件写入同一行内;而OUTFILE适用于文本文件)

导出webshell间接地执行命令

(4)命令执行:利用“用户自定义函数”的技巧,即UDF来执行命令

创建UDF:CREATE FUNCTION name RETURNS INTEGER SONAME shared_library

通过lib_mysqludf_sys提供的几个函数执行系统命令,最主要的函数是sys_eval()和sys_exec():将lib_mysqludf_sys.so上传到数据库能访问到的路径下。在创建UDF之后,就可以使用sys_eval()等函数执行系统命令了。

sys_eval:执行任意命令,并将输出返回。

sys_exec:执行任意命令,并将退出码返回。

sys_get:创建一个环境变量。

sys_set:创建或修改一个环境变量。

以上为MYSQL Server环境下,而在MSSQL中,则可以使用存储过程“xp_cmdshell”执行系统命令。

(5)攻击存储过程:与UDF很像,但存储过程必须使用CALL或者EXECUTE来执行。在MSSQL Server和Oracle数据库中有大量内置的存储过程。

xp_cmdshell在SQL Server2000中默认开启,但在2005及以后版本则默认禁止了。但是当前数据库用户拥有sysadmin权限的话,可以使用sp_configure(2005和2008)重新开启它。如果在2000中禁止了可以用sp_addextendedproc开启。

xp_regread、xp_regaddmultistring、xp_regdeletekey、xp_regdeletevalue、xp_regwrite等可以操作注册表

除了利用存储过程直接攻击外,存储过程本身也可能会存在注入漏洞。

(6)编码问题:进入数据库之前,在web语言中双字节符会被认为是两个字节。

PHP中的addslashes()函数(转义’ “ \ NUL),或者当magic_quotes_gpc开启时,会在特殊字符前增加一个转义字符\

要解决需要统一数据、操作系统、web应用所使用的字符集,以避免各层对字符的理解存在差异。或者根据系统使用的不同字符集来限制用户输入数据的字符允许范围,以实现安全过滤。

基于字符集的攻击并不局限于SQL注入,凡是会解析数据的地方可能存在这个问题。比如在XSS中,由于浏览器和服务器返回的字符编码不同,也可能会存在字符集攻击。解决办法就是在HTML页面的<meta>标签中指定当前页面的charset。

(7)SQL Column Truncation:当MySQL的sql_mode设置为default时即没有开启STRICT_ALL_TABLES选项时,MySQL对于用户插入的超长值只会提示warning,而不是error(如果是error则插入不成功),这可能会导致发生一些“截断”问题。

4.正确的防御SQL注入:

(1)总的来说就是:找到所有的SQL注入漏洞,修补这些漏洞。

(2)使用预编译语句:防御SQL注入的最佳方式,就是使用预编译语句,绑定变量。变量用?表示。

(3)使用存储过程:使用存储过程和使用预编译语句类似,其区别就是存储过程先将SQL语句定义在数据库中。但需要注意的是:存储过程中也可能会存在注入问题,因此应该尽量避免在存储过程内使用动态的SQL语句。如果无法避免,则应该使用严格的输入过滤或者是编码函数来处理用户的输入数据。

(4)检查数据类型

(5)使用安全函数:ESAPI.encoder().encodeForSQL( new OracleCodec(), queryparam );

数据库应使用最小权限原则,避免Web应用直接使用root、dbowner等高权限账户直接连接数据库。Web应用使用的数据库账户,不应该有创建自定义函数、操作本地文件的权限。

5.其他注入攻击:都违背了“数据域代码分离”原则

(1)XML注入:两大条件一样。

对用户输入数据中包含的“语言本身的保留字符”转义

(2)代码注入:代码注入与命令注入往往都是由一些不安全的函数或者方法引起的,其中的典型代表就是eval()

严格来说,PHP、JSP的动态include(文件包含漏洞)导致的代码执行,都可以算是一种代码注入。

禁用eval()、system()等可以执行命令的函数

(3)CRLF注入:CRLF实际上是两个字符。CR:\r 与LF:\n。\r\n这两个字符是用于表示换行的,其十六进制分别为0x0d、0x0a

在HTTP头中的CRLF注入,又称为“Http Response Splitting”

对抗CRLF只需要处理好\r\n这两个保留字符即可,尤其是使用“换行符”作为分隔符的应用。

时间: 2024-11-06 03:34:46

注入攻击的相关文章

Web脚本攻击之注入攻击

注入攻击的概念和原理 注入漏洞是Web服务器中广泛存在的漏洞类型,其基本原理是Web程序对用户输入请求中包含的非法数据检查过滤不严,使Web程序将用户的异常输入字符当做正常代码执行,从而使用户在未授权的情况下非法获取Web服务器的信息. 利用注入漏洞发起的攻击称为注入攻击,它是Web安全领域最为常见威胁也是最大的攻击,注入攻击包括SQL注入.代码注入.命令注入.LDAP注入.XPath注入等.实现注入攻击要具备两个关键条件,第一是用户能够自主编写输入的数据,第二是Web程序的执行代码被拼接了用户

web前端安全之SQL注入攻击

一.SQL注入攻击的原理攻击者在HTTP请求中注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 select * from user where name = 'camille' and password = '' or '1'='1' 不管用户名和密码是什么,查询出来的用户列表都不为空,这样可以随意看其他用户的信息. 二.SQL注入攻击的防御1.客户端 限制字符串输入的长度: 有效性检验. //过

clrf注入攻击

1.clrf 注入攻击. 原理:http数据包通过\r\n\r\n来分开http header何http body 实现:首先这种攻击发生在应用层,且发生在服务器返回给我们的http reponse没有经过敏感字符的过滤,我们能够构造攻击语句来控制服务器的http响应.以下为例子: 1.Twitter的HTTP响应拆分 难度:高 厂商:https://twitter.com/ 报告地址:https://hackerone.com/reports/52042 报告日期:2015年4月21日 奖金:

白帽子讲WEB安全 第七章 注入攻击

一.SQL注入: 1.注入攻击的本质:把用户输入的数据当代码执行. 攻击的关键点:1.用户能够控制输入: 2.原本程序要执行的代码, 2.盲注(Blind Injection):在服务器没有错误回显时完成的注入攻击. 3.时序攻击(Timing Attack):利用BENCHMARK()函数(mysql中用于测试函数性能的函数),可以让同一个函数执行若干次,使得结果返回的时间比平时要长:通过时间长短的变化,可以判断出注入语句是否执行成功.这是一种边信道攻击. 边信道攻击(side channel

【渗透攻防Web篇】SQL注入攻击高级

前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 5.1.大小写变种 5.2.URL编码 5.3.SQL注释 5.4.空字节 5.5.二阶SQL注入 第六节 探讨SQL注入防御技巧 6.1.输入验证 6.2.编码输出 正文 第五节 避开过滤方法总结 Web应用为了防御包括SQL注入在内的攻击,常常使用输入过滤器,这些过滤器可以在应用的代码中,也可以

使用SQLMAP对网站和数据库进行SQL注入攻击

from:http://www.blackmoreops.com/2014/05/07/use-sqlmap-sql-injection-hack-website-database/ 0x00 背景介绍 1. 什么是SQL注入? SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,比如将恶意的SQL代码注入到特定字段用于实施拖库攻击等.SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL

网络攻防之SQL注入攻击

SQL注入攻击的根源是因为SQL规范的漏洞,但是,因为规范的长期存在以及使用,几乎已经不太可能去修改规范了,只能够从开发者本身去避免攻击,虽然SQL注入之前很严重,但现在相对控制的很好,这里仅仅作为一种学习的内容. 测试过程如下: 1:搭建PHP,mysql开发环境,可以详见我的另一篇博客自定义开发PHP环境 2:添加数据库,表,以及表内容. 3:分别测试 万能密码,万能用户名 数字注入 测试如下: 万能密码:password ' or 1='1 (password可以任意的填写,注:这里如果粘

Web安全篇之SQL注入攻击

在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问题~ 大家早上好!今天由我给大家带来<web安全之SQL注入篇>系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:       第一讲:"纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理.":       第二讲:"实战演练:我们要在互联网上

参数化登陆防止SQL注入攻击

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace _01参数化登陆防止SQL注入攻击 { public

JDBC-sql注入攻击

10 SQL注入攻击 -- 早年登录逻辑,就是把用户在表单中输入的用户名和密码 带入如下sql语句. 如果查询出结果,那么 认为登录成功. SELECT * FROM USER WHERE NAME='' AND PASSWORD='xxx'; -- sql注入: 请尝试以下 用户名和密码. /* 用户名: 密码: xxx*/-- 将用户名和密码带入sql语句, 如下: SELECT * FROM USER WHERE NAME='xxx' OR 1=1 -- ' and password='x