从1开始的Java代码审计·第一弹·基础篇(上)

基本环境

JDK

目前,JDK已经出到11了,JDK每个版本都会有些新特性出来。很多情况下JDK并不向下兼容,导致一些软件在较新的JDK中无法正常运行,所以推荐用现在比较主流的JDK8。而且有些漏洞需要在低版本的JDK上才能复现出来,比如反序列化用到的JNDI Bean Property类型的Gadget,需要在小于JDK8_113的版本下才可以利用,所以在安装的时候建议再安装一个低版本的JDK。JDK安装时自带的控制面板程序,可以帮助我们很方便的切换版本。

从1开始的Java代码审计·序

小组经常有小伙伴问我Java该怎么审计,其实我也挺头大的。因为我觉得审Java的代码和审PHP的代码,相差不大。WEB 漏洞就那些,只是换了门语言实现而已,只要漏洞原理知道了,审起来是很容易的。

很多学安全的同学,应该是从PHP入门的。PHP作为一门脚本语言,跨平台、语法简单、易上手、开源框架多、用户量大。但是,PHP语言本身的特性,它在后期的拓展和维护困难,而且支持所有漏洞(抖个机灵)。很多对系统稳定性、安全性要求较高的厂商不太会去选择PHP,而是Java或者别的语言。

Java是纯正的面向对象的语言,适合团队协作开发,重构、维护相对轻松,语言生态好,且在高性能、高并发、分布式的场景吊打某语言。(虽然PHP也是支持面向对象的写法,不过身边真的在用面向对象的方法写PHP的同学真的很少,可能是不太理解面向对象的概念,也可能是因为写起来代码太长了?)

目前,网上关于 WEB 代码审计的文章很多都是PHP的,和Java相关的很少,而且质量一般。所以我打算做一个Java代码审计的系列,分享Java代码审计相关的小姿势。

在这个系列里,我假设每个读者都对 Java 和 WEB 安全方面的知识都有一定的了解,所以可能不会对漏洞的原理做很深的分析。

如果你觉得看起来有些累,或者对某个漏洞不理解,建议先去找些相关资料学习下。

渗透日记-20181005

在 shodan 上搜到一个有趣的站,名字就叫 webshell。

1

根据提示

Nothing specify params. Try to use “?file=” or “?id=time” to read a stream.

可以通过 file 参数读取文件内容。

尝试读取 /etc/passwd 成功。

PHP中的命令执行

前言

在 PHP 中, exec()system()popen()passthru()proc_open()pcntl_exec()shell_exec(),还有反引号 ``包裹的内容,都可以用来执行系统命令。

如果执行的命令参数是用户可控的,那么就会造成命令执行漏洞。

下面是常见的函数描述:

  • system()

    输出并返回最后一行shell结果。

  • exec()

    不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。

  • passthru()

    只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。

  • popen()、proc_open()

    不会直接返回执行结果,而是返回一个文件指针。

  • 反引号

    调用 shell_exec() 函数

|