首页 存档 技术 查看内容

渗透攻防Web篇-SQL注入攻击中级

2018-3-30 13:00 |来自: 互联网 285 0

摘要: 前言找到SQL注入漏洞后,我们可以用它来干什么呢?那么本篇文章给大家带来的就是SQL注入漏洞利用技术,现在是时候让我们去体验一下漏洞利用的乐趣了。 目录第三节 利用SQL注入 3.1、识别数据库 3.2、UINON语句提取 ...

前言
找到SQL注入漏洞后,我们可以用它来干什么呢?那么本篇文章给大家带来的就是SQL注入漏洞利用技术,现在是时候让我们去体验一下漏洞利用的乐趣了。


目录


第三节 利用SQL注入


  • 3.1、识别数据库

  • 3.2、UINON语句提取数据

  • 3.3、枚举数据库

  • 3.4、窃取哈希可令

  • 3.5、获取WebShell


第四节 SQL盲注利用



  • 4.1、初识SQL盲注

  • 4.2、SQL盲注入技术-基于布尔

  • 4.3、SQL盲注入技术-基于时间

  • 4.4、我们的好朋友-Python



正文




  • 第三节 利用SQL注入


3.1、识别数据库

要想发动sql注入攻击,就要知道正在使用的系统数据库,不然就没法提取重要的数据。

首先从Web应用技术上就给我们提供了判断的线索:

  • ASP和.NET:Microsoft SQL Server

  • PHP:MySQL、PostgreSQL

  • Java:Oracle、MySQL


Web容器也给我们提供了线索,比如安装IIS作为服务器平台,后台数据及很有可能是Microsoft SQL Server,而允许Apache和PHP的Linux服务器就很有可能使用开源的数据库,比如MySQL和PostgreSQL。

基于错误识别数据库

大多数情况下,要了解后台是什么数据库,只需要看一条详细的错误信息即可。比如判断我们事例中使用的数据库,我们加个单引号。


1
error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1


从错误信息中,我们就可以发现是MySQL。


1
2
3
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1:


上面错误信息可以发现是Microsoft SQL Server,如果错误信息开头是ORA,就可以判断数据库是Oracle,很简单,道理都是一样的,就不一一列举了。


基于数字函数推断



数据库服务器 函数
Microsoft SQL Server @@pack_received、@@rowcount
MySQL connection_id()、last_insert_id()、row_count()
Oracle BITAND(1,1)
PostgreSQL select EXTRACT(DOW FROM NOW()


3.2、UINON语句提取数据

UNION操作符可以合并两条或多条SELECT语句的查询结果,基本语法如下:


1
2
3
select column-1 column-2 from table-1
UNION
select column-1 column-2 from table-2


如果应用程序返回了第一条查询得到的数据,我们就可以在第一条查询后面注入一个UNION运算符来添加一个任意查询,来提取数据,是不是很容易啊,当然在使用UNION之前我们必须要满足两个条件:

  • 两个查询返回的列数必须相同

  • 两个查询语句对于列返回的数据类型必须相同


首先我来看第一个条件,如何知道第一条查询的列数呢?我们可以使用NULL来尝试,由于NULL值会被转换成任何数据类型,所以我们不用管第二个条件。


就是这样的一个个加上去进行尝试,直到不返回错误。


神奇的ORDER BY子句



我们先尝试了12,返回错误,说明列数是小于12的,我们继续尝试了6,返回错误,同理,列数小于6的,我们尝试3,返回正常,说明列数是大于等于3的,继续尝试4,返回错误。说明列数是小于4,列数大于等于3,小于4,可以得到列数是3。使用order by子句可以帮助我们快速得到列数。



得到列数后我们还需要满足第二个条件



很简单,只要一次一列使用我们的测试字符串替换NULL即可,可以发现第一列和第二列都可以存放字符串,第三列数据没有输出。

接下来就让我们提取数据库用户名和版本号:



3.3、枚举数据库

这里由于篇幅问题,我们只以MySQL数据库为例了,枚举数据库并提取数据遵循一种层次化的方法,首先我们提取数据库名称,然后提取表,再到列,最后才是数据本身。要想获取远程数据库的表、列,就要访问专门保存描述各种数据库结构的表。通常将这些结构描述信息成为元数据。在MySQL中,这些表都保存在information_schema数据库中

第一步:提取数据库
在MySQL中,数据库名存放在information_schema数据库下schemata表schema_name字段中


1
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类