Exp8 Web基础

Web基础

终于来到Web应用安全这一领域了。基础为王,要想入门Web安全领域,对基本的Web开发的基础知识必定要了解。javascript

Web开发通常来讲是分前端、后端的。固然如今很火的一个概念——全栈工程师,能够认为是对先后端都有涉猎的全才。php

0x0 环境搭建

环境的搭建不是重点,这里就轻描淡写地说一下。有问题能够利用搜索引擎查找解决方案。css

0x01 apache的安装

此次实验我用的是ubuntu 18.04,在这上面安装Apache很是简单。html

sudo apt-get install apache2

安装apache2后,输入下面的命令打开apache服务前端

/etc/init.d/apache2 start

而后在浏览器里输入localhost查看测试页面java

0-0

关闭apache服务用/etc/init.d/apache2 stop便可node

0x02 mysql的安装与使用

mysql的安装也很是简单sudo apt-get install mysql-serverpython

而后开启服务/etc/init.d/mysql startmysql

接着进入mysql,输入sudo mysql -u root -p 默认password依然是rootweb

0-1

而后咱们创建一个新的数据库web_db,输入create database web_db

0-2

在web_db数据库中,创建一个名为users的表

use web_db;
create table users(
    username varchar(256),
    password varchar(20)
);

0-3

而后咱们向users表中插入一条数据

insert into users values('wangyifan', '20155110');

0-4

至此,咱们的准备工做已经作好了。

因为权限问题,咱们还有另外一个用户帐号能够登陆mysql。

查看/etc/mysql/debian.cnf中的内容

0-4-1

用户名debian-sys-maint,口令SY7hZpYpuHu5YJY4也能够访问数据库。

关于SQL语句和关系型数据库的话题,须要之后慢慢了解。

0x03 PHP的安装与配置

咱们直接上PHP的官网php.net找解决方案吧。

0-5

这里我就不重复搬运了。别忘了php的mysql模块的安装

/var/www/html下建立一个测试用的test.php

<?php
phpinfo()
?>

在浏览器中访问这个PHP文件,咱们就能够查看PHP的配置状况

0-6

至此,咱们完成了PHP的配置。

0x1 Web前端基础知识概述

Web开发方面的知识上手很快,可是随着技术的不断进步,源源不断的新框架、新技术、新思想、新实践的出现,更让人眼花缭乱。

即使是Web前端也发生了翻天覆地的变化,早年掌握html,css,JavaScript熟悉dreamweaver就能吃遍天。

而如今,前端的工程化实践愈来愈凸显,各大框架层出不穷……

node.js的出现使得一大批JavaScript前端工程师又标榜本身是“全栈工程师”……

固然了,咱们暂时不须要了解最新的技术,但必定要掌握一些基础。

0x11 HTML和DOM(文档对象模型)

通俗的来讲,HTML文档就是网页,它由众多的标签组成,标签内还有各类属性。

咱们应该了解

  • URL的组成
  • HTTP协议
  • 文档对象模型(DOM)

这里着重介绍一下DOM这个东西。HTML文档从某种程度上说,就是一棵DOM树。

没错,DOM是一个树型结构,就像下图这样。

1-1

每一个节点都是一个对象,拥有方法和属性。

JavaScript能够访问和更新这个DOM树(而不是HTML源代码)

针对DOM树的任何修改都会反映到浏览器中。

HTML中有一个臭名昭著的标签就是iframe,早期的网页挂马用的就是iframe标签。

0x12 Web时代的shellcode——JavaScript

JavaScript是被《Web前端黑客技术揭秘》的做者称为“跨站之魂”的强大语言。

JavaScript几乎能够控制前端的一切操做,还能获取隐私信息。有了XSS漏洞,经过注入JavaScript攻击者就能够进行一系列操做。

对于JavaScript,咱们至少应该知道:

  • DOM树的操做
  • 同源策略
  • AJAX技术
  • cookie安全

限于篇幅,咱们这里只介绍 同源策略,它是浏览器最核心也最基本的安全功能。

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同时也是黑客“杀人无形”的利器。咱们有时间应该熟悉一下这个技术。

0x13 为啥不谈CSS

CSS是层叠样式表,用来控制网页的呈现样式,好比颜色、字体、大小、高宽、布局等等。

做为网络对抗这门课来讲,经过CSS的灵活应用作假装来钓鱼是个不错的选择。

不过让一个黑客搞美工?这……有点不太现实。

0x2 本身编写一个简单的网站

接下来,咱们本身简单地写一个网站,只完成最基本的登陆功能便可。

咱们以前建立了web_db这个数据库,在web_db中添加了users表,并插入了一条数据。

登陆的用户名为wangyifan,口令为20155110。

0x21 用HTML写登陆表单

首先咱们编写前端的登陆页面,很是简单。

咱们编写一个名叫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元素和处理事件用的。

0x22 用JavaScript处理事件

咱们编写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编程艺术》

0x23 用PHP编写后台逻辑

咱们用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注入的免疫力。

0x24 最终效果

别笑,虽然这个网站挺简陋的,但能把原理了解清楚就行。

2-1

首先,看一下JavaScript事件处理的效果

2-2

而后,咱们输入正确的用户名,口令

2-3

登陆成功了。

2-4

输入一个错误的用户名或者口令,提示登陆失败。

2-5

0x3 初步体验XSS和SQL注入

接着,咱们就先体验一下SQL注入和XSS吧。

形成这些漏洞的最本质的缘由——数据和指令的混淆。

被污染的数据流被注入到指令的执行之中,就会产生上面两个漏洞。

前者是数据变成SQL语句的一部,后者是数据变为可执行的JavaScript脚本。

此次实验先不给出XSS和SQL注入的详细介绍,只是先体验一下。

0x31 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=''

因此结果集必定不为空,能够绕过登陆认证。

3-1

这就是最简单的一个SQL注入。

0x32 XSS的概念验证

XSS本质是脚本的执行,固然不必定是JavaScript,也能够是一段html片断。

咱们如今就让网站执行一次弹窗。固然,真正的XSS攻击不会这么简单。

输入'or 1=1 # <script>alert("xss")</script>

3-2

接着点击登陆按钮,咱们的JavaScript代码就会执行。

3-3

固然,做为注入的内容,也能够是HTML片断。

好比<img src="test.png">,展现图片

3-4

基础问题解答

(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前端也不错的,有个浏览器就够了。

相关文章
相关标签/搜索