反哺母校第一弹(本科生学院蛋疼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被过滤的时候,可以考虑用它来绕过
一番查找之后找到了那么几个可疑表有了表名和字段名,得到数据就不是问题了,在这几个表里面找了一下,终于找到了管理员密码
后台看了一下,存在一个没有过滤任何后缀的上传页面
在WEB-INF目录下下载了struts-config.xml,看来是一个struts架构的网站。
找到了manager.do?viewType=newsdetail的转跳页面
<forward name="newsdetail" path="/content/newsdetail.jsp" />找到了这个目录发现,这个网站是由 伊春市体育信息网 这个模板修改而来,但是因为,对于structs的架构不算特别了解,没有找到具体出现漏洞的语句,这里先留个坑。