AWVS作为非常强大的web漏洞扫描器,相信大家都不陌生。然而,AWVS必须运行在windows环境,对Linux用户来说,多了一层使用虚拟机的麻烦。鉴于此,我们对AWVS进行了一些简单分析, 并试着对其中几个插件进行了Python化。 在这个过程中, 可以更好地认识到AWVS的优势与不足。
关于如何编写AWVS插件,以及每个目录下插件的作用, 《编写自己的Acunetix WVS漏洞脚本》一文中已有介绍
Network:此目录下的脚本文件是当扫描器完成了端口扫描模块后执行,这些脚本可以检测TCP端口的开放情况,比如检测FTP的21端口是否开放、是否允许匿名登录;
PerFile:此目录下的脚本是当扫描器爬虫爬到文件后执行,比如你可以检查当前测试文件是否存在备份文件,当前测试文件的内容等;
PerFolder:此目录下的脚本是当扫描器爬虫爬行到目录后执行,比如你可以检测当前测试目录是否存在列目录漏洞等;
PerScheme:此目录下的脚本会对每个URL的 GET、POST结构的参数进行检测,AWVS定义了的参数包括HTTP头、Cookies、GET/POST参数、文件上传(multipart/form-data)……比如你可以检测XSS、SQL注入和其他的应用程序测试;
PerServer:此目录下的脚本只在扫描开始是执行一次,比如你可以检测Web服务器中间件类型;
PostScan:此目录下的脚本只在扫描结束后执行一次,比如你可以检测存储型XSS、存储型SQL注入、存储型文件包含、存储型目录遍历、存储型代码执行、存储型文件篡改、存储型php代码执行等;
XML:漏洞的详细描述文档都在这里。
首先是文件夹, 存放的都是不同类型的漏洞的详情介绍与修复方式, 相信使用过的小伙伴都在右侧的漏洞详情见过, 这里不再做分析;
其次是文件夹, 这里存放的是对 *** 端口进行的一些漏洞检测与信息发现,比如其中的看名称也知道这是对域传送漏洞的检测, 其他还有ftp匿名登录等, 因为这系列的文章是从插件分析到 *** 扫描, 所以不再对这一部分进行详细介绍. 不过这里可以推荐看一下系列相关的script, 毕竟每个公司可能都会开一些 *** 端口, 而且这一系列的漏洞在wooyun中也有介绍.
再就是文件夹, 包括与等, 还有, 这时对XSS进行了一个检测,稍后我们会对这里进行分析
文件夹,包括与等,还有这种检测SQL注入的. 同样,我们也会对注入进行一个检测
文件夹将是重点关注的内容,同quote中的内容一样, 这里包括常用的漏洞包括XSS/SQLI/XXE/SSRF等
再接下来是文件夹: 是对不同中间件的检测如是对apache *** 检测, 还包括,等不同中间件的检测, 有兴趣的可以看一下, 包括也提供了一个检测插件
这个,讲实话没有细看..就不过多叙述误导大家了;
文件夹, 只有几个插件大家可以看一下名称: , , , , , 这随随便便拎出来一个就是高危呀同志们;
最后一个是对一些常见的CMS如, , 进行漏洞检测;
本次分析了以下插件的实现思路
Blind_Sql_Injection.script
classSqlInjection.inc
classCRLFInjection.inc
classXSS.inc
Code_Execute.script
XXE_Folder.script
Server_Side_Request_Forgery.script
为了更好的理解AWVS的插件, 需要首先理解它的几个类:, , 还有一个变量,前三个类看类名也比较好理解, 分别是处理URL, Report和HTTP请求的类,但是不太理解..目前也查不到相关的资料,如果有知道的小伙伴请联系我. 这些虽然和插件的流程无关,但是对于我们规划自己的工具还是很有帮助的.
经过对几个插件的分析, 发现一般都有这么几个函数: 作为入口,类似于python中的函数, 但是有的插件并没有这一个; 函数, 作为加载文件与的函数, 可以不用太再意, 函数, 的实例实现
闲言少叙, 开始分析之一个插件,我们先从开始
在中, AWVS定义了三种document_type类型: html, xml, invalid, 而所有非与类型的都被定义为了 invalid. 同时还定义一个类类,用于在非浏览器如等模型下找到XSS, 举例来说:
var inputValue = prefix + script_start_tag + script_payload + "(" + rndStr + ")" + script_end_tag;
....
var hq = new THTMLQuery(this.lastJob.response.body);
if (hq.executeHtmlQuery("tag=script|textwithin=" + script_payload + "(" + rndStr + ")")
|| hq.executeHtmlQuery("tag=script|textwithin=" + script_payload + "('" + rndStr + "')")
|| hq.executeHtmlQuery('tag=script|textwithin=' + script_payload +' ("' + rndStr + '")'))
{
this.alert(inputValue);
return false;
}
可以看到, 在为,即时, 使用这种来确定传入的值是否生成了标签而非, 但是这个类的实现未曾找到其定义所在的文件. 不过我们可以使用类来实现,如上边的类js代码可以转换为下边的python代码
from bs4 import BeautifulSoup as bsdef htmlquery(html, tag, payload):
b = bs(html, 'html.parser')
scripts = b.findAll(tag)
for s in scripts:
if payload in s:
return True
return False
在中, AWVS用了很多种类型的payload, 我把其中的函数过滤了一下, 对于某个函数想了解的可以更进一步参考
classXSS.prototype.testPartialUserControllableScriptSrc
classXSS.prototype.testSimpleScriptTagInjection
classXSS.prototype.testSimpleScriptTagInjectionWithoutEncoding
classXSS.prototype.testISINDEX
classXSS.prototype.testScriptTagInjectionAgainstStringReplace
classXSS.prototype.testScriptTagVariantInjection
classXSS.prototype.testScriptTagSrcInjection
这里特别提一下这个函数, 这是服务器模板注入的一种, 在Python或者jsp中的作用不仅仅是, 在AWVS中, 测试SSTI的payload是: 同时对于的值在返回的body中做检测, 这也可以成功日后检测的一项. 更多的内容可以参考的官方博客介绍:Server-Side Template Injection解锁更多姿势.
所以, 对于AWVS如何检测反射XSS,目前已经有了一个直接的理解:
提取参数,
遍历参数并追加输入不同类型的payload,
判断返回的类型
使用 类来搜索对应的payload是否生成了相应的标签与内容
返回alert报告
但是对于每一种类型的payload都写一个函数实在是太累了, 如果想简单的使用的话,可以试试以下两种姿势:
建立一个, 每一种payload的原始代码作为, 其不同的变种作为 , 使用value作为payload请求,在返回的响应中检测, 简单粗暴。
使用这种headless浏览器,加载返回的响应内容,查看是否有alert自己的randStr。
在中, 检测的是最常见的报错注入. 同样的, 入口函数是, 然后对于不同类型的进行检测与验证. 由下边的代码可以看到:
// AcuSensor is NOT enabled
if (!this.testForError()) continue;
// single quote + double quote
if (!this.testInjection("1'"", new Array("", "'", '"'))) continue;
// backslash
if (!this.testInjection("\")) continue;
// single quote + double quote (unicode)
if (!this.testInjection("1\x00\xc0\xa7\xc0\xa2")) continue;
// scalar/variable
if (!this.testInjection('@@' + randStr(5))) continue;
// single + double quote (base64 encoded)
if (!this.testInjection('JyI=')) continue;
// GBK/Big5 encoding
if (!this.testInjection('\xbf\'\xbf"')) continue;
// utf8_decode
if (!this.testInjection('\xF0\x27\x27\xF0\x22\x22')) continue;
// conversion (ASP)
if (!this.testInjection('(select convert(int,CHAR(65)))')) continue;
首先, 用来检测原始请求中是否有出现的报错信息,如果有,进行下一个参数的检测,否则,分别使用不同的payload来进行报错注入的检测. 需要注意的是, 仅在使用payload:的时候,需要第二个参数来重复验证.
接着看一下testeInjection函数, 其流程如下:
检测是否在返回值中存在匹配的errormessage, 如果不存在, 则continue
如果存在, 并且有confirm value,即函数的第二个参数, 分别使用mysql,mssql的报错语句进行复测
var matchedText = this.errorMessages.searchOnText(job.response.toString()); if (matchedText) {
...
var markerPlain = '4Cu'+randStr(8);
var markerEncodedMSSQL = encodeStringAsChar(markerPlain, '+');
var markerEncodedMYSQL = encodeStringAsChar(markerPlain, ',');
for (var i=0;i
本文导读目录: 1、假消息和黑客同时“袭击”美国战疫中枢,美国究竟得罪了谁? 2、给我介绍一下世界各国的有名黑客事迹 3、著名的黑客事件都有哪些 4、历史上最著名的几次黑客事件 5、2...
中新网重庆11月15日电 题:“汉语桥”全球总冠军戴庐可与中国的“不解之缘” 中新网记者 钟旖 仅三年时间,22岁的比利时青年戴庐可已来往中国8次。他既爱中国的山水田园,也热衷寻访各地...
长安街沿线10处立体花坛展现中国辉煌成就 新华社北京10月2日电(记者魏梦佳)每年国庆节,天安门广场及长安街沿线绚丽的立体花坛,都是北京市民及游客关注及拍摄的对象。今年,长安街沿线建国门至复...
南昌找黑客帮忙办事相关问题 秦风和女黑客相关问题 黑客能干什么行业 西苑医院被黑客攻击(中医科学院西苑医院) 黑...
尽管说如今启用微信小程序早已变成了日常,可是因为本人开发设计小程序還是沒有完全健全,因此 依然存有着一些局限,而这种作用在本人小程序之中是没有办法完成的。 第一个作用便是有关微信付款的插口,尽管说...
月见黑是什么 1、月见黑是一个网络用语,源自日本,原意是指每个月的 15 号,因为在日本旧历中,每个月的 15 号被称为月见,而黑在日语中有日子的意思。2、月见黑是阴阳师中的头像框,玩家达成非洲·阴阳...