注入攻击(SQL注入)
注入攻击是web安全领域中一种最为常见的攻击方式。注入攻击的本质,就是把用户输入的数据当做代码执行。这里有两个关键条件,第一是用户能够控制输入,第二个就是原本程序要执行的代码,将用户输入的数据进行了拼接,所以防御的思想就是基于上述两个条件。
SQL注入第一次为公众所知,是在1998年的著名黑客杂志<<Phrack>>上,一位名叫rfp的黑客发表了一片题为“NT Web Technolog Vulnerabities”的文章。
一个简单的SQL注入的典型例子:
变量username为用户所提交,正常情况下,假如用户输入“XiaoMing”,那么SQL语句会执行:
select * from UserTable where username='XiaoMing';
若用户输入一段有特别含义的SQL语句,比如:
XiaoMing' ;drop table UserTable--
那么SQL语句在实际执行时就会如下:
select * from UserTable where username='XiaoMing';drop table UserTable--'
现在变成了查询后,再执行一个drop表的操作,而这个操作,使用户构造了恶意数据的结果。
在SQL注入的过程中,如果网站的Web服务器开启了消息回显,则可以根据回显的错误消息,探测网站用的是什么数据库,例如:错误提示Microsoft.JET Database Engine错误,则说明是通过JET引擎连接数据库,表明数据库为ACESS数据库,如果是ODBC的话,则说明是MSSQL数据库。
数据库的判断方法有很多,这里大致说下我了解到的几种方法思路,不详细展开。
第一种基于特定函数:不同的数据库对应着的函数名称不一样,如len()和length(),@@version()和version()在MSSQL,Mysql数据库中不一样,substring()和substr()在oracle和Mysql中不一样
第二种基于辅助符号的判断: “ / * ”是Mysql中的注释符。 “ --”是Oracle和MSSQL支持的注释符,";"子查询标识符,Oracle不支持多行查询。结合以上符合多种作何判断。
第三种基于错误回显信息判断:针对数据库引擎的判断。
盲注(Blind Injection)
在没有回显消息的时候,可以进行SQL盲注,最常见的盲注验证方法就是构造简单的条件语句,根据返回页面是否发生改变,来判断SQL语句是否得到了执行。
1.简单的 and 1=1 和 and 1=2
例如攻击者构造如下条件的语句:
http://newspaper.com/items.php?id=2 and 1=2
SQL语句由于“1=2”是个假命题,所以攻击者看到页面将为空或者是一个出错的页面。
为了进一步确定注入是否存在,攻击者必须再次验证这个过程:
http://newspaper.com/items.php?id=2 and 1=1
如果这个请求页面正常返回了,则说明SQL语句的"and"成功执行,那么就可以判断“id”参数存在SQL注入漏洞了。
在这个攻击过程中,服务器虽然关闭了错误回显,但是通过攻击者简单的条件构造,再对比返回结果的差异,就可以判断出SQL注入漏洞是否存在,这就是盲注的工作原理。
Timing Attack(边信道攻击)
在Mysql中,有一个benchmark()函数,用来测试函数性能的,benchmark(count,expr)函数的执行结果就是将expr表达式执行count次数。因此,利用这个函数,可以让同一个函数执行若干次,使得结果返回时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种边信道攻击,这个技巧在盲注中称为Timing Attack。
接下来我们使用这种技巧完成攻击,先构造攻击参数id值为:
这段Payload判断数据库名的第一个字母是否为小写的w。如果判断为真,则会通过BENCHMARK()函数造成较长的时延;如果不为真,则该语句将很快执行完。攻击者遍历所有字母,直到将整个数据库名称全部验证完成为止。与此相似的还可以通过以下函数获得一些额外信息:
database():当前连接的数据库名称
system_user():数据库的系统用户
current_user():登录到数据库的当前用户
last_insert_id():最后一次进行插入操作数据库的事务id
若当前数据库用户(current_user)有写权限。可以将信息写入本地磁盘中。比如写入web目录中,攻击者就可以下载这些文件:
2 Union All SELECT * FROM information_schema.tables where table_schema='mysql' ORDER BY table_name DESC INTO OUTFILE
'/path/location/on/server/www/schema.txt '
或者是写入一个webshell:
2 Union All SELECT "<? system($_REQUEST['cmd']); ?>" ,2,3,4 INTO OUTFILE
"var/www/html/temp/c.php" --
在不同数据库中,有着类似benchmark()函数,可以被Timing Attack利用。例如:
MySql数据库中的 benchmark(1000000,expr)和sleep(5)
PostgreSQL数据库中的PG_SLEEP(5)和GENERATE_SERIES(1,1000000)
MSSQL Server中的 WAITFOR DELAY '0:0:5'
注入攻击(SQL注入)的更多相关文章
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...
- 注入攻击(SQL注入防御)
正确的防御SQL注入 sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全. 例如 mysql_real_escape_string()函 ...
- XSS攻击&SQL注入攻击&CSRF攻击?
- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...
- XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式
SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...
- False注入,以及SQL注入技巧总结
title: False注入,以及SQL注入技巧总结 date: 2017-04-25 00:23:31 tags: ['SQL注入'] --- 利用False我们可以绕过一些特定的WAF以及一些未来 ...
- 防止sql注入式攻击 SQL注入学习——三层架构
解决方案是:1.首先在UI录入时,要控制数据的类型和长度.防止SQL注入式攻击,系统提供检测注入式攻击的函数,一旦检测出注入式攻击,该数据即不能提交:2.业务逻辑层控制,通过在方法内部将SQL关键字用 ...
- xss 攻击 sql 注入
XSS测试 "/><script>alert(document.cookie)</script><!-- <script>alert(docu ...
- 最新SQL手工注入语句&SQL注入大全
看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) from syso ...
- SQL注入 (1) SQL注入类型介绍
SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...
随机推荐
- Perl面向对象(1):从代码复用开始
官方手册:http://perldoc.perl.org/perlobj.html 本系列: Perl面向对象(1):从代码复用开始 Perl面向对象(2):对象 Perl面向对象(3):解构--对象 ...
- AngularJS_自定义控件_笔记1
简介: 本篇博客是在学习AngularJS自定义控件的学习记录,作为一个学习示例... A-基本架构介绍 新建一个AngularJs的项目,大概项目结构如下: 项目结构: 大概是由:app.js,bo ...
- C#实现多态之接口。
一.什么是接口? 接口就是一种规范协议,约定好遵守某种规范就可以写通用的代码. 定义了一组具有各种功能的方法(只是一种能力,没有具体实现,就像抽象方法一样,“光说不做”). 理解:内存该做成什么样的: ...
- 【转载】网站遭遇DDoS攻击怎么办
在网站运维过程中,有些人的网站遭遇过DDoS攻击,DDos攻击又叫做分布式拒绝服务攻击.DDos攻击将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力 ...
- C# ThreadPool类(线程池)
CLR线程池并不会在CLR初始化时立即建立线程,而是在应用程序要创建线程来运行任务时,线程池才初始化一个线程.线程池初始化时是没有线程的,线程池里的线程的初始化与其他线程一样,但是在完成任务以后,该线 ...
- 动态编程(Dynamic Programming)
本文素材来自视频,请自备梯子观看:What Is Dynamic Programming and How To Use It Dynamic Programming:动态编程分为如下几步: 将复杂问题 ...
- No application encryption key has been specified.
环境:php7.1.10laravel5.5出现: 解决:在根目录下执行: php artisan key:generate OK问题解决
- Java学习笔记之——static关键字
static属于类的,不属于任何一个对象的 static关键字的应用场景: 1.静态代码块:在类下用static修饰的代码块 static{ 代码: } 只能执行一次,是在第一次使用类之前执行 类加载 ...
- Maven(六)Eclipse使用Maven插件创建项目
1. 创建Maven版Java工程 1.1 具体步骤 1.2 更改默认JDK版本 默认JDK版本过低 可以通过配置setting.xml来更改JDK版本 加入如下代码 <profile> ...
- JS隐藏号码中间4位
function resetPhone(phone) { var str = String(phone) var len = str.length; var prev,next; if (len &g ...