java代码审计-换行符CRLF注入

        CRLF 的缩写是指回车和换行操作,其中 CR ASCII 中的第 13 个字符,也 写作 \r , LF ASCII 中的第 10 个字符,也写作 \n ,因此 CRLF 一般翻译为回车换行注入漏洞。
什么是CRLF注入漏洞?

        CRLF 即【回车\r+换行\n】的简称,十六进制码为0x0d和0x0a 。在http协议中,http header 与 http body是用两个crlf分隔的,浏览器就是根据这两个crlf来取出http内容并显示出来的 ,当http消息头中的字符串外部可控,攻击者注入一些恶意的换行比如一些会话cookie或者html代码时就会导致存在安全风险。

CRLF注入漏洞演示1

实战环境:vulhub的nginx配置错误导致漏洞

搭建

我用的snap在ubuntu下载安装了docker

参考链接

Vulhub - Docker-Compose file for vulnerability environmentVulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。icon-default.png?t=N7T8https://vulhub.org/#/environments/nginx/insecure-configuration/

下载Vulhub.zipicon-default.png?t=N7T8https://github.com/vulhub/vulhub/archive/master.zipgithub链接

git clone GitHub - vulhub/vulhub: Pre-Built Vulnerable Environments Based on Docker-Compose

启动

在项目nginx/insecure-configuration路径下执行以下命令

docker compose up -d

查看docker容器运行状态

sudo docker ps -a

漏洞poc测试

curl -i http://192.168.218.134:8080/%0d%0aheader:header
-i 将显示服务器返回的完整响应信息,包括响应头和响应体

可以看到header增加了

尝试注入xss

http://192.168.218.134:8080/%0d%0a%0d%0a<script>alert(0)</script>

浏览器打开此xss没有执行,此xss没有执行成功。原因是重定向时浏览器不会加载响应体,..... 因该是有可以打xss的方法,笔者暂时没有想到。

漏洞分析

这是nginx配置错误导致的漏洞,这样的配置原本的目的是将http跳到https:。但location后的$url是直接拼接之后的,为用户可控参数,又没有对参数进行过滤,间接导致nginx解析了%0d%0a为一个换行

CRLF注入漏洞演示2
下列 Web 应用程序代码会尝试从一个请求对象中读取整数值。如果数值未被解 析为整数,输入就会被记录到日志中,并附带一条提示相关情况的错误信息。
<%@ page contentType="text/html;charset=UTF-8" language="Java" %> 
<%@ page import="Java.util.logging.Logger" %> 
<%@ page import="Java.util.logging.Level" %> 
<html> 
<head> 
     <title>日志注入</title> 
</head> 
 <body> 
 <% 
     String val=request.getParameter("val"); 
     Logger log = Logger.getLogger("log"); 
     log.setLevel(Level.INFO); 
     try{ 
         int value = Integer.parseInt(val); 
         System.out.print(value); 
     }catch(Exception e){ 
         log.info("Filed to parse val = " + val); 
     } 
%> 
 </body> 
</html>
如果用户为“ val ”提交参数 val=aaa ,则日志会记录以下条目:
INFO:Failed to parse val=aaa
然而,如果攻击者提交字符串val=“aaaa %0a%0aINFO:xxxxx则 日志中就会记录以下条目。
INFO:Failed to parse val=aaa
INFO:xxxxx
显然,攻击者可以通过将未经验证的用户输入写入日志文件,使日志条目被伪造或者恶意信息被注入日志
CRLF注入漏洞演示3

根据重定向的逻辑我写了一个servlet的demo,用来测试

public class RedirectServlet extends HttpServlet {
}

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String input = request.getParameter("input");

        System.out.println(input);

        response.sendRedirect("success.jsp?message=" + input);
    }
}

我的servlet配置如下

<servlet>
    <servlet-name>redirectServlet </servlet-name>
    <servlet-class>RedirectServlet </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>redirectServlet </servlet-name>
    <url-pattern>/redirect</url-pattern>
</servlet-mapping>

开始测试

curl -i http://localhost:8080/redirect?input=123

尝试注入

curl -i http://localhost:8080/redirect?input=123%0d%0aheader:header

 没有换行,没有触发漏洞。

但可以看出来System.out.println 是识别了换行符的,当增加%a的时候

curl -i http://localhost:8080/redirect?input=123%0d%0a%0a%0a%0a%0aheader:header

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称还在想呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值