这里写目录标题
- 引言
- 补充上篇文章Json注入案例分析
- 简要学习各种数据库的注入特点
- Access数据库
- Mssql数据库
- PostgreSQL数据库
- Oracle数据库
- MongoDB数据库
- 简要学习各种注入工具的使用指南
引言
mysql的注入方法跟其它的数据库注入方法是差不多的,是可以举一反三的,基本上就是注入语句、特点不一样,其它的基本上就是一样的。除了access外
除了mysql之外,其它数据库都自带信息系统表,这个表里面自带数据库的表名、列名信息,我们可以通过查看它获取当前的表名、列名信息。
我们可以查找到数据库里面存储的账号信息,获取后台地址登录,在后台里面再去获取shell(可能会失败)。
如果是高权限的话,直接进入,去进行相应的操作就可以了。除了access之外都是这个思路。
下面这些是在市面上比较默认的常见数据库类型:
Access、mysql、mssql、mongoDB、postgresgl、sqlite、oracle、sybase等
补充上篇文章Json注入案例分析
我们需要测试注入的话,直接修改键值,在双引号里面去进行测试
a=1&b=2&c=3
{
“a”:“1”
“b”:“2”
“c”:"3
}
a=1 and 1=1&b=2&c=3
{
“a”:“1 and 1=1”
“b”:“2”
“c”:"3
}
json就是跟我们平时的数值表达形式不一样而已,该怎么测还是怎么测。
json要不要闭合,是要看后台SQL语句的写法,跟键值的双引号没有什么关系
简要学习各种数据库的注入特点
数据库架构组成,数据库高权限操作
Access数据库
除了access外,其它的数据库组成架构大部分是大同小异的,access在市面上已经很少了,大部分都是后面的那些数据库类型。
access一般跟asp脚本搭建组合在一起,是一种常见数据库,现在asp的网站已经很少了。
access
表名
列名
数据
mysql mssql等
数据库名
表名
列名
数据
access比其它数据库是要低一个等级的,access搭建的网站,它的数据库是保存在网站源码下面,一个mdb结尾的数据库。
如果换一个网站的话,两个数据库是互不相干的,没有任何的一个关系。
因为他们两个数据库是独立存在的,不和其它网站相关,没有关联性,它们不在一起,自己的网站自己管。这就造成了在注入方面的不同,我们在注入的时候,不需要获取数据库名称,access没有文件读写功能,它的数据库本身就没有借助能够进行读写的操作,我们在注入的时候,就不要考虑进行文件读写的操作。
查看其它类型的数据库有没有相应的功能,可以通过搜索引擎搜索关于数据库的相关资料,看看有没有类似功能。
不同的数据库,它的注入语句、功能上会有点小区别。因为每个数据库它的内置功能会有点不一样。
搭建靶场环境是很麻烦的,搞个mysql就足够了;access不用搭建,自己在网上找个asp的网站都可以测试,
靶场全通关之后,在实战当中需要其它知识点来辅合的话,会更好一点。
工具都会有一些优缺点的,工作的时候,发现工具会有误报,这都很正常
先判断字段点
1 order by 1,2,3,4
1 order by 1,2,3,4,5
页面出现不正常,说明是4。
access就是一个单纯的数据库,它只有数据,它没有数据库名、数据库版本号、information表、操作系统查询的地方,因为它没有这些功能,所以它很简单,直接查询数据就完事了。
其实我们对access注入的时候,属于暴力猜解,靠字典跑;
如果它有就直接返回正确的页面,如果它没有就会返回不同的页面。
所以我们在注入获取数据的时候,直接靠猜就可以了,猜测有表名
1 union select 1,2,3,4 from admin
如果有这个表,就会返回正常的页面,如果没有就会返回不同的页面。
如果猜测不出来,那只能够用工具和脚本去跑这个数据
access的攻击方式只有猜数据,如果猜不到就GG,不用去想文件读写,它没有这个功能
除了access外,其它的数据库都可以想文件操作这个功能,看条件是不是高权限。
Mssql数据库
其实注入工具是我们渗透测试思路的体现
Pangolin是一个老工具,它的功能很多都已经过时了,现在已经很少有人使用这个工具了
每个数据库在注入的时候,它的方式是不一样的,但是大体上有些是一样的
每个数据库它支持的功能有些是不一样的,所以我们单独学习每个数据库,这是很耗时间的,因为它很多地方一样,就是有部分不一样,你只要记住这个情况就可以了,你不要搞的很明白,到时候你不会在查下资料就完事了,不要去精益求精,没有必要这样去了解。
mssql最高权限是sysadmin,简称sys。Drivers可以获取电脑下面有那些盘符。
一句话木马写入失败的原因:
1、有防护软件;
2、权限问题,设置了目录的可读写,这个目录只允许旧的文件进来,不允许新的文件进来;
3、内置功能有问题,把功能给禁用掉,就会造成功能在写入的时候失败,这个原因是最多的。
执行服务器命令失败,可以切换不同的组件,挨个去尝试。只要能够执行服务器的命令,我们就可以写入一句话木马
echo ‘x’ >c:\1.txt
只要写入一句话木马,我们就可以连接到网站,把网站的文件和数据copy下来
读写命令,type c:\Inetpub\key.txt
各个数据库之间的注入语句,大体上是差不多的
其实mssql和mysql注入大部分是一样的,首先判断是什么数据库,完了之后获取一些信息,像数据库名、数据库版本这些。接下来就是手工语句了,这些手工语句比较复杂,我们也没有必要就是去学习和了解
我们在碰上注入点了,要么是用工具,要么是把手工语句给粘上去就完事了,没什么问题的
手工语句比较复杂,也没有必要去了解的那么深入,我们毕竟不是搞数据库的技术人员,只要得到想要的东西就完事了
mysql很好理解,通过它的学习可以推断出其它数据库的注入,手工注入理解之后,方便后期根据网站情况,在工具注入不清楚的情况下,配合手工
数据库的权限将决定我们下面的功能是否能够执行,权限高一般是都能够执行的,不能执行就是有些东西删除了或者是有防护软件
数据库的权限将决定我们后面渗透的思路,高权限就可以执行更多的功能,低权限只能老老实实获取权限一步一步的来
PostgreSQL数据库
高权限执行的能力:读取文件、执行命令、写入文件
mysql其实也有执行命令,只是在注入里面无法调用,基本上高权限能做的事情,大部分是差不多的,都能够拿到webshell。
直接写入文件,获取webshell,高权限的功能对我们都是有帮助的
不需要特意去学习语句是怎么写的,你学了mysql很多东西都很好理解
不同的数据库,它获取信息的注入语句是有点不一样的,如果你不知道这个网站使用的是什么类型的数据库,就一个劲的用mysql的注入语句去获取信息,那是无法获取到的,所以我们在判断出注入点的时候,你也得知道这个网站它使用的数据库是什么类型的,这样你才能够根据相关数据库的注入语句去获取信息。
注入工具一旦误报的话,那么接下来的操作基本上就会失败,因为它数据库判断错误的话,后面那些功能都会失败
我们在使用sqlmap去测试注入点的时候,如果我们不能够百分百确定数据库的类型,就不要去指定它,因为不同的数据库,它判断数据库存不存在注入点的语句是不一样的,指定了错误的数据库类型,会导致map误报,从而影响我们后续数据的获取。map判断注入点是什么类型的数据库的语句是非常简洁的,如果它一开始就没有告诉你是什么类型的数据库,那么这个地方可能不存在注入点,没有必要为节省map发出的数据包,而去一开始指定数据库的类型。就算有waf拦截,如果你绕不过去,有注入点你也利用不了,如果绕的过去,不差map去判断是什么类型的数据库
map报这个地方没有注入点,你后面其实就没有必要再去看了,因为肯定没有,它有注入点一开始就会告诉你。
map的输入语句比我们常用的注入语句会有复杂写法,是个兼容性写法,这样的写法很多东西都能够兼容
基本操作语句:
-u #注入点
-f #指纹判断数据库类型
-b #获取数据库版本信息
-p #指定可测试的参数(?page=1&id=2 -p "page,id”)
-D "" #指定数据库名
-T "" #指定表名
-C "" #指定字段
-s "" #保存注入过程到一个文件,还可中断,下次恢复在注入(保存: -s "xx.log" 恢复:-s "xx.log" --resume)
--leve1=(1-5) #要执行的测试水平等级,默认为1
--risk=(0-3) #测试执行的风险等级,默认为1
--time-sec=(2,5) #延迟响应,默认为5
--data #通过POST发送数据
--columns #列出字段
--current-user #获取当前用户名称
--current-db #获取当前数据库名称
--users #列数据库所有用户
--passwords #数据库用户所有密码
--privileges #查看用户权限(--privileges -U root)
-U #指定数据库用户
--dbs #列出所有数据库
--tables -D "" #列出指定数据库中的表
--columns -T "user" -D "mysql" #列出mysql数据库中的user表的所有字段
-dump-a11 #列出所有数据库所有表
--exclude-sysdbs #只列出用户自己新建的数据库和表
--dump -T ""-D "" -C "" #列出指定数据库的表的字段的数据(--dump -T users -D master -C surname)
--dump -T ""-D "" --start 2 --top 4 #列出指定数据库的表的2-4字段的数据
--dbms #指定数据库(MysQL、Oracle、PostgresqL、Microsoft SQLServer、Microsoft Access、sQlite、Firebird、Sybase、SAP MaxDB)
--os #指定系统(Linux,windows)
-v #详细的等级(0-6)
0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容。
--privileges #查看权限
-is-dba #是否是数据库管理员
--roles #枚举数据库用户角色
--udf-inject #导入用户自定义函数(获取系统权限)
--union-check #是否支持union 注入
--union-cols #union 查询表记录
--union-test #union 语句测试
--union-use #采用union 注入
--union-tech orderby #union配合order by
--data "" #POST方式提交数据(--data "page=1&id=2")
--cookie "用;号分开" #cookie注入(--cookies="PHPSESSID-mvijocbglg6pi463rlgk1e4v52; security=low")
--referer "" #使用referer欺骗(--referer “http://")
--user-agent "" #自定义user-agent
--proxy "http://127.0.0.1:8118” #代理注入
--string="" #指定关键词,字符串匹配
--threads #采用多线程(--threads 3)
--sql-she11 #执行指定sql命令
--sql-query #执行指定的sgl语句(--sql-query "SELECT password FROM mysql.user WHERE user = 'root' LIMIT O,1" )
--file-read #读取指定文件
--file-write #写入本地文件(--file-write /test/test.txt file-dest /var/www/htm1/1txt;将本地的test.txt文件写入到目标的1.txt)
--file-dest #要写入的文件绝对路径
--os-cmd=id #执行系统命令
--os-she11 #系统交互she11
--os-pwn #反单shell(--os-pwn --msf-path=/opt/framework/msf3/)
--msf-path= #matesploit绝对路径(--msf-
path=/opt/framework/msf3/)
--os-smbrelay #
--os-bof #
--reg-read #卖取win系统注册表
-priv-esc #
--time-sec= #延迟设置 默认--time-sec=5 为5秒 -p "user-agent"
--user-agent "sqlmap/0.7rc1 (http;//sqlmap.sourceforge.net)" #指定user-aqent注入
-eta #盲注 /pentest/database/sqlmap/txt/common-columns.txt 字段字典
common-outputs.txt
common-tables.txt 表字典
keywords.txt
oracle-default-passwords.txt
user-agents.txt
wordlist.txt
常用语句:
1./sqlmappy-u http://www.xxxxx.com/testphp?p=2 -f -b --current-user --current-db --users --passwords --dbs -v 0
map这些语法不需要我们去记住,你用的多,用的几次,你就记住了,不需要背
常碰到注入点,多用几次,后面基本上就差不多了
是高权限的话,就可以用map的shell交互的命令,如果不是,想都不要想
Oracle数据库
oracle在高权限注入的情况下,没有文件写入,这是数据库决定的,因为oracle数据库没有文件写入的功能
大体上来说,每个数据库在注入的方向来说,是一样的,只是有少许的区别,但是这个区别不会影响到我们对网站数据的读取
MongoDB数据库
mongodb通常是和python搭建web的应用型数据库
其实用工具和手工是差不多的,完全可以把工具抓不到的,然后用手工传上去
mongodb是以键值对形式进行查询的,类似于我们的json
select * from news ({‘id’:‘1’})
数据提交方式也不一样
NoSQLAttack工具下载地址:https://github.com/youngyangyang04/NoSQLAttack
需要过滤’})
构造简单的链接测试回显:/new_list.php?id=1’});return ({title:1,content:‘2
爆库:/new_list.php?id=1’});return (title:tojson(db.getCollectionNames()),content:‘1
db.getCollectionNames()返回的是数组,需要用tojson转换为字符串。并且mongodb函数区分大小写
爆表:/new_list.php?id=1’});return (title:tojson(db.getCollectionNames()),content:‘1 查询有的集合 (集合相当于mysql的表)
注入语句写法不一样,会有’});语句干扰
注入得出的结果也会以列表的形式进行表达,因为我们无法改变代码的输出格式,我们只能改变自己的一个输出格式的问题,而输出的格式正好可以用语法去修改
mongodb其实是数据库语句的组合上面会有问题,还有输入上面会有问题,输入格式上面不是我们重要讲的
mongodb它的条件,它的值,在提交数据库注入查询的时候,它是列表形式查询的,键值键名提交进去的,所以我们在注入的时候要考虑到我们的语句是要写到列表里面去,要注入的话,要闭合前面后面的列表,其实就是有符号干扰我们
目前市面上的工具,很少有工具能支持mongodb
sqlmap不仅支持面广,而且它上面有很多自定义的功能,所以这个工具的功能是更加强大的
简要学习各种注入工具的使用指南
熟悉工具的支持库(支持的数据库类型),注入模式(参数类型和提交方式),优缺点等
Sqlmap,NoSQLAttack,Pangolin等