– 自动刷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扫描器相关推荐

  1. Python开发Web扫描器实战

    今天继续给大家介绍渗透测试相关知识,本文主要内容是Python开发Web扫描器实战. 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调: ...

  2. 渗透工具开发——XSS平台的命令行实现

    前言 [网安学习资料] 通过XSS平台,能够便于对XSS漏洞进行测试,获得重要信息.目前,可供使用的在线XSS平台有很多,也可以尝试自己搭建XSS平台. 但是,如果测试目标无法出网,我们就需要在内网搭 ...

  3. 如何进行渗透测试XSS跨站攻击检测

    国庆假期结束,这一节准备XSS跨站攻击渗透测试中的利用点,上一节讲了SQL注入攻击的详细流程,很多朋友想要咨询具体在跨站攻击上是如何实现和利用的,那么我们Sinesafe渗透测试工程师为大家详细的讲讲 ...

  4. 渗透测试之XSS(跨站脚本攻击)

    文章目录 XSS 漏洞概述 XSS 分类 XSS 危害 XSS 漏洞的验证 XSS 的构造 XSS 的变形(绕过方式) Shellcode 的调用 远程调用JS windows.location.ha ...

  5. 渗透测试之XSS脚本

    一.XSS脚本的特点 1.XSS最大的特点就是能注入恶意的代码到用户流浪器的网页上, 从而达到劫持用户会话的目的. 2.跨站脚本 是一种经常出现在web应用程序中的计算机安全漏洞,是由于web应用程序 ...

  6. 渗透知识-XSS跨站脚本攻击

    XSS跨站脚本攻击:两种情况.一种通过外部输入然后直接在浏览器端触发,即反射型XSS:还有一种则是先把利用代码保存在数据库或文件中,当web程序读取利用代码并输出在页面上时触发漏洞,即存储型XSS.D ...

  7. 怎样利用超图客户端打点_渗透测试——XSS利用工具BeEF攻击演示

    跨站脚本漏洞(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私.钓鱼欺骗.窃取密码.传播恶意代码等攻击.XSS攻击使用到的技术主要为HTML和Javasc ...

  8. 网络安全与渗透:xss 跨站脚本攻击(十二)此生无悔入华夏,男儿何不带吴钩

    中华人民共和国网络安全法 阅读本文前,请熟读并遵守中华人民共和国网络安全法: http://gkhy.jiujiang.gov.cn/zwgk_228/jc/zcwj/202006/P02020061 ...

  9. 渗透测试-xss安全防御之href输出和js输出

    xss安全防御之href输出和js输出 文章目录 xss安全防御之href输出和js输出 1. xss之href输出 2. xss之js输出 总结 1. xss之href输出 进行xss之href输出 ...

  10. 渗透测试-XSS漏洞检测

    防护绕过 关于XSS漏洞的基础理解,请访问另一篇博文:https://blog.csdn.net/weixin_39190897/article/details/86005088. xss漏洞很容易被 ...

最新文章

  1. 替换元素和非替换元素的学习
  2. android litehttp jar,灵活而智能的HTTP框架 LiteHttp
  3. c++自定义的数据库类
  4. Hexo+github搭建个人博客-博客初始化篇
  5. Javascript 面向对象中的构造函数和原型对象
  6. linux 彻底定制指南,8.3. Linux-2.6.11.12 《Linux 彻底定制指南》[翻译:金步国]...
  7. atitit.标准时间格式 互相转换 秒数 最佳实践
  8. 智慧工厂智能制造供应链解决方案
  9. 从技术走向管理——李元芳履职记
  10. uniapp数组已经更新到data页面不实时渲染问题
  11. 可视化导论 - 第三章 数据- 学习笔记
  12. 手机软件开发入门 [转]
  13. HDU4598 Difference(差分约束)
  14. 如何在idea中使用Mysql
  15. 百度的智能对话定制与服务平台UNIT,图形化对话流管理(复杂对话)
  16. Involution论文解读:从卷积变换出的神经网络新算子
  17. 服务器错误500-内部服务器错误。您查找的资源存在问题,因而无法显示。
  18. 朴素贝叶斯模型简单理解
  19. Excel 重复格式检验高亮为空不展示,15位不生效问题,手机号格式
  20. 渗透测试国内外研究_浅析晶硅光伏背板阻隔性能测试(一)——水蒸气透过率测试...

热门文章

  1. 软件开发通识之二:如何从零开始学编程
  2. 商城管理系统源码 商城APP源码 电子商城源码
  3. 欧姆龙CP-X显示 END重复 以及 条 0 -重叠条
  4. html5 css3 javascript从入门到精通,HTML5+CSS3+JavaScript从入门到精通(微课精编版)
  5. linux 16.04系统下载,【ubuntu16.04】ubuntu(乌班图系统)镜像文件下载 v16.04 稳定版本-七喜软件园...
  6. php导出excel出现乱码,php导出excel出现乱码怎么办
  7. win10商店下载位置_Windows10应用商店程序下载目录在哪 怎样查看win10系统应用商店程序下载目录...
  8. keras python3.7_主页 - Keras 中文文档
  9. visio2016为图形添加和删除连接点
  10. 145分计算机考研408复习复盘