相对于客户端,运行着 web 程序的服务器由于其拥有丰富的资源、对外公开的特性和复杂的业务逻辑对于黑客来说往往拥有更大的吸引力和攻破的可能性。
对于xss这一个漏洞十分感兴趣,或者出于各种各样的目的需要深入学习,其实绝大多数网络上博客、包括一些开源的工具,时效性较差,给初学者带来很多困扰和不必要的坑。 我仅以xss这个漏洞的名称来举例:本身这个漏洞的名字叫 corss site scripting 简写为 css ,但是之所以叫xss是因为css与web浏览器中解析的层叠样式表(css)重名,故取名xss。然而,cross site scripting 直译过来叫做跨站脚本攻击,其实这个名字本身也存在误导性。如今的web前端开发者应该都清楚,在现代浏览器的同源策略保护下,浏览器中的跨域行为受到了限制,并且其实从xss这个漏洞的攻击原理上讲,“跨站”这两个字其实真的没有什么必要。
请点击此处输入图片描述
跨站脚本攻击(XSS)
原理:
服务器没有对用户的输入做到充足的过滤,导致页面被嵌入恶意脚本
分类:
-
反射型:只能通过用户点击恶意构造的链接才能触发攻击
-
存储型:恶意代码保存在服务器,只要有人访问该页面就会触发攻击
效果:
-
通过获取用户的 cookie ,实现会话劫持
-
通过在页面伪造表单,获取用户的账号密码
-
XSS 蠕虫
实现方式:
在可提交的输入框中构造输入,有时需要闭合引号,中括号等,有时需要对输入进行 编码 以绕过 WAF 。
一般情况下,手动查找 XSS 注入点通常需要结合查看网页的源代码,找到自己的输入出现在了页面的哪个地方,然后根据该点附近的上下文构造恶意代码,比如,一个用 php 编写的页面为:
<? php $input = $_GET["param"]; echo "<div>".$input."</div>"; ?>
在正常情况下,用户的请求会在页面中显示出来。但是如果提供给 param 的参数是一段 HTML 代码,那么浏览器就会将它当做代码解析执行
值得注意的地方:
-
有时 web 程序会用 转义字符 的方式转义特殊字符,然而,如果数据库使用的编码方式与 web 程序不同时,特别是数据库使用的是双字节 字符编码 ,而负责过滤的 web 程序使用的是单字节字符编码,可能会导致过滤失败。例如,数据库使用了 GBK 编码,而 web 应用使用的是 ASCII 编码,当用户输入 0xbf27 时,由于 27 是 单引号 ‘,web 程序会将其转义,变成 0xbf5c27,但是在数据库中,由于使用的是 GBK 编码,会将 bf5c 认为是一个字符,从而再次暴露了单引号 ‘
-
HTTP 参数污染有时可以绕过 WAF 的过滤
跨站请求伪造( CSRF )
原理:
由于
简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的
——维基百科
用户访问完某个网站之后,浏览器会在一定时间内保存这个网站产生的 cookie,如果在这个 cookie 的有效期内,攻击者可以利用浏览器再次访问网站时会自动带上 cookie 的特性伪造请求,实现了 CSRF
效果:
可以执行任意在用户的权限内的操作
实现方式:
在可跨域的标签如img、iframe中构造恶意 url,或构造使用 post 方法的表单并诱导用户访问该页面,即可实现攻击
总结针对 web 程序的攻击方式,这些方式造成的后果不一,小到会话劫持,大到直接拿到服务器的管理员权限,这完全取决于 web 程序的安全设置,但从根本上来说,这些安全问题都是可以彻底避免的。
经测试,发现 User ID 的输入框中存在反射型的 XSS 漏洞,在该输入框中构造输入:test” onmouseover=prompt(100) bad=’,点击 Go 提交该输入后,在返回的页面中已被嵌入了恶意代码,当鼠标移动到 User ID 上后,会弹出一个提示框
请点击此处输入图片描述
XSS 后的页面
查看网页的源代码,可以发现 User ID 这个输入框确实被我们的输入控制了
XSS 后的页面和正常页面的源码比较
请点击此处输入图片描述
值得注意的地方
-
如果在前端过滤用户输入的话,可以使用 Burp Suite 等工具绕过过滤
-
设置 HttpOnly 可以禁止客户端的脚本访问 cookie,但是依然可以通过抓包的方式获取到 cookie
SQL 注入
原理:
服务器没有对用户的输入做到充分的过滤,导致可执行任意 SQL 语句
效果:
-
如果当前用户具有对数据库的读权限,导致数据库信息泄露
-
如果当前用户具有对数据库的读写权限,可对数据库进行任意修改
-
如果当前用户具有对数据库的管理员权限,可对数据库的用户及数据库进行任意操作
对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做Fuzzing;同样是Fuzzing,有些人挖洞比较高效,有些人却不那么容易挖出漏洞,除了掌握的技术之外,比如编码的绕过处理等,还包含一些技巧性的东西,掌握一些技巧和规律,可以使得挖洞会更加从容。