python开发反射型XSS漏洞扫描脚本总结

2012-05-08 252879人围观 ,发现 6 个不明物体 WEB安全文章

感谢shaun投递稿件

还是先啰嗦两句基础,做个题外铺垫!整理一下我的整个思路,循序渐进。嘿嘿~

1、漏洞扫描器的扫描原理

主要就是:信息获取、模拟攻击。

网络漏洞扫描对目标系统进行漏洞检测时,首先探测目标系统的存活主机,对存活主机进行端口扫描,确定系统开放的端口,同时根据协议指纹技术识别出主机的操作系统类型。然后扫描器对开放的端口进行网络服务类型的识别,确定其提供的网络服务。漏洞扫描器根据目标系统的操作系统平台和提供的网络服务,调用漏洞资料库中已知的各种漏洞进行逐一检测,通过对探测响应数据包的分析判断是否存在漏洞。

因此,只要我们认真研究各种漏洞,知道它们的探测特征码和响应特征码就可以利用软件来实现对各种已知漏洞的模拟。

2、模拟漏洞的实现

由于漏洞模拟系统实际上是分析扫描器发出的探测包中的是否含有探测特征码并返回具有相应响应特征码的数据包。因此,对每一个漏洞,探测特征码和响应特征码是两项必需的描述。

采用数据库技术可以方便地向漏洞资料库中添加新发现的漏洞,使漏洞模拟软件能够不断地更新漏洞资料库,可以更加有效地测试扫描器对安全漏洞的检测能力。(我在这里,由于技术原因没有建立数据库而是用文本文件保存的特征码。)

3、信息收集

下面就开始说一下模拟简单的反射型XSS漏洞实现原理,菜鸟上路,大牛千万千万不要拍我,有什么没说到位的地方欢迎指正^ ^,我也多多学习~

反射型XSS:也就是非持久型XSS,又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。

脚本开发思路:首先在程序里面预先配置好网络服务类型、服务端口等,使其在相应的端口进行监听。当建立连接后,发送构造好带有特征码的数据包,然后获取到服务器反馈回来的数据包,再分析接收到的数据包,查找数据包中是否存在漏洞探测特征码,如果存在,则返回含有响应特征码的应答包。如果不存在,则按服务协议进行正常应答。

4、反射型XSS漏洞手工辨别

XSS的触发条件包括:完整无错的脚本标记,访问文件的标记属性和触发事件。大致可以分为:有输入框的页面测试和页面链接参数的测试,原理都是一样的,这里我就拿我用的页面链接参数的测试做说明吧。

http://www.baidu.com/s?tn=**&bs=**&f=** 该链接包含了3个参数,对于这种的测试方法,给参数值替换为特殊字符,

如:

假如我们在某个参数位置提交内容,内容就是某个标记属性所赋的值,我们可以构造如下值来闭和标记来构造完整无错的脚本标记

http://www.baidu.com/s?tn=**&bs=**&f=”><script>alert(‘XSS’);</script><” 结果形成了<A HREF=””><script>alert(‘XSS’);</script> <””>这是一个测试 </A>

IMG标记并不是真正地把图片给加入到html文档把两者合二为一,而是通过src属性赋值。那么浏览器的任务就是解释这个img标记,访问src属性所赋的值中的URL地址并输出图,javascript有一个URL伪协议,可以使用“javascript:”这种协议说明符加上任意的javascript代码,当浏览器装载这样的URL时,便会执行其中的代码.于是我们就得出了一个经典的XSS示例:

<img src=”javascript:alert(‘XSS’);”>

当然并不是所有标记的属性都能用,细心的你应该发现标记的属性在访问文件才触发的XSS,这里我就不再深入,因为离开标记的属性还有事件能帮助我们触发XSS.那什么是事件呢?只有达到某个条件才会引发事件,正巧img标记有一个可以利用的onerror()事件,当img标记内含有一个onerror()事件而正好图片没有正常输出便会触发这个事件,而事件中可以加入任意的脚本代码,其中的代码也会执行.现在我们又得到了另外一个经典的XSS示例:

<img src=” http://xss.jpg” onerror=alert(‘XSS’)>

5、自己遇到的问题

★关于urparse模块的使用

urlparse里面函数分别是

●urlparse()能够轻松地把URL分解成元件,有自己的元组;

●urlunparse()的作用是将URL的组件装配成一个URL,也有自己的元组;

●urljoin(base, url ) 的作用是拼接URL,它以第一个参数作为其基地址,然后与第二个参数中的相对地址相结合组成一个绝对URL地址

可以参看:http:// www.cnblogs.com/huangcong/archive/2011/08/31/2160633.html

其次,urllib和urllib2模块提供更多的功能,这里就不详细说了。

★关于发送HTTP请求

Python中有构造好函数可以直接调用,当然也可以自己封装,在这次学习中,我所搜索到的大致为两种:

      1)  httplib 是 python中http 协议的客户端实现

如:

import  httplib
conn = httplib.HTTPConnection(“www.google.cn” )
conn.request(‘get’ ,  ‘/ index.html’ )
print  conn.getresponse().read()
conn.close()

或者,这种包括更多信息的包,如:

import httplib
conn = httplib.HTTPConnection(“www.g.cn”, 80, False)
conn.request(‘get’, ‘/’, headers = {“Host”: www.google.cn,
“User-Agent”: “Mozilla/5.0 (Windows;U; Windows NT 5.1; zh-CN; rv:1.9.1)Gecko/20090624 Firefox/3.5″,
“Accept”: “text/plain”})
res = conn.getresponse()

2)  自己构造的HTTP包

from socket import *
ADDR = (‘www.baidu.com’, 80)
s = socket(AF_INET, SOCK_STREAM)
s.connect(ADDR)
s.send(‘GET/security/vul.php?xss=1HTTP/1.1\r\nHost:www.baidu.com \r\n\r\n’)
res = s.recv(8192)
print res

★一个细节问题

特别提到我所遇到的一个错误,在GET请求末尾的地方,最开始之写了一个”\r\n”,一直就返回错误400,后来才发现需要double”\r\n”,前面的single”\r\n”是代表一行结束了,double”\r\n”代表消息结尾(啊。。。大致是这样哇~。~)

还有一些小问题,都是初学者犯的,所以也暂时没有整理出来。其他不足的地方随时改进滴~

6、结语

这是自己初次使用python开发脚本,最后也只是一个学习的过程。在这里还是感谢几位帮我解决过程中遇到难题的童鞋们~^ ^

转自taobao qateam

Loading...
css.php