reflected_xss检测工具的介绍

1.反射型xss的介绍

xss代码出现在URL中,浏览器访问这个url后,服务端响应的内容中包含有这段xss代码,这样的xss被称作反射型xss.

[[111592]]

2.工具的介绍

reflected_xss工具目前可以用来检测网站中是否可能存在反射型xss,程序是用python写的.

我用的python版本是2.7.3,系统上需要有python的requests模块.

工具有四个文件

spider.py用来爬取网页中的符合规则的url,可以指定爬取深度,然后生成一个urllist文件

reflect_xss.py检测urllist文件中的每一个url是否可能存在反射型xss漏洞

filter.py中的函数会被spider.py调用,过滤掉一些不带参数的url和重复的url.

config文件中,目前只有两个选项:timeout和sleep.

timeout是请求最多等待响应的时间.发送响应时,超过timout秒后就当作请求超时了.

sleep是每次请求url的间隔时间,因为有的网站会限制ip访问速度.

3.工具工作的流程

spider.py接受一个url参数,根据这个url发送请求,接收到响应后,把响应中符合规则的url提取出来,保存到urllist文件中.如果有指定爬取深度的话,会递归的爬取规则的url.这个规则是用正则写的,目前的规则是爬取到的url都应该是一个网站下的,并且url必须是带参数了的.

比如,spider.py “http://127.0.0.1/test.php?x=1″ 能够保存的url都是以http://127.0.0.1开头的,并且url中有一个?号.

reflect_xss.py会检查urllist文件中的每一个url是否存在反射型xss.检测流程是:分析每一个url的参数,将”参数”挨个替换成”参数+xss payload”,然后发送出去,分析响应的内容中是否有xss payload字符串.其中的xss payload可以自定义,keywords文件中的每一行都会被当作一个xss payload.可以向keywords文件添加或删除xss payload.

4.工具用法演示

先来大致看下当前目录下的文件吧

再来看看我用来在本机测试的两个文件吧.

只有http://127.0.0.1/rxss.php?a=1&x=2这个url是符合规则的,所以一会儿爬虫爬完了,urllist中应该只有这一条url.

spider.py就是我们的小爬虫.

直接运行spider.py可以看到用法.

爬虫爬完了,生成了一个urllist文件,文件中只有一条url,一会儿就来检测这条url是否可能存在反射型xss缺陷

这个url参数最好还是要带上双引号,就跟用sqlmap的时候一样.

reflect_xss.py就是用来检测的.

直接python reflect_xss.py 运行程序就可以检测了.

如果有发现可能存在反射型xss,会在当前目录下生成一个Found文件,文件记录了有缺陷的url.

检测的时候,如果发生了异常,会被记录到当前目录下的error.log日志文件.这里没什么异常,所以没有记录.这个日志文件记录的比较简洁明了,我就不多做介绍了.

我的邮箱是:[email protected] 欢迎交流

下载地址:http://vdisk.weibo.com/lc/3GawHF1w1aTxKu2BJjr 密码:CMB6

核心代码:

spider.py:

  1. #!/usr/bin/env python  
  2. #coding=utf-8  
  3. import requests  
  4. import re  
  5. import string  
  6. import sys  
  7. import filter  
  8. headers={'Connection':'keep-alive',"User-Agent":"Mozilla/5.0 (X11; Linux i686) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36","Origin":"http://www.oschina.net",'Accept-Encoding':'gzip,deflate,sdch','Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4','X-Requested-With':'XMLHttpRequest','Accept':'application/json,text/javascript,*/*;q=0.01'}  
  9. def saveurl(urlset):  
  10. try:  
  11. f=open("urllist","a")  
  12. for url in urlset:  
  13. #unicode字符码写入文件,添加换行  
  14. f.write(url.encode('UTF-8')+"n")  
  15. #except:  
  16. #    print "Failed to write urllist to file!"  
  17. finally:  
  18. f.close()  
  19. def main(requestsurl,depth):  
  20. try:  
  21. #print "%d"%depth  
  22. depth=depth+1 
  23. urlset=parseContent(requests.get(requestsurl,timeout=2,headers=headers).text)  
  24. saveurl(urlset)  
  25. if depth==string.atoi(sys.argv[2]):  
  26. pass 
  27. else:  
  28. for u in urlset:  
  29. main(u,depth)  
  30. except:  
  31. pass 
  32. def parseContent(content):  
  33. strlist = re.split('"',content)  
  34. urlset = set([])  
  35. for strstr in strlist:  
  36. #python正则匹配时,需要\\表示  
  37. #if re.match('http://.*com(/|w)+', str):  
  38. #这个正则有点简单,只匹配了当前网站  
  39. #if re.match('http://'+domain, str):  
  40. rules="http://"+domain+"[^,^ ^  ^']*" 
  41. #strstr是unicode对象  
  42. result=re.compile(rules).findall(strstr.encode("utf-8"))  
  43. #result是一个数组  
  44. if len(result)==0:  
  45. pass 
  46. else:  
  47. for i in result:  
  48. urlset.add(i)  
  49. return list(urlset)  
  50. if __name__=="__main__":  
  51. if len(sys.argv)!=3:  
  52. print "usage:"+sys.argv[0]+" http://test.com/"+" depth" 
  53. print "example:"+sys.argv[0]+' "http://127.0.0.1/a.php?c=1"'+" 3" 
  54. else:  
  55. domain=sys.argv[1].split('/')[2]  
  56. #保存最开始的url  
  57. tmp=[]  
  58. tmp.insert(0,sys.argv[1]);  
  59. saveurl(tmp)  
  60. #开始抓取  
  61. main(sys.argv[1],0)  
  62. filter.filter() 

reflect_xss.py

  1. #!/usr/bin/env python  
  2. #coding=utf-8  
  3. import requests  
  4. import sys  
  5. import time  
  6. import re  
  7. #global payloads  
  8. #payloads=['"><sCript>alert(1)</sCript>','<img src=@ onerror=x>']  
  9. jindu=0 
  10. def readconf(keyname):  
  11. isFound=0 
  12. try:  
  13. f=open("config","r")  
  14. lines=f.readlines()  
  15. for line in lines:  
  16. if line.startswith(keyname):  
  17. isFound=1 
  18. return line.split('=')[1]  
  19. if isFound==0:  
  20. errorlog("Warn:Can not to read key "+keyname+" from configure file")  
  21. return False 
  22. except:  
  23. errorlog("Warn:can not to read configure file ")  
  24. return False 
  25. def errorlog(str):  
  26. str=str+"n" 
  27. t=time.strftime('%m-%d %H.%M.%S--->',time.localtime(time.time()))  
  28. f=open("error.log","a")  
  29. f.write(t+str)  
  30. f.close()  
  31. def findlog(url):  
  32. try:  
  33. f=open("Found","a")  
  34. f.write(url+"n")  
  35. except:  
  36. errorlog("Fail:open 'Found' file")  
  37. finally:  
  38. f.close()  
  39. def main(payload,canshu,checkurl):  
  40. global jindu  
  41. url=checkurl.replace(canshu,canshu+payload)  
  42. #print "checking: "+url  
  43. #TODO timeout,防止ip被屏蔽应该有  
  44. if readconf("sleep"):  
  45. time.sleep(float(readconf("sleep")))  
  46. #可能有Timeout异常  
  47. try:  
  48. a=requests.get(url,timeout=1)  
  49. if a.text.find(payload)!=-1:  
  50. #print "Find!!!!"  
  51. #print url  
  52. #print "-----------------------"  
  53. findlog(url)  
  54. else:  
  55. if jindu%10==0:  
  56. print time.strftime('%H:%M.%S->',time.localtime(time.time()))+"checking the "+str(jindu)+"th"+" url:"+url  
  57. except:  
  58. errorlog("Fail:request.get "+url)  
  59. jindu=jindu+1 
  60. def parse(url):  
  61. #url=http://test.com/test.php?a=1&b=2&c=3  
  62. #canshus=["a=1","c=3"]  
  63. #有可能url是http://test.com这种,没有参数  
  64. #这种情况,返回一个空对象  
  65. try:  
  66. canshus=url.split("?")[1].split("&")  
  67. return canshus  
  68. except:  
  69. kong=[]  
  70. return kong  
  71. pass 
  72. def readfile(filename):  
  73. #这个global的位置放在上面效果就不一样,不懂为什么  
  74. #global payloads  
  75. try:  
  76. aa=open(filename,"r")  
  77. f=aa.readlines();  
  78. for i in range(0,len(f)):  
  79. #过滤掉n  
  80. f[i]=f[i].rstrip("n")  
  81. return f  
  82. except:  
  83. print "Failed to access "+'"'+filename+'" '"file!" 
  84. finally:  
  85. aa.close()  
  86. if __name__=="__main__":  
  87. if len(sys.argv)!=1:  
  88. print 'usage:'+sys.argv[0]+" url depth" 
  89. print 'example:'+sys.argv[0]+'"http://url/test.php?x=1&y=2" 3' 
  90. else:  
  91. #global payloads  
  92. payloads=readfile("keywords.txt")  
  93. urls=readfile("urllist")  
  94. for checkurl in urls:  
  95. for payload in payloads:  
  96. for canshu in parse(checkurl):  
  97. if len(canshu)!=0:  
  98. main(payload,canshu,checkurl) 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/131560.html<

(0)
管理的头像管理
上一篇2025-02-26 14:43
下一篇 2025-02-26 14:44

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注