扫描器历险记2-利用html解析+ATS语法树检测XSS

admin 2024年11月15日16:21:48评论8 views字数 2231阅读7分26秒阅读模式

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. ifself.startTag orself.att:

  3. returnNone

  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. defParserAtt(self, tag, attr):

  2. ifself.att:

  3. returnTrue

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

  5. self.att =True

  6. returnTrue

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

  8. self.att =True

  9. returnTrue

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

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

  12. self.att =True

  13. returnTrue

  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. defParserJs(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. return1

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

  9. return2

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

  11. return2

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

  13. return1

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

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

  16. return1

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

  18. return2

  19. return3

原文始发于微信公众号(我真不是红队啊):扫描器历险记2-利用html解析+ATS语法树检测XSS

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月15日16:21:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   扫描器历险记2-利用html解析+ATS语法树检测XSShttps://cn-sec.com/archives/1625940.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息