终于来到Web应用安全这一领域了。基础为王,要想入门Web安全领域,对基本的Web开发的基础知识必定要了解。javascript
Web开发通常来讲是分前端、后端的。固然如今很火的一个概念——全栈工程师,能够认为是对先后端都有涉猎的全才。php
环境的搭建不是重点,这里就轻描淡写地说一下。有问题能够利用搜索引擎查找解决方案。css
此次实验我用的是ubuntu 18.04,在这上面安装Apache很是简单。html
sudo apt-get install apache2
安装apache2后,输入下面的命令打开apache服务前端
/etc/init.d/apache2 start
而后在浏览器里输入localhost
查看测试页面java
关闭apache服务用/etc/init.d/apache2 stop
便可node
mysql的安装也很是简单sudo apt-get install mysql-server
python
而后开启服务/etc/init.d/mysql start
mysql
接着进入mysql,输入sudo mysql -u root -p
默认password依然是rootweb
而后咱们创建一个新的数据库web_db,输入create database web_db
在web_db数据库中,创建一个名为users的表
use web_db; create table users( username varchar(256), password varchar(20) );
而后咱们向users表中插入一条数据
insert into users values('wangyifan', '20155110');
至此,咱们的准备工做已经作好了。
因为权限问题,咱们还有另外一个用户帐号能够登陆mysql。
查看/etc/mysql/debian.cnf中的内容
用户名debian-sys-maint,口令SY7hZpYpuHu5YJY4也能够访问数据库。
关于SQL语句和关系型数据库的话题,须要之后慢慢了解。
咱们直接上PHP的官网php.net找解决方案吧。
这里我就不重复搬运了。别忘了php的mysql模块的安装
在/var/www/html
下建立一个测试用的test.php
<?php phpinfo() ?>
在浏览器中访问这个PHP文件,咱们就能够查看PHP的配置状况
至此,咱们完成了PHP的配置。
Web开发方面的知识上手很快,可是随着技术的不断进步,源源不断的新框架、新技术、新思想、新实践的出现,更让人眼花缭乱。
即使是Web前端也发生了翻天覆地的变化,早年掌握html,css,JavaScript熟悉dreamweaver就能吃遍天。
而如今,前端的工程化实践愈来愈凸显,各大框架层出不穷……
node.js的出现使得一大批JavaScript前端工程师又标榜本身是“全栈工程师”……
固然了,咱们暂时不须要了解最新的技术,但必定要掌握一些基础。
通俗的来讲,HTML文档就是网页,它由众多的标签组成,标签内还有各类属性。
咱们应该了解
这里着重介绍一下DOM这个东西。HTML文档从某种程度上说,就是一棵DOM树。
没错,DOM是一个树型结构,就像下图这样。
每一个节点都是一个对象,拥有方法和属性。
JavaScript能够访问和更新这个DOM树(而不是HTML源代码)
针对DOM树的任何修改都会反映到浏览器中。
HTML中有一个臭名昭著的标签就是iframe,早期的网页挂马用的就是iframe标签。
JavaScript是被《Web前端黑客技术揭秘》的做者称为“跨站之魂”的强大语言。
JavaScript几乎能够控制前端的一切操做,还能获取隐私信息。有了XSS漏洞,经过注入JavaScript攻击者就能够进行一系列操做。
对于JavaScript,咱们至少应该知道:
限于篇幅,咱们这里只介绍 同源策略,它是浏览器最核心也最基本的安全功能。
Web是构建在同源策略基础之上的,AJAX就是严格遵照同源策略的,cookie的共享也严格限制在同一父域中。
咱们着重讨论什么是同域。同域就是两个站点用同协议、同域名、同端口。
咱们给出一个例子,判断下面的站点是否与http://www.example.com同域。
站点 | 是否同域 | 缘由 |
---|---|---|
https://www.example.com | 不一样域 | 协议不一样(http与https) |
http://test.example.com | 不一样域 | 域名不一样(子域名test和www) |
http://example.com | 不一样域 | 域名不一样(顶级域和www子域) |
http://www.example.com:8080 | 不一样域 | 端口不一样(8080端口和80端口) |
http://www.example.com/a/ | 同域 | 同协议,同域名,同端口,只是多了个目录 |
一般所说的两个站点同域,就是指它们同源。
AJAX是很是经常使用的技术,可让数据在后台进行异步传输,好比对网页局部数据的更新,不用刷新整个网页。AJAX同时也是黑客“杀人无形”的利器。咱们有时间应该熟悉一下这个技术。
CSS是层叠样式表,用来控制网页的呈现样式,好比颜色、字体、大小、高宽、布局等等。
做为网络对抗这门课来讲,经过CSS的灵活应用作假装来钓鱼是个不错的选择。
不过让一个黑客搞美工?这……有点不太现实。
接下来,咱们本身简单地写一个网站,只完成最基本的登陆功能便可。
咱们以前建立了web_db这个数据库,在web_db中添加了users表,并插入了一条数据。
登陆的用户名为wangyifan,口令为20155110。
首先咱们编写前端的登陆页面,很是简单。
咱们编写一个名叫login.html的登陆表单
<html> <head> <title>Welcome</title> </head> <body> <h1>Welcome!</h1> <form method="POST" action="login.php"> <label> Name: <input type="text" id="username" name="username" /> </label> <br /> <label> Password: <input type="password" id="password" name="password" /> </label> <br /> <div id="feedback"></div> <br /> <input type="submit" value="login" /> </form> <script src="event.js"></script> </body> </html>
核心部分就是form表单,input标签的name属性是后台php接收参数时要用到的。
<input type="password">
是密码框,尽管在屏幕上被隐藏了口令,但不表明传输过程当中是安全的。
咱们特意留下了id属性,和div标签,这是为了后面的JavaScript用getElementById操做DOM元素和处理事件用的。
咱们编写event.js处理事件。当焦点离开用户名输入框时,若是用户输入的字符少于5个,咱们在页面反馈信息,提示用户名不该该少于5个字符。
function checkUsername() { var elMsg = document.getElementById('feedback'); if (this.value.length < 5) { elMsg.textContent = 'Username must be 5 characters or more'; } else { elMsg.textContent = ''; } } var elUsername = document.getElementById('username'); elUsername.onblur = checkUsername;
JavaScript处理事件的方法有三种:HTML事件处理属性、DOM事件处理、事件监听器。
咱们这里用到的是第二种——DOM事件处理。(我到一个大牛朋友嘲笑我不会JQuery……其实我对JavaScript也一窍不通)
详细的一些JavaScript处理DOM的技巧,能够看一下《JavaScript DOM编程艺术》
咱们用PHP处理前端提交的表单。依葫芦画瓢,照搬学长的代码。
下面是login.php
<?php $username=$_POST["username"]; $password=$_POST["password"]; $query_str="SELECT * FROM users where username='$username' and password='$password';"; $mysqli = new mysqli("127.0.0.1", "debian-sys-maint", "SY7hZpYpuHu5YJY4", "web_db"); if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } if ($result = $mysqli->query($query_str)) { if ($result->num_rows > 0 ){ echo "<br><h3>Hello, $username</h3> <br> "; } else { echo "<br><h3> login failed!!!! </h3><br> " ; } $result->close(); } $mysqli->close(); ?>
虽然我对PHP一窍不通,可是这段代码的逻辑很容易从字面上理解的。
和Java的JDBC相比,php链接数据库仍是挺方便的。
这里故意用字符串拼接的方式构成$query_str查询语句,方便后面的SQL注入。
若是用参数化语句的话,就能大大提升对SQL注入的免疫力。
别笑,虽然这个网站挺简陋的,但能把原理了解清楚就行。
首先,看一下JavaScript事件处理的效果
而后,咱们输入正确的用户名,口令
登陆成功了。
输入一个错误的用户名或者口令,提示登陆失败。
接着,咱们就先体验一下SQL注入和XSS吧。
形成这些漏洞的最本质的缘由——数据和指令的混淆。
被污染的数据流被注入到指令的执行之中,就会产生上面两个漏洞。
前者是数据变成SQL语句的一部,后者是数据变为可执行的JavaScript脚本。
此次实验先不给出XSS和SQL注入的详细介绍,只是先体验一下。
咱们知道以前的SQL语句是有字符串拼接而成的select * from users where username= '$username' and password='$password';
咱们能够用'
这个符合闭合以前的单引号,而后注释掉后面的SQL语句。
输入'or 1=1 #
,获得select * from users where username = '' or 1=1 # and password=''
因此结果集必定不为空,能够绕过登陆认证。
这就是最简单的一个SQL注入。
XSS本质是脚本的执行,固然不必定是JavaScript,也能够是一段html片断。
咱们如今就让网站执行一次弹窗。固然,真正的XSS攻击不会这么简单。
输入'or 1=1 # <script>alert("xss")</script>
接着点击登陆按钮,咱们的JavaScript代码就会执行。
固然,做为注入的内容,也能够是HTML片断。
好比<img src="test.png">
,展现图片
(1) 什么是表单?
答:表单在网页中提供数据采集功能,咱们看到的一些文本框、密码框、单选框、提交按钮都是表单的一部分。
(2) 浏览器能够解析运行什么语言?
答:主要就是HTML,CSS和JavaScript,其余的客户端脚本也能够执行。
(3) WebServer支持哪些动态语言?
答:早期Web编程都是靠CGI,你会看到用C/C++、Perl、bash进行服务器端Web编程的。
后来就有了Servlet/JSP、PHP、ASP等等,如今出现一些新秀,好比python,Go语言,ruby on rails等等,均可以进行web编程。
基础为王,实话实说,我目前在Web方面的基础知识并不全面,有不少东西还不熟悉。
若是时间和篇幅容许,让我多学一点东西,我干脆写一系列的Web基础学习笔记。
虽然说Web的东西上手快,可是内容有些庞杂,很差组织。我这篇报告也写的七零八落的。
之后的学习中缺什么补什么就行。
我以为未来工做之后,业余时间看看Web前端也不错的,有个浏览器就够了。