扫描器历险记2-利用html解析+ATS语法树检测XSS
2023-3-24 14:12:52 Author: 我真不是红队啊(查看原文) 阅读量:7 收藏

HTMLParser:

python的HTMLParser解析模块是一个非常强大的HTML解析模块,他提供了回调函数来检测是否存在某个标签或者属性,具体使用方式不再说多,网上有很多:

https://www.cnblogs.com/masako/p/5868367.html

在输入payload后,我们需要考虑到几种情况:

  1. 在属性内容中

  2. 在注释中

  3. 在标签内容中

  4. 在script标签中

  5. 如果在属性中标签是否为a或者ifr这类可以使用伪协议的标签

检测流程:

对于检测流程我是这样设计的,先输入随机字符串,判断是否在返回中出现。如果在返回中出现则调用 Class.feed进行检测出现在哪里。

  1. 出现在data中,则发送 <随机字符串>随机字符串,来判断html页面中是否出现了该标签

  1. url = urlparse(url).scheme + "://" + urlparse(url).netloc + urlparse(

  2. url).path + "?" + utilClass.GetStringParam(query, utilClass.GetPayloadParam(query, RandomString),

  3. "<" + RandomString + ">")

检测代码如下:

  1. def handle_starttag(self, tag: str, attrs) -> None:

  2. if self.startTag or self.att:

  3. return None

  4. if str(tag).lower() == str(self.randomString).lower():

  5. self.startTag = True

  6. for att in attrs:

  7. self.ParserAtt(tag, att)

此时如果页面已经解析了该标签则说明存在漏洞,如果页面没出现该标签则考虑是否是出现在了 scripttitlenosciprttextarea这几类中,分别闭合后在进行检测。

  1. 如果出现在html注释中则直接发送 -->随机字符串判断在data中是否出现,如果出现则进入第一个流程

  2. 判断是否在属性中,需要先判断标签是否为可插入伪协议的标签:

  1. def ParserAtt(self, tag, attr):

  2. if self.att:

  3. return True

  4. if str(tag).lower() == str(self.randomString).lower():

  5. self.att = True

  6. return True

  7. if str(attr[0]).lower() == str(self.randomString).lower():

  8. self.att = True

  9. return True

  10. if str(attr[1]).lower().find(("javascript:" + self.randomString).lower()) == 0 and (

  11. tag == 'a' or tag == 'iframe'):

  12. self.att = True

  13. return True

  14. if tag == 'a' or tag == 'iframe':

  15. if str(attr[1]).find(self.randomString) == 0:

  16. self.attrValue1 = True

  17. else:

  18. if str(attr[1]).find(self.randomString) != -1:

  19. self.attrValue2 = True

如果是的话则直接加入javascript为协议,不是的话则考虑闭合属性,闭合属性后在进行测试是否添加新属性成功,若成功则返回漏洞存在,不成功则直接闭合标签。标签闭合成功后进入第一流程

JavaScript解析树:

可以使用模块 esprima,解析代码如下:

  1. def ParserJs(jscode,payload):

  2. ast = esprima.parseScript(jscode)

  3. for node in ast.body:

  4. if node.type== "VariableDeclaration":

  5. for declaration in node.declarations:

  6. if (declaration.id.name.find(payload) != -1) and (declaration.id.type == "Identifier"):

  7. return 1

  8. elif declaration.id.name.find(payload) != -1 and declaration.id.type == "Literal":

  9. return 2

  10. elif declaration.init.value.find(payload) != -1 and declaration.init.type == "Literal":

  11. return 2

  12. elif declaration.init.value.find(payload) != -1 and declaration.init.type == "Identifier":

  13. return 1

  14. elif node.type == "ExpressionStatement":

  15. if (node.expression.name.find(payload) != -1) and (node.expression.type == "Identifier"):

  16. return 1

  17. elif node.expression.name.find(payload) != -1 and node.expression.type == "Literal":

  18. return 2

  19. return 3


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNjg5ODkxMA==&mid=2247484017&idx=1&sn=9377fce1caf320265f10c5412dbad4f0&chksm=faee7e40cd99f75698f535005e158207ee94f63bbd561a692c9b753a90475965cd7a32b24cca#rd
如有侵权请联系:admin#unsafe.sh