渗透开发-XSS扫描器
– 自动刷SRC
w13scan的xss扫描功能进行优化
灵感注入xray所引起的基于语义的扫描技术。
xss扫描之前是w3afxss payload,通常在以下几个部分。
Xsstrike,Xray,Awvs中的检测技巧以及检测参数
XSStrike
先说说Xsstrike,里面带有xss扫描和fuzz,
DOM XSS
Xsstrike的dom扫描,是通过正则来分析敏感函数
sources = r'''document\.(URL|documentURI|URLUnencoded|baseURI|cookie|referrer)|location\.(href|search|hash|pathname)|window\.name|history\.(pushState|replaceState)(local|session)Storage'''sinks = r'''eval|evaluate|execCommand|assign|navigate|getResponseHeaderopen|showModalDialog|Function|set(Timeout|Interval|Immediate)|execScript|crypto.generateCRMFRequest|ScriptElement\.(src|text|textContent|innerText)|.*?\.onEventName|document\.(write|writeln)|.*?\.innerHTML|Range\.createContextualFragment|(document|window)\.location'''scripts = re.findall(r'(?i)(?s)<script[^>]*>(.*?)</script>', response)
通过将script脚本内的内容提取出来,通过一些正则来获取,最后输出。
准确度很低,只能用于辅助,不太适合自动化扫描
内置参数
它里面有内置一些参数,在检测时转化这些参数也一起发送
blindParams = [ # common paramtere names to be bruteforced for parameter discovery'redirect', 'redir', 'url', 'link', 'goto', 'debug', '_debug', 'test', 'get', 'index', 'src', 'source', 'file','frame', 'config', 'new', 'old', 'var', 'rurl', 'return_to', '_return', 'returl', 'last', 'text', 'load', 'email','mail', 'user', 'username', 'password', 'pass', 'passwd', 'first_name', 'last_name', 'back', 'href', 'ref', 'data', 'input','out', 'net', 'host', 'address', 'code', 'auth', 'userid', 'auth_token', 'token', 'error', 'keyword', 'key', 'q', 'query', 'aid','bid', 'cid', 'did', 'eid', 'fid', 'gid', 'hid', 'iid', 'jid', 'kid', 'lid', 'mid', 'nid', 'oid', 'pid', 'qid', 'rid', 'sid','tid', 'uid', 'vid', 'wid', 'xid', 'yid', 'zid', 'cal', 'country', 'x', 'y', 'topic', 'title', 'head', 'higher', 'lower', 'width','height', 'add', 'result', 'log', 'demo', 'example', 'message']
很好的思路,后面我的扫描器中也使用了这一点
从乌云镜像XSS分类中提取出了top10参数
在扫描时也会将这些参数加上
HTML解析和分析反射
如果参数可以回显,
那么通过html解析就可以获得参数位置,分析回显的环境
(是否在html标签内,是否在html属性内,是否在注释中,是否在js中)
等等,否则来确定检测的payload。
后面我的扫描器的检测流程也是这样,
非常准确和效率,不过Xsstrike分析html是自己写的分析函数,
刚开始我也想直接用它的来着,但是这个函数内容过多,调试困难,代码也很难理解。
其实如果把html解析理解为html的语义分析,用python3自带的html提取函数很容易就能完成这一点。
Xray
XSStrike让我学习到了新一代xss扫描器应该如何编写,
但新一代xss扫描器的payload是在Xray上学到的。
由于Xray没有开源,所以就通过分析日志的方式来看它的工作原理。
<html>
<body>
<a href="?q=1&w=2&e=3&r=4&t=5" />
<script>
<php
foreach($_GET as $key => $value){// $_GET[$key] = htmlspecialchars($value);
}
$q = $_GET["q"];
$w = $_GET["w"];
$e = $_GET["e"];
$r = $_GET["r"];
$t = $_GET["t"];
if(stripos($q,"prompt") > 0){die("error");
}
$var = 'var a = "'.$q.'";';
echo $var;
>
</script>
<div>
<textarea><?php echo $w;?></textarea>
</div>
<input style="color:<?php echo $e;?>" value="<?php echo $r;?>"/><!--this is comment<?php echo $t;?>-->
</body>
</html>
用来分别测试xss在script,style内,html标签内,注释这几种情况下xray的发包过程
对于在script的脚本内的回显内容,对于以下case
<script>$var = 'var a = "'.$_GET['q'].'";';echo $var;</script>
X射线顺序发送了以下payload:pdrjzsqc,“-pdrjzsqc-”,
最后会给出payload,但这个包并没有发送。
后面把prompt作为关键词屏蔽,发现最后还是给出这个payload。
还有一种情况,在script中的注释中输出
<html><body><script>var a = 11;// inline <?php echo $_GET["a"];?>/* <?php echo $_GET["b"];?> */</script></body></html>
xray会发送
xray会发送
\n;chxdsdkm;//来判定,最后给出payload
\n;prompt(1);//
.对于在标签内的内容,针对以下case
<textarea><?php echo $_GET["w"];?></textarea>
xray顺序发送了以下payload
:spzzmsntfzikatuchsvu,,
当确定尖括号没有被过滤时,会继续发送以下payload:
sCrIpTjhymehqbkrScRiPt,
iMgSrCoNeRrOrjhymehqbkr>,
SvGoNlOaDjhymehqbkr>,
IfRaMeSrCjAvAsCrIpTjhymehqbkr>,
aHrEfJaVaScRiPtjhymehqbkrClIcKa,
iNpUtAuToFoCuSoNfOcUsjhymehqbkr>,
进行关键词的试探,最后给出payload为
对于在style里内容,以下case
<input style="color:<?php echo
xray顺序发送了以下payload:kmbrocvz,expression(a(kmbrocvz))
对于在html标签内的内容,以下case
<input style="color:3" value="<?php echo $_GET["r"];?>"/>
xray顺序发送了以下payload:
spzzmsntfzikatuchsvu,
“ljxxrwom=”,
‘ljxxrwom=’,
ljxxrwom=,当确认引号没有被过滤时,会继续发送以下payload:
">,
">ScRiPtvkvjfzrtgiScRiPt,
">ImGsRcOnErRoRvkvjfzrtgi>,
">SvGoNlOaDvkvjfzrtgi>,
">iFrAmEsRcJaVaScRiPtvkvjfzrtgi>,
">aHrEfJaVaScRiPtvkvjfzrtgicLiCkA,
">InPuTaUtOfOcUsOnFoCuSvkvjfzrtgi>,
" OnMoUsEoVeR=xviinqws,最后可以确定payload为
">,"OnMoUsEoVeR=prompt(1)//
如果针对此类case:
<img src=1 onerror="a<?php echo htmlspecialchars($_GET["a"]);?>" />
xray返回payload为prompt(1),
说明xray会把onerror后面的内容当作JavaScript脚本来执行,
如果把onerror改为onerror1,同样会返回prompt。
在awvs规则中也看到过类似的规则
parName == "ONAFTERPRINT" || parName == "ONBEFOREPRINT" || parName == "ONBEFOREONLOAD" || parName == "ONBLUR" || parName == "ONERROR" || parName == "ONFOCUS" || parName == "ONHASCHANGE" || parName == "ONLOAD" || parName == "ONMESSAGE" || parName == "ONOFFLINE" || parName == "ONONLINE" || parName == "ONPAGEHIDE" || parName == "ONPAGESHOW" || parName == "ONPOPSTATE" || parName == "ONREDO" || parName == "ONRESIZE" || parName == "ONSTORAGE" || parName == "ONUNDO" || parName == "ONUNLOAD" || parName == "ONBLUR" || parName == "ONCHANGE" || parName == "ONCONTEXTMENU" || parName == "ONFOCUS" || parName == "ONFORMCHANGE" || parName == "ONFORMINPUT" || parName == "ONINPUT" || parName == "ONINVALID" || parName == "ONRESET" || parName == "ONSELECT" || parName == "ONSUBMIT" || parName == "ONKEYDOWN" || parName == "ONKEYPRESS" || parName == "ONKEYUP" || parName == "ONCLICK" || parName == "ONDBLCLICK" || parName == "ONDRAG" || parName == "ONDRAGEND" || parName == "ONDRAGENTER" || parName == "ONDRAGLEAVE" || parName == "ONDRAGOVER" || parName == "ONDRAGSTART" || parName == "ONDROP" || parName == "ONMOUSEDOWN" || parName == "ONMOUSEMOVE" || parName == "ONMOUSEOUT" || parName == "ONMOUSEOVER" || parName == "ONMOUSEUP" || parName == "ONMOUSEWHEEL" || parName == "ONSCROLL" || parName == "ONABORT" || parName == "ONCANPLAY" || parName == "ONCANPLAYTHROUGH" || parName == "ONDURATIONCHANGE" || parName == "ONEMPTIED" || parName == "ONENDED" || parName == "ONERROR" || parName == "ONLOADEDDATA" || parName == "ONLOADEDMETADATA" || parName == "ONLOADSTART" || parName == "ONPAUSE" || parName == "ONPLAY" || parName == "ONPLAYING" || parName == "ONPROGRESS" || parName == "ONRATECHANGE" || parName == "ONREADYSTATECHANGE" || parName == "ONSEEKED" || parName == "ONSEEKING" || parName == "ONSTALLED" || parName == "ONSUSPEND" || parName == "ONTIMEUPDATE" || parName == "ONVOLUMECHANGE" || parName == "ONWAITING" || parName == "ONTOUCHSTART" || parName == "ONTOUCHMOVE" || parName == "ONTOUCHEND" || parName == "ONTOUCHENTER" || parName == "ONTOUCHLEAVE" || parName == "ONTOUCHCANCEL" || parName == "ONGESTURESTART" || parName == "ONGESTURECHANGE" || parName == "ONGESTUREEND" || parName == "ONPOINTERDOWN" || parName == "ONPOINTERUP" || parName == "ONPOINTERCANCEL" || parName == "ONPOINTERMOVE" || parName == "ONPOINTEROVER" || parName == "ONPOINTEROUT" || parName == "ONPOINTERENTER" || parName == "ONPOINTERLEAVE" || parName == "ONGOTPOINTERCAPTURE" || parName == "ONLOSTPOINTERCAPTURE" || parName == "ONCUT" || parName == "ONCOPY" || parName == "ONPASTE" || parName == "ONBEFORECUT" || parName == "ONBEFORECOPY" || parName == "ONBEFOREPASTE" || parName == "ONAFTERUPDATE" || parName == "ONBEFOREUPDATE" || parName == "ONCELLCHANGE" || parName == "ONDATAAVAILABLE" || parName == "ONDATASETCHANGED" || parName == "ONDATASETCOMPLETE" || parName == "ONERRORUPDATE" || parName == "ONROWENTER" || parName == "ONROWEXIT" || parName == "ONROWSDELETE" || parName == "ONROWINSERTED" || parName == "ONCONTEXTMENU" || parName == "ONDRAG" || parName == "ONDRAGSTART" || parName == "ONDRAGENTER" || parName == "ONDRAGOVER" || parName == "ONDRAGLEAVE" || parName == "ONDRAGEND" || parName == "ONDROP" || parName == "ONSELECTSTART" || parName == "ONHELP" || parName == "ONBEFOREUNLOAD" || parName == "ONSTOP" || parName == "ONBEFOREEDITFOCUS" || parName == "ONSTART" || parName == "ONFINISH" || parName == "ONBOUNCE" || parName == "ONBEFOREPRINT" || parName == "ONAFTERPRINT" || parName == "ONPROPERTYCHANGE" || parName == "ONFILTERCHANGE" || parName == "ONREADYSTATECHANGE" || parName == "ONLOSECAPTURE" || parName == "ONDRAGDROP" || parName == "ONDRAGENTER" || parName == "ONDRAGEXIT" || parName == "ONDRAGGESTURE" || parName == "ONDRAGOVER" || parName == "ONCLOSE" || parName == "ONCOMMAND" || parName == "ONINPUT" || parName == "ONCONTEXTMENU" || parName == "ONOVERFLOW" || parName == "ONOVERFLOWCHANGED" || parName == "ONUNDERFLOW" || parName == "ONPOPUPHIDDEN" || parName == "ONPOPUPHIDING" || parName == "ONPOPUPSHOWING" || parName == "ONPOPUPSHOWN" || parName == "ONBROADCAST" || parName == "ONCOMMANDUPDATE" || parName == "STYLE"
awvs会比较参数名称来确定。
在后面的自动化扫描中,发现这种方式的误报还是很高,
最后我将这种情况调整到了awvs的方式,
只检测指定的属性key。
从这两处细微的差异可以看到
awvs宁愿漏报也不误报,结果会很准确,
xray更多针对白帽子,结果会宽泛一些。
对于在html注释内的内容,以下case
<!--this is comment<?php echo $t;?>-->
xray顺序发送了以下payload:
spzzmsntfzikatuchsvu,
–>,
–!>,
和上面类似,当确定–>或–!>没有过滤时,
会发送
以 --> 或 --!> 开头,添加如下内容<bvwpmjtngz>sCrIpTbvwpmjtngzsCrIpTImGsRcOnErRoRbvwpmjtngz>sVgOnLoAdbvwpmjtngz>iFrAmEsRcJaVaScRiPtbvwpmjtngz>aHrEfJaVaScRiPtbvwpmjtngzcLiCkAInPuTaUtOfOcUsOnFoCuSbvwpmjtngz>
Avvs
Awvs的扫描规则很多,针对的情况也很多,
没有仔细看它的工作方式是怎样的,
主要是看它的payload以及检测的情况,
和上面两种查漏补缺,最终合成了我的xss扫描器~
比如它会对meta标签的content内容进行处理,
会对你srcipt,src等tag的属性处理,
也有一些对AngularJs等一些流行的框架的XSS探测payload。。
我的扫描器
我的XSS扫描器就是综合上面的几种扫描器而来,
如果仔细观察,将会发现上面的扫描器的一些不同寻常的细节。
比如xray不会发送xss的payload,
都是用一些随机字符来代替,同时也会随机大小写对一些标签名称,属性名称等等。
这些精致的技巧吸取
扫描流程
我的扫描器扫描流程是这样的
发送随机flag -> 确定参数回显 ->
确定回显位置以及情况(html,js语法解析) ->
根据情况根据不同payload探测 -> 使用html,js语法解析确定是否多出来了标签,
属性,js语句等等
使用html语法树检测有很多优势,
可以准确判定回显所处的位置,然后通过发送一个随机payload,
例如,再使用语法检测是否有Asfaa这个标签,就能确定payload是否执行成功了。
html语法树用python自带的库
from html.parser import HTMLParser
js检测也是如此,
如果回显内容在JavaScript脚本中,发送随机flag后,
通过js语法解析只需要确定Identifier和Literal这两个类型中是否包含,
如果flag是Identifier类型,就能直接判断存在xss,
payload是alert(1)//,
如果flag是Literal类型,再通过单双引号来闭合进行检测。
Debug之旅
本地靶机测试后就对在线的靶机进行了测试 https://brutelogic.com.br/knoxss.html
查漏补缺后就就开始了自动化扫描。
整个自动化架构如下
1. 提供url ->
爬虫爬取 ->
参数入库 ->
消息队列 ->
xss扫描器 ->
子域名入库->
url入库
1.爬虫使用的crawlergo,效果挺不错的,但还是不太满足我的需求(造轮子的心态又膨胀了)
2.数据库使用的mongodb
3.用celery分散调用,由于用到了celery,又用到了rabbitmq消息编码,鲜花监控
4.用了服务器酱进行微信推送(得到一个扩展微信就会响一次)
优化了检测逻辑,加入了去重处理后,现在既扫描的慢且推动的消息也变少了
经过缩短对src的扫描后,成功还是挺多的(很多都归功于爬虫)
渗透开发-XSS扫描器相关推荐
- Python开发Web扫描器实战
今天继续给大家介绍渗透测试相关知识,本文主要内容是Python开发Web扫描器实战. 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调: ...
- 渗透工具开发——XSS平台的命令行实现
前言 [网安学习资料] 通过XSS平台,能够便于对XSS漏洞进行测试,获得重要信息.目前,可供使用的在线XSS平台有很多,也可以尝试自己搭建XSS平台. 但是,如果测试目标无法出网,我们就需要在内网搭 ...
- 如何进行渗透测试XSS跨站攻击检测
国庆假期结束,这一节准备XSS跨站攻击渗透测试中的利用点,上一节讲了SQL注入攻击的详细流程,很多朋友想要咨询具体在跨站攻击上是如何实现和利用的,那么我们Sinesafe渗透测试工程师为大家详细的讲讲 ...
- 渗透测试之XSS(跨站脚本攻击)
文章目录 XSS 漏洞概述 XSS 分类 XSS 危害 XSS 漏洞的验证 XSS 的构造 XSS 的变形(绕过方式) Shellcode 的调用 远程调用JS windows.location.ha ...
- 渗透测试之XSS脚本
一.XSS脚本的特点 1.XSS最大的特点就是能注入恶意的代码到用户流浪器的网页上, 从而达到劫持用户会话的目的. 2.跨站脚本 是一种经常出现在web应用程序中的计算机安全漏洞,是由于web应用程序 ...
- 渗透知识-XSS跨站脚本攻击
XSS跨站脚本攻击:两种情况.一种通过外部输入然后直接在浏览器端触发,即反射型XSS:还有一种则是先把利用代码保存在数据库或文件中,当web程序读取利用代码并输出在页面上时触发漏洞,即存储型XSS.D ...
- 怎样利用超图客户端打点_渗透测试——XSS利用工具BeEF攻击演示
跨站脚本漏洞(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私.钓鱼欺骗.窃取密码.传播恶意代码等攻击.XSS攻击使用到的技术主要为HTML和Javasc ...
- 网络安全与渗透:xss 跨站脚本攻击(十二)此生无悔入华夏,男儿何不带吴钩
中华人民共和国网络安全法 阅读本文前,请熟读并遵守中华人民共和国网络安全法: http://gkhy.jiujiang.gov.cn/zwgk_228/jc/zcwj/202006/P02020061 ...
- 渗透测试-xss安全防御之href输出和js输出
xss安全防御之href输出和js输出 文章目录 xss安全防御之href输出和js输出 1. xss之href输出 2. xss之js输出 总结 1. xss之href输出 进行xss之href输出 ...
- 渗透测试-XSS漏洞检测
防护绕过 关于XSS漏洞的基础理解,请访问另一篇博文:https://blog.csdn.net/weixin_39190897/article/details/86005088. xss漏洞很容易被 ...
最新文章
- 替换元素和非替换元素的学习
- android litehttp jar,灵活而智能的HTTP框架 LiteHttp
- c++自定义的数据库类
- Hexo+github搭建个人博客-博客初始化篇
- Javascript 面向对象中的构造函数和原型对象
- linux 彻底定制指南,8.3. Linux-2.6.11.12 《Linux 彻底定制指南》[翻译:金步国]...
- atitit.标准时间格式 互相转换 秒数 最佳实践
- 智慧工厂智能制造供应链解决方案
- 从技术走向管理——李元芳履职记
- uniapp数组已经更新到data页面不实时渲染问题
- 可视化导论 - 第三章 数据- 学习笔记
- 手机软件开发入门 [转]
- HDU4598 Difference(差分约束)
- 如何在idea中使用Mysql
- 百度的智能对话定制与服务平台UNIT,图形化对话流管理(复杂对话)
- Involution论文解读:从卷积变换出的神经网络新算子
- 服务器错误500-内部服务器错误。您查找的资源存在问题,因而无法显示。
- 朴素贝叶斯模型简单理解
- Excel 重复格式检验高亮为空不展示,15位不生效问题,手机号格式
- 渗透测试国内外研究_浅析晶硅光伏背板阻隔性能测试(一)——水蒸气透过率测试...
热门文章
- 软件开发通识之二:如何从零开始学编程
- 商城管理系统源码 商城APP源码 电子商城源码
- 欧姆龙CP-X显示 END重复 以及 条 0 -重叠条
- html5 css3 javascript从入门到精通,HTML5+CSS3+JavaScript从入门到精通(微课精编版)
- linux 16.04系统下载,【ubuntu16.04】ubuntu(乌班图系统)镜像文件下载 v16.04 稳定版本-七喜软件园...
- php导出excel出现乱码,php导出excel出现乱码怎么办
- win10商店下载位置_Windows10应用商店程序下载目录在哪 怎样查看win10系统应用商店程序下载目录...
- keras python3.7_主页 - Keras 中文文档
- visio2016为图形添加和删除连接点
- 145分计算机考研408复习复盘