淺析反向代理

轉載自公衆號:alisrc

最近這段時間頻頻接觸到反代的東西,所以就更進一步的瞭解了一番, 有什麼不對的地方還請大佬們指正~本文需要用到的代碼已上傳Github

本文涉及到的東西僅供技術研究,請勿用於非法用途,否則後果自負。

前言

最近把博客重新弄了一下,發現了一個特別有意思的東西,看圖~

還有一些有意思的東西,比如反代谷歌(谷歌鏡像站)、釣魚、繞過國內備案和線下CTF中的一些騷操作,等等。

簡介

反向代理,簡而言之就是反向代理服務器從目標內容服務器上抓取內容返回給用戶,反向代理服務器充當一箇中介功能,他本身是沒有任何內容的。

區別於正向代理而言,反向代理是代理的服務端,而正向代理是代理的客戶端。

再來簡單介紹一下我在前言中所說的我讓我的博客ip是如何變成1.1.1.1的,其實1.1.1.1是一臺DNS服務器(號稱全球最快的DNS),正好1.1.1.1又是cf cdn中的一個節點。

這樣我們就可以將域名解析到1.1.1.1,然後在cf中設置好真實的回源地址即可。在文末已附上教程鏈接,感興趣的可以玩玩~

一些有意思的東西

除了上述所說的套一個CDN,讓自己ip變成1.1.1.1來隱藏自己站點ip,還有一些其他好玩的~

CTF線下中的一些思路

因爲我們線下賽中每支隊伍的web站點都一樣,筆者在之前的一次線下訓練賽的時候嘗試過修改apache配置文件來反代分數最高的隊伍的站點,從而達到流量轉發(傷害轉移)的效果。這個具體能不能實現得看服務器的權限能提升到多高,其次也得根據具體的check機制來靈活使用。如果提升的權限不夠高的話,也可以配置.htaccess來實現反代。用tcpdump倒流量順手抓一波別人的payload。

如果我們採用的是.htaccess方法進行反向代理,這裏說一下這種方法的原理和其他的不同在於它本質上是利用.htaccess映射到一個php文件,然後利用php文件去抓取目標服務器的信息返回給客戶端。這裏.htaccess配置的作用是重寫url。所以我們不妨在這個php文件中包含一下這個demo1.php即可達到payload的記錄的效果:

代碼如下:

demo1.php

<?php
write_log();

function get_http_raw() {
    $raw = '';

    $raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."rn";

    foreach($_SERVER as $key => $value) {
        if(substr($key, 0, 5) === 'HTTP_') {
            $key = substr($key, 5);
            $key = str_replace('_', '-', $key);
            $raw .= $key.': '.$value."rn";
        }
    }
    $raw .= "rn";
    $raw .= file_get_contents('php://input');
    return $raw;
}


function write_log(){
    $data = date("Y/m/d H:i:s")."rn".get_http_raw()."rnrn";
    $file = fopen('log1.txt', 'a'); //日誌路徑
    fwrite($file, $data);
    fclose($file);

}

記錄如下:

克隆網站 —中間人攻擊

我們可以安裝一個nginx的第三方模塊ngx_http_substitutions_filter_module,然後nginx的配置文件中加入一段,即可彈窗等。

subs_filter </head> "<script>alert('1');</script></head>";

location部分的配置如下:

這裏有個坑弄了我好久… 就是我們請求網站的時候,數據包頭部一般會有Accept-Encoding部分,如下圖所示,這個部分告訴服務器,客戶端能以怎樣的形式解碼。

那麼問題來了,數據包是壓縮的,我們怎樣才能用subs_filter 替換其中的內容呢? 其實正像上面截圖的配置那樣設置:反代服務器請求上游服務器的時候帶上Accept-Encoding=‘ ’ 即可,表示不接受任何壓縮數據。

訪問http://a.cuit.store,效果如下:

這樣如果我們反代一個登錄頁面,比如qq空間,然後植入我們的js腳本,後果emmm…
當然了,不同站的反代難度是不一樣的~

繞過網站所有權驗證,調用在線的雲掃描器給我們需要滲透的網站進行掃描

以人人掃這個雲掃描平臺爲例:

http://www.renrenscan.com/, 其中需要我們把一個認證文件放到網站根目錄上,我們可以設置反代規則的時候,對這個文件進行排除,不進行代理即可繞過,或者直接用.htaccess的方法進行反代就行。

這樣我們只需要等待掃描結果,即可get目標站的漏洞了~

如果我們再邪惡一點….順便也可以包含上demo1.php,把這些掃描的payload都導出來下來(手動滑稽)

ps:這裏說點其他的,我發現在給我博客加cdn的時候,發現瞭如下圖所示的這個,因爲我用的是cloudflare免費版的套餐,可以看到有很多請求沒有經過CDN處理就直接回源了,這就可以讓我們想到如果我們滲透的站點是套了CDN的,常規的找郵件服務器,靜態文件,ssrf啥的如果都不管用,還不如來點簡單粗暴的,暴力發包讓CDN承受不住而回源,這樣真實ip’輕鬆’get~

反向代理不當

一般當我們遇到了反代服務器的時候,可以試着用burpsuite的repeat功能,設置host爲反代服務器,然後把http請求中的路徑改爲內網中的host(一般需要窮舉,窮舉網段ip端口域名等等)。

因爲反向代理的本質就是將客戶端的請求url重寫後發往上游服務器,將返回結果發回客戶端,在這之中,如果對路徑的配置不當就有可能導致反向代理變正向代理導致一些信息泄露,內網穿透等等漏洞。

參考:

1、內網穿透代理洞

https://bbs.ichunqiu.com/thread-36628-1-1.html

2、谷歌內部主機信息泄露漏洞

https://www.freebuf.com/vuls/143959.html

3、挖洞經驗之代理不當日進內網

https://paper.tuisec.win/detail/b6d9381e54b0778

4、還有一種就是nginx爲Django做反代的時候,靜態文件配置錯誤導致源碼泄露

https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html#_1

如何防止被反向代理

反向代理不僅會對用戶造成威脅,而且對服務器來說也會增強負載,還有就是通過代理的方式盜取網站數據,還有就是seo相關的影響了等等…

通過js防止反代:如果地址欄的網址不是www.passer6y.fun那麼就進行跳轉。

<script type="text/javascript">
if (document.domain !='www.passer6y.fun'){
 window.location.href='http://www.passer6y.fun/';
}
</script>

其實這種方法還是可以繞過的,nginx有擴展模塊可以將指定的字符進行替換,這時我們只需將target域名替換成我們自己的就行了(上文有說到如何替換)。或者直接不代理這個js文件也行。

php

<?php 
if($_SERVER['SERVER_NAME'] != 'www.passer6y.fun' )   
{  
header('Location: http://www.passer6y.fun/');
}  
?>

.htaccess

RewriteEngine On
    RewriteBase /
    php_value auto_append_file proxy.php

proxy.php

<?php
        $f = getenv(“HTTP_X_FORWARDED_FOR”);
        $server = getenv(“HTTP_HOST”);
        if (($f!=””)&&($server!=”www.passer6y.fun”){
            echo ‘本服務器禁止惡意反向代理!’;
        }

    ?>

Apache 反代配置方法

1. windows下

修改配置文件:Apacheconfhttpd.conf,將以下兩個前面的註釋符去掉。

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so

然後新增一個Apacheconfvhosts.conf文件

<VirtualHost *:80>

        ServerAdmin admin   # 域名信息

        ServerName passer6y.cn # 郵件信息

        ProxyRequests Off  

        <Proxy *>

        Order deny,allow

        Allow from all

        </Proxy>

        ProxyPass / http://passer6y.cn/ # 將一個遠端服務器映射到本地服務器的URL空間

        ProxyPassReverse / http://passer6y.cn/ # 調整由反向代理服務器發送的HTTP迴應頭中的URL。

    </VirtualHost>

2. linux下

參考:https://www.leaseweb.com/labs/2014/12/tutorial-apache-2-4-transparent-reverse-proxy/
測試環境:Ubuntu 16.04,apache2
加載”proxy_http”模塊:

sudo a2enmod proxy_http
sudo service apache2 restart

在/etc/apache2/sites-available/下,修改配置:

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://192.168.83.1/  # 指定根URL(/)下的內容映射到給定地址的後端服務器
    ProxyPassReverse / http://192.168.83.1/  
</VirtualHost>
~

重啓apache生效配置:

sudo service apache2 reload
sudo service apache2 restart

3.htaccess配置反向代理

這種方法配置反向代理準確的說是php反向代理,我們通過.htaccess中配置一些重寫規則,然後把請求映射到一個php文件中,這個php幫我們請求上游服務器的內容,然後將上游服務器的返回的內容獲取回來發回客戶端。這種配置反代的好處是所需權限比較小,但是也有很多弊端,隨着網站的複雜度,我們所寫的抓取頁面的php腳本難度就不大一樣了。

Github上放了3個php反代腳本的demo,使用說明也見裏面的readme即可。

nginx 反向代理

1. 簡單反代

Nginx核心配置文件nginx.conf:

server {
        listen       80;   # 監聽端口(web服務端口)
        server_name  localhost;  # 當前服務的域名,這裏是本地測試

        location / {   # 這裏的/ 表示把服務器的根目錄反代到www.baidu.com的根目錄。
            proxy_pass http://www.baidu.com;
            proxy_redirect default;
        }
}

2. 實例:反代Google

測試環境:cent os7
條件準備:一個域名,OneinStack一鍵安裝lnmp,Let’s Encrypt 的ssl證書

接下來編輯nginx下的主機配置文件:/usr/local/nginx/conf/vhost/

然後在最後插入:

location / {  
    proxy_set_header  Host  "www.google.com";
    proxy_set_header  User-Agent $http_user_agent;
    proxy_set_header  Connection "";
    proxy_http_version 1.1;
    proxy_pass https://www.google.com;
}

檢測Nginx配置是否正確:

[root@vultr vhost]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

重載Nginx服務:

[root@vultr vhost]# service nginx reload
Reloading nginx configuration (via systemctl):             [  OK  ]

打開google.cuit.store,成功~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章