XSS攻击,指黑客利用网站漏洞把恶意的脚本代码(通常包括HTML代码和JS脚本)注入到网页中,当用户浏览网页时,就会执行其中的恶意代码(控制用户浏览器),对受害用户采取Cookie数据窃取、会话劫持、钓鱼欺骗等各种攻击。
它对Web服务器没有直接危害,借助网站进行传播,使网站的用户受到攻击。
攻击者一般通过留言、电子邮件或其他途径向受害用户发送一个恶意的URL,当恶意URL被用户触发时,恶意脚本就会在受害者的计算机上执行。
造成XSS攻击的因素?
Web浏览器的设计不安全,浏览器只执行和解析JS等脚本,不会判断数据和程序代码是否恶意。
输入和输出的交过过程中,没有做好安全防护。
团队协作开发,水平参差不齐,难免存在问题。
意识性不强
触发恶意代码的手段多样,无法做到完全防御
XSS漏洞注入点多样
XSS漏洞的危害
攻击者通过注入如alert(/xss/)之类的JS代码来证明XSS漏洞的存在性,但没有真实地反映其危害性!
网络钓鱼,盗取用户账号。
cookies窃取,伪造身份进行对网站的操作。
劫持用户(浏览器)会话,执行任意操作,如非法转账等。
利用JS弹出广告页面,刷流量。
网页挂马
恶意操作
客户端攻击
获取客户端信息(用户的浏览记录、IP、开放的端口)
控制受害者电脑向其他网站进行攻击
结合其他漏洞,如CSRF漏洞,实施进一步操作。
提升用户权限,渗透网站。
传播跨站脚本蠕虫
反射型XXS(非持久型XSS,一次性):主要用于将恶意脚本附加到URL地址参数中。
攻击者通过特定的手法,比如利用电子邮件,诱使用户去访问一个包含恶意代码的URL,当受害者触发时,恶意JS代码会直接在受害者主机上的浏览器执行。特点是,只在用户触发的时候,执行一次!
流程:
通常出现在网站的搜索栏,用户登入口,用来窃取客户端Cookie或进行钓鱼欺骗。
POC:
<sCr<scrscRiptipt>ipt>OonN'"<>
过滤掉了<sCr<scrscRiptipt>OonN'"<>
DVWA
low:
过滤掉了<sCr<scrscRiptipt>,其他没有过滤!
源码:
构造:
<inputonfocus=alert(/xss/)autofocus>
成功:
medium:
源码:
也只进行了<script>过滤,替换了成空!攻击手段同low一样!
<inputonfocus=alert(/xss/)autofocus>
high:
impossible:
结论:
使用php中的htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,
防止浏览器将其作为HTML元素!
存储型XSS:也叫持久型跨站脚本,攻击者事先将恶意JS代码上传或存储到漏洞服务器中,只要浏览包含恶意JS代码的页面就会被执行。
持久型XSS一般出现在网站的留言、评论等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当用户浏览该网页时,服务器从数据库中读取恶意用户存入的非法数据,然后显示在页面中,在受害者电脑上的浏览器执行恶意代码。它不需要用户去单击URL进行触发,可以利用它渗透网站,挂马,钓鱼......
利用此XSS还能编写XSS蠕虫,能够在网站中实现病毒的几何数级传播!XSS蠕虫会直接影响网站的所有用户,一个地方出现XSS漏洞,网站下的所有用户都有可能被攻击。
low:
<sCr<scrscRiptipt>ipt>OonN'"<>
<script>alert(/xss/)</script>
medium:
<sc<script>ript>alert(/xss/)</script>
high:
<imgsrc=1onerror=alert(/xss/)>
impossible:
Message: <sCr<scrscRiptipt>ipt>OonN\'\"<>
通过使用htmlspecialchars函数,解决了XSS,但是要注意的是,如果htmlspecialchars函数使用不当,攻击者就可以通过编码的方式绕过函数进行XSS注入,尤其是DOM型的XSS。
DOM型XSS:通过修改页面的DOM节点形成的XSS,并不会将payload上传到服务器,没有与服务器端进行交互,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞
可能触发DOM型XSS的属性
document.referer
window.name
location
innerHTML
documen.write
low:
查看页面源代码:
document属于window 的一个子对象
window.location 包含 href 属性,直接取值赋值时相当于 window.location.href
window.location.href 当前页面完整 URL
document.location 包含 href 属性,直接取值赋值时相当于 document.location.href
document.location.href 当前页面完整 URL
decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码
插入的 java script 代码可以在 decodeURL(lang) 被执行
http://192.168.10.128/DVWA-master/vulnerabilities/xss_d/?default=English<script>alert(/xss/)</script>
meduim:
查看服务器端源码:
array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
header() 函数向客户端发送原始的 HTTP 报头