A_74_JavaWeb应用安全
2021-04-15 22:52:36 0 举报
AI智能生成
全面、高效的知识图谱:A_74_JavaWeb应用安全!! 全面又深度的提升认知,达到实际应用的目的! 建议先纵观全局,掌握好大方向。 再根据自己的需要,针对性的学习某一个点,最后做到逐步由点及面。
作者其他创作
大纲/内容
程序架构与代码审计
漏洞发掘基础
公认的命名方式是com/org.公司名.项目名.业务名全小写。
如:org.javaweb.ylog.dao部署到服务器上对应的文件夹应当是/WEB-INF/classes/org/javaweb/ylog/dao/其中的.意味着一级目录。
一般来说找到Controller或者Action所在的包的路径就行了
1、按业务类型有序测试
2、按程序实现逆向测试,如SQL注入
SQL注入理论上是最容易找的,因为SQL语句的特殊性只要Ctrl+H搜索 select、from等关键字就能够快速找到项目下所有的SQL语句, 然后根据搜索结果基本上都能够确定是否存在SQL注入。 凡是SQL语句中出现了拼SQL(如select * from admin where id=’”+id+”’)那么基本上80%可以确定是SQL注入。 但也有特例,比如拼凑的SQL参数并不受我们控制, 无法在前台通过提交SQL注入语句的方式去控制最终的查询SQL。 而采用预编译?占位方式的一般不存在注入。
3、文件上传、下载、编辑漏洞
文件上传漏洞即没有对上传的文件的后缀进行过滤,导致任意文件上传。 有的时候就算有后缀判断,但是由于解析漏洞造成GETSHELL这是比较难避免的。
1、没有做任何限制的上传漏洞:
2、Bypass白名单和黑名单限制
3、文件下载漏洞
其他
通过查看Jar包快速定位Struts2漏洞
报错信息快速确认Server框架
二次校验逻辑漏洞
隐藏在Select框下的邪恶
子主题
服务器安全
构建WebShell war文件
1、打开Myeclipse新建Web项目2、把jsp放到WebRoot目录下3、导出项目为war文件
Tomcat中间件
关注conf和webapps目录即可。conf目录与非常重要的tomcat配置文件,比如登录帐号所在的tomcat-users.xml;域名绑定目录、端口、数据源(部分情况)、SSL所在的server.xml;数据源配置所在的context.xml文件,以及容器初始化调用的web.xml。
1、Tomcat后台部署war获取WebShell登录tomcat后台:http://xxx.com/manager/html,一般用WAR file to deploy就行了,Deploy directory or WAR file located on server这种很少用。2、Tomcat口令爆破
Resin中间件
Resin主流的版本是Resin3和Resin4,在文件结构上并没有多大的变化。resin.conf和resin.xml:Tomcat和Rsin的核心配置文件都在conf目录下,Resin3.1.x默认是resin.conf而4.0.x默认是resin.xml。resin.conf/resin.xml是Resin最主要配置文件,类似Tomcat的server.xml。
1、resin.conf和resin.xml>数据源:resin数据源就是位于这个文件,搜索database(位于server标签内)即可定位到具体的配置信息。>域名绑定搜索host即可定位到具体的域名配置,其中的root-directory是域名绑定的对应路径。很容易就能够找到域名绑定的目录了。
Resin获取WebShell
Web Deploy war文件大概是从4.0.0开始支持的;默认没有开启https的访问方式,需要手动配置conf目录下的resin.properties的#https:8443
weblogic中间件
Weblogic默认配置Weblogic默认端口是7001,Weblogic10g-12c默认的管理后台是:http://localhost:7001/consoleWeblogic10:以下默认后台地址是:http://192.168.80.1:7001/console/login/LoginForm.jsp
Weblogic 默认安全策略1、Weblogic默认密码文件:Weblogic9采用的3DES(三重数据加密算法)加密方式,Weblogic9默认的管理密码配置文件位于:weblogic92/samples/domains/wl_server/servers/examples/Server/security/root.propertiesboot.properties:# Generated by Configuration Wizard on Sun Sep 08 15:43:13 GMT 2013username={3DES}fy709SQ4pCHAFk+lIxiWfw==password={3DES}fy709SQ4pCHAFk+lIxiWfw==Weblogic12c采用了AES对称加密方式,但是AES的key并不在这文件里面。默认的管理密码文件存放于:Weblogic12:user_projects/domains/base_domain/servers/AdminServer/security/root.properties boot.properties:boot.properties:# Generated by Configuration Wizard on Tue Jul 23 00:07:09 CST 2013username={AES}PsGXATVgbLsBrCA8hbaKjjA91yNDCK78Z84fGA/pTJE=password={AES}Z44CPAl39VlytFk1I5HUCEFyFZ1LlmwqAePuJCwrwjI=Weblogic12c:Weblogic12/user_projects/domains/base_domain/security/SerializedSystemIni.datWeblogic9:weblogic_9/weblogic92/samples/domains/wl_server/security/SerializedSystemIni.dat解密详情:http://drops.wooyun.org/tips/349 2、Weblogic数据源(JNDI)Weblogic如果有配置数据源,那么默认数据源配置文件应该在:Weblogic12/user_projects/domains/base_domain/config/config.xml
websphere中间件
Websphere默认配置默认的管理后台地址(注意是HTTPS):https://localhost:9043/ibm/console/logon.jsp默认管理密码:1、admin (测试websphere6-7默认可以直接用admin作为用户标识登录,无需密码)2、websphere/ websphere3、system/ manager默认端口:管理控制台端口 9060管理控制台安全端口 9043HTTP传输端口 9080HTTPS传输端口 9443引导程序端口 2809SIP端口 5060SIP安全端口 5061SOAP连接器端口 8880SAS SSL ServerAuth端口 9401CSIV2 ServerAuth 侦听器端口 9403CSIV2 MultiAuth 侦听器端口 9402ORB侦听器端口 9100高可用性管理通讯端口(DCS) 9353服务集成端口 7276服务集成安全端口 7286服务集成器MQ互操作性端口 5558服务集成器MQ互操作性安全端口 5578
GlassFish 默认配置默认Web控制后台: http://localhost:4848默认管理密码: GlassFish2默认帐号admin密码adminadmin 。默认端口:使用Admin的端口 4848。使用HTTP Instance的端口 8080。使用JMS的端口 7676。使用IIOP的端口 3700。使用HTTP_SSL的端口 8181。使用IIOP_SSL的端口 3820。使用IIOP_MUTUALAUTH的端口 3920。使用JMX_ADMIN的端口 8686。使用OSGI_SHELL的默认端口 6666。使用JAVA_DEBUGGER的默认端口 9009。
Server篇[2]
文件上传请求解析
文件上传请求和普通的GET、POST不一样,在JavaEE里面会把multipart请求封装成一个InputStream对象。如果想要从请求里面解析具体的文件内容需要读取流。值得注意的是multipart/form-data中的input域也会包含在InputStream里面。在JavaEE里面可以用:request.getInputStream();或request.getReader();方法获取。文件域下方Content-Type:text/html实际上隐藏了upload.html的内容,chrome不会在那儿显示。判定一个请求是否是文件上传只需从请求头里面取出Content-Type就行了,如果type是multipart/form-data;即标识当前请求类型是文件上传。
文件或虚拟路径请求和处理
虚拟路径请求处理在Servlet里面一个Servlet映射的是一个虚拟的路径。比如请求:http://xxx/servlet/hello。这个servlet/hello并不是一个实际存在的文件地址。所以我们请求的wooyun.jsp可以是真实存在的一个文件,也可以是一个虚拟的路径。比如当客户端请求wooyun.jsp的时候我们把请求交给Controller去处理(仿MVC):普通的文件请求假如用户请求的不是虚拟路径而是一个实际存在的文件呢?这个时候就需要把服务器的文件内容读取并返回给客户端。比如把Contoller注掉改为content=readFile(request);这次去读取ROOT下的wooyun.jsp内容。
Server安全问题
文件解析漏洞
如果把Tomcat的web.xml的filter添加任意后缀到servlet-name为jsp的Servlet当中,那么所有后缀为.txt的请求都会被当作jsp解析!
文件读取漏洞
在某些低版本的Tomcat当请求目录并没有找到对应的索引文件,且web.xml的listings是true。于是Tomcat就干脆列出这个目录的所有文件。
Tomcat还出过另一个低级漏洞,当请求的文件是UTF-8编码的时候会造成任意文件遍历漏洞。触发的条件为ApacheTomcat的配置文件context.xml或server.xml的'allowLinking'和'URIencoding'允许'UTF-8'选项
War文件部署漏洞
jBOSS远程部署
后门
jspx后门
jsp和jspx都是由org.apache.jasper.servlet.JspServlet处理,于是想构建一个jspx的webshell。经过反复的折腾,一个jspx的后门就粗线了。测试应该是java的所有的server都默认支持。
Java Logger日志后门
jspf后门
JavaWeb应用安全
B/S数据交互
burpsuite抓包工具
请求和响应
会话管理
Session是存储于服务器内存当中的会话,我们知道Http是无状态协议,为了支持客户端与服务器之间的交互, 我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。用FireFox和Chrome请求同一个URL得到的SessionId并不一样,说明SessionId是唯一的。 一旦Session在服务器端设置成功那么我们在此次回话当中就可以一直共享这个SessionId对应的session信息, 而session是有有效期的,一般默认在20-30分钟,你会看到xss平台往往有一个功能叫keepSession, 每过一段时间就带着sessionId去请求一次,其实就是在保持session的有效不过期。Session 生命周期(从创建到销毁)1、session的默认过期时间是30分钟,可修改的最大时间是1440分钟(1440除以60=24小时=1天)。2、服务器重启或关闭Session失效。
Cookie是以文件形式[缓存在客户端]的凭证(精简下为了通俗易懂),cookie的生命周期主要在于服务器给设置的有效时间。 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。盗取cookie的最直接的方式就是xss,利用IE浏览器输出当前站点的cookie:HttpOnly通过document对象能够拿到存储于客户端的cookie信息。HttpOnly设置后再使用document.cookie去取cookie值就不行了。通过添加HttpOnly以后会在原cookie后多出一个HttpOnly;普通的cookie设置:Cookie: jsessionid=AS348AF929FK219CKA9FK3B79870H;加上HttpOnly后的Cookie:Cookie: jsessionid=AS348AF929FK219CKA9FK3B79870H;HttpOnly;
CSRF跨站域请求伪造
CSRF攻击是黑客借助受害者的cookie骗取服务器的信任,但是黑客并不能拿到cookie,也看不到cookie的内容。 另外,对于服务器返回的结果,由于浏览器同源策略的限制,黑客也无法进行解析。 因此,黑客无法从返回的结果中得到任何东西,他所能做的就是给服务器发送请求,以执行请求中所描述的命令, 在服务器端直接改变数据的值,而非窃取服务器中的数据。 所以,我们要保护的对象是那些可以直接产生数据改变的服务,而对于读取数据的服务,则不需要进行CSRF的保护。 比如银行系统中转账的请求会直接改变账户的金额,会遭到CSRF攻击,需要保护。 而查询余额是对金额的读取操作,不会改变数据,CSRF攻击无法解析服务器返回的结果,无需保护。
CSRF攻击方式对象:A:普通用户,B:攻击者1、假设A已经登录过xxx.com并且取得了合法的session,假设用户中心地址为:http://xxx.com/ucenter/index.do2、B想把A余额转到自己的账户上,但是B不知道A的密码,通过分析转账功能发现xxx.com网站存在CSRF攻击漏洞和XSS漏洞。3、B通过构建转账链接的URL如:http://xxx.com/ucenter/index.do?action=transfer&money=100000 &toUser=(B的帐号),因为A已经登录了所以后端在验证身份信息的时候肯定能取得A的信息。 B可以通过xss或在其他站点构建这样一个URL诱惑A去点击或触发Xss。 一旦A用自己的合法身份去发送一个GET请求后A的100000元人民币就转到B账户去了。 当然了在转账支付等操作时这种低级的安全问题一般都很少出现。
SQL注入一
JDBC和ORM
JPA:JPA全称Java Persistence API.,JPA通过JDK5.0注解或XML描述对象-关系表的映射关系, 并将运行期的实体对象持久化到数据库中。 是一个ORM规范。Hibernate是JPA的具体实现。
ORM:对象关系映射(ORM)目前有Hibernate、OpenJPA、TopLink、EclipseJPA等实现。
JPA可以依靠JDBC对JDO进行对象持久化,而ORM只是JPA当中的一个规范; 我们常见的Hibernate、Mybatis和TopLink什么的都是ORM的具体实现。
SQL注入攻击1
原理:
因为拼接SQL语句,导致输入内容被当作SQL语句执行。
SQL语句注释符号:--在oracle和mssql都可用,mysql可以用# /**/。
判断方法:
and/or 1=1 及 and/or 1=2 注入判断大法:当参数为2 and 1=1去查询时,由于1=1为true所以能够正常的返回查询结果;当传入参数2 and 1=2时查询结果是不存在的,所以没有显示任何结果。
order by 字段判断大法: 执行order by 4正常显示数据order by 5错误说明查询的字段数是4
防范方法:
PreparedStatement实现防注入:SQL语句被预编译并存储在PreparedStatement对象中,然后可以使用此对象多次高效地执行该语句。
http://zone.wooyun.org/content/2448
Web项目中/WEB-INF/lib下和对应容器的lib下有MySQL等数据库连接驱动包,那么就能够连接相应数据库。
Web当中最容易出现SQL注入的地方:1、常见的文章显示、分类展示。2、用户注册、用户登录处。3、关键字搜索、文件下载处。4、数据统计处(订单查询、上传下载统计等)经典的如select下拉框注入。5、逻辑略复杂处(密码找回以及跟安全相关的)。
SQL注入二
MySQL注入
Information_schema数据库存储了MySQL数据库表结构的各种信息; tables表Table_name字段,存储了当前用户权限下能查看的所有的表名称。 table_rows字段,存储了每个标的行数。
LIMIT子句可以被用于强制SELECT语句返回指定的记录数。 LIMIT接受一个或两个数字参数。参数必须是一个整数常量。 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量, 第二个参数指定返回记录行的最大数目。
特殊函数的使用方法
GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。
数据脱裤
注入在windows下默认是E:\\如果用“\\”去表示路径的话需要转换成E:\\\\而更方便的方式是直接用/去表示即E:/。 当我们知道WEB路径的情况下而又有outfile权限直接导出数据库中的用户信息。
如果是在一些极端的情况下无法直接outfile我们可以合理的利用concat和GROUP_CONCAT去把数据显示到页面, 如果数据量特别大,我们可以用concat加上limit去控制显示的数量。比如每次从页面获取几百条数据? 写一个工具去请求构建好的SQL注入点然后把页面的数据取下来,那么数据库的表信息也可以直接从注入点全部取出来。
注入点提权
1、写启动项
直接写到windows的启动目录就行了, 我测试的系统是windows7直接写到: C:/Users/selina/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup目录就行了。
2、失败的注入点UDF提权尝试
MYSQL提权的方式挺多的,并不局限于udf、mof、写windows启动目录、SQL语句替换sethc实现后门等。
3、创建一个function函数create function cmdshell returns string soname ‘udf.dll’;因为没有办法去创建一个function所以用注入点实现udf提权在上一步就死了, 通过在命令行执行创建function只能算是心灵安慰了,只要完成了create function那一步我们就真的成功了,因为调用自定义function非常简单:
3、MOF和sethc提权:
具备自己导入任意文件到任意目录了,而MOF实际上就是写一个文件到指定目录,而sethc提权我只成功模糊的过一次。
create table mix_cmd( shift longblob);insert into mix_cmd values(load_file(‘c:\\windows\\system32\\cmd.exe’));\u2028 select * from mix_cmd into dumpfile ‘c:\\windows\\system32\\sethc.exe’;\u2028 drop table if exists mix_cmd;
Oracle注入
Oracle注入基础
GetShell上传木马
1、在有Oracle连接权限没有webshell时候通过utl_file获取shell(当然用户必须的具有创建DIRECTORY的权限):grant CREATE ANY DIRECTORY TO SCOTT;
2、创建目录create or replace directory getshell_dir as 'E:/soft/apache-tomcat-7.0.37/webapps/SqlInjection/';
在低权限下getshell
执行以下SQL创建表空间:create tablespace shell datafile 'E:/soft/apache-tomcat-7.0.37/webapps/SqlInjection/shell.jsp' size 100k nologging ;CREATE TABLE SHELL(C varchar2(100)) tablespace shell;insert into SHELL values('hello world');commit;alter tablespace shell offline;drop tablespace shell including contents;
SQLJ运行环境由纯Java实现的小SQLJ运行库组成,该运行时库转而调用相应数据库的JDBC驱动程序。
MVC安全
概念:
JavaWeb的Servlet和Filter:
在Java里面可以在项目启动时去加载配置到Servlet容器内。 在web.xml里面配置一个Servlet或者Filter后可以非常轻松 的拦截、过滤来自于客户端的任意后缀请求。
STRUTS2框架
ActionContext对象:在每次执行Action之前都会创建新的ActionContext对象, 通过ActionContext获取的session、request、application并 不是真正的HttpServletRequest、HttpServletResponse、ServletContext对象, 而是将这三个对象里面的值重新包装成了map对象。这样的封装, 我们及获取了我们需要的值,同时避免了跟Web容器直接打交道,实现了完全的解耦。
分支主题
0 条评论
回复 删除
下一页