XSS跨站攻击是指入侵者在远程WEB页面的HTML代码中插入具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面,嵌入其中的脚本将被解释执行。”由于HTML语言允许使用脚本进行简单交互,入侵者便通过技术手段在某个页面里插入一个恶意HTML代码,例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失。如这句简单的Javascript脚本就能轻易获取用户信息:alert([removed]),它会弹出一个包含用户信息的消息框。入侵者运用脚本就能把用户信息发送到他们自己的记录页面中,稍做分析便获取了用户的敏感信息。
本次实验将对XSS攻击中GETSHELL的原理及方法进行详细分析。
XSS跨站攻击的分类
XSS漏洞类型主要分为持久型和非持久型两种:
-
非持久型XSS漏洞一般存在于URL参数中,需要访问黑客构造好的特定URL才能触发漏洞。
-
持久型XSS漏洞一般存在于富文本等交互功能,如发帖留言等,黑客使用的XSS内容经正常功能进入数据库持久保存。
反射型XSS
当请求数据在响应中呈现为未编码和未筛选时,就会发生反映型XSS。通过社会工程学,攻击者可以诱骗用户访问创建这样一个请求的页面,即允许攻击者在目标用户上下文中执行JavaScript。这种变化可以做什么取决于漏洞的性质,但是XSS 一般被利用来劫持会话、窃取凭据或者执行未经授权的操作。
持久型XSS
持久型XSS又叫存储型XSS,存储型XSS攻击就是把攻击数据存进数据库,攻击行为就伴随着攻击数据一直存在.恶意攻击者往Web页面里插入恶意Script代码,网站系统未经过滤就将数据保存到了数据库中,当用户浏览该页的时候,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。
XSS跨站攻击的危害
- 上传脚本文件盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号;
- 利用xss漏洞上传脚本文件获得企业网站一定权限控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力;
- 盗窃企业重要的具有商业价值的资料;
- 控制受害者机器向其它网站发起攻击。
XSS漏洞示例代码
$a=$_GET["username"];
echo $a;
XSS反射型示例效果
步骤1:代码审计:
- 本步将一一追踪漏洞函数,分析漏洞代码
我们在前几课把握大局,进行分析的时候,已经知道,在sys
文件夹下的Lib.php
中,有一段功能为获取用户IP的代码可能存在漏洞,接下来进行分析:
/*可能存在XSS*/
function get_client_ip(){
if ($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"], "unknown")){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}else if ($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")){
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}else if ($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")){
$ip = $_SERVER["REMOTE_ADDR"];
}else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")){
$ip = $_SERVER['REMOTE_ADDR'];
}else{
$ip = "unknown";
}
return($ip);
}
可以看到,上述代码定义了一个获取用户IP的函数,名为get_client_ip
,它使用了多种方法获取用户的IP,每一种方法都进行尝试,如果最终获取不到,则IP赋值为unknown。
分别使用了:$_SERVER["HTTP_CLIENT_IP"]
、$_SERVER["HTTP_X_FORWARDED_FOR"]
、$_SERVER["REMOTE_ADDR"]
函数对用户IP进行获取。
但是我们要知道,IP是可以伪造的,我们可以伪造IP,也就相当于控制了一个变量。
接下来再看看,传入的IP去了哪,有没有经过过滤?这时只需搜索get_client_ip
函数即可。全局搜索法已经演示了很多次,这里就不再赘述:
搜索后,我们发现了分别有两处有get_client_ip
函数,分别是/sys/lib.php
,和user/logcheck.php
第一个是定义它的地方,第二个则是利用它的地方,我们点击开logcheck.php
进行查看:
在其14~17行找到了get_client_ip,如下:
$ip = sqlwaf(get_client_ip());
$query = "UPDATE users SET login_ip = '$ip' WHERE user_id = '$row[user_id]'";
mysql_query($query, $conn) or die("updata error!");
获取到ip后经过sqlwaf的过滤,再赋值到ip这个变量,然后插入了login_ip这个数据库字段
我们传递过来的IP,它经过Sqlwaf函数的处理,并赋值给变量IP,并插入了login_ip这个数据库字段,最后执行语句,Sqlwaf我们在之前已经分析过,它只是过滤了Sql注入的语句,并没有过滤XSS,因此可以无视这个过滤。
我们继续追踪,系统将用户IP信息插入了login_ip这个字段,继续使用全局搜索法搜索login_ip:
这时现在manageuser.php
中的第26行,出现了login_ip。
<?php echo $users['login_ip'];?>
系统直接输出了它,因此,我们可以构造一个payload,伪造成IP,当get_client_ip
函数获取的时候,就会将我们的payload进行传递,当管理员打开manageuser.php
的时候就执行了我们在IP后插入的Payload。这样就可以达到XSS攻击的效果了。
漏洞修复
其实漏洞修复非常简单,我们只需要在Sqlwaf函数中,将常用到的JS跨站脚本关键字禁止尽可,比如:
这样一来就可以在一定程度上修复XSS漏洞。
XSS跨站脚本攻击作为Web应用安全领域中最大威胁之一,不仅仅危害Web应用业务的正常运营,对访问Web应用业务的客户端环境和用户也带来了直接安全影响。虽然XSS跨站脚本攻击在复杂的Web应用环境中利用方式千变万化,但是网络安全人员通过对Web应用的各种环境进行详细分析和处理,完全阻断XSS跨站脚本攻击是可以实现的:
1:利用HttpOnly插件:HttpOnly最初是由微软提出的,目前已经被多款流行浏览器厂商所采用。HttpOnly的作用不是过滤XSS跨站脚本攻击,而是浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie,解决XSS跨站脚本攻击后的Cookie会话劫持行为。
2:完善的输入和输出检查 由于三种XSS跨站脚本攻击类型的漏洞成因可不相同,针对输入输出的检查一部分适用于反射型XSS与存储型XSS。输入检查在大多数的时候都是对可信字符的检查或输入数据格式的检查,如用户输入的注册账号信息中只允许包括字母、数字、下划线和汉字等,对于输入的一切非白名单内的字符均认为是非法输入。数据格式如输入的IP地址、电话号码、邮件地址、日期等数据都具有一定的格式规范,只有符合数据规范的输入信息才允许通过检查。
3:使用随机数改写文件名和文件路径:文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用使用随机函数改写了文件名和路径,将极大增加攻击成本。与此同时,像
1.php.rar.rar
、或者1.xml
这种文件,都因为文件名被改写而无法成功实施攻击