恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击主要针对的是客户端的攻击。
XSS能实现的的攻击有很多,一般攻击水平是取决于攻击者的js水平。
针对用户:窃取cookie劫持会话、网络钓鱼、放马挖矿、广告刷流量等。
针对WEB服务:劫持后台、篡改页面、传播蠕虫、内网扫描等。
反射型
又被称为非持久型XSS,将JS恶意代码暂时保存到网页前端,一旦重新请求页面,恶意代码会被消除,一般用于XSS注入点的盲测或者钓鱼。
存储型
存储型XSS,又称持久型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库或文件中。允许用户存储数据的WEB应用程序都可能出现存储型漏洞,当攻击者提交一段XSS代码后,被服务器接受被储存,当访问者再次访问此网站,这段代码又被提取出来,响应给浏览器。形成储存型XSS漏洞攻击。
DOM型
全称Document Object Model,在网站页面中有许多页面的元素,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。简单来说DOM是通过url传入参数来触发XSS的,也可以认为是反射型的一种。
1.基本的xss
以DVWA(Reflected)的low等级举例(完全没有过滤的情况下)。
2.大小写绕过、字符拼接
以DVWA(Reflected)的middle等级举例。
源码:
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '
大小写绕过:
3.解锁更多姿势
接下来以DVWA(Reflected)的high等级,来举例多种绕过过滤的方式。
先看一下high安全等级的源码
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "Hello ${name}
";
}
?>
他用了 preg_replace函数,用正则表达式几乎完美地将标签过滤掉了。
##既然谈到正则表达式,就顺便简单讲一下它里面这个表达式的含义吧。
/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i
/ 表示正则表达式的分解符
< 表示左尖括号
. 表示匹配除了换行符/n之外的任意字符
* 表示贪婪匹配,.*就是匹配任意字符的任意个数
i 在/之外,是修饰符表示不区分大小写
//更多关于正则表达式的知识可以参考:https://www.runoob.com/regexp/regexp-syntax.html
只要不用到标签,其实还有特别多标签也可以实现XSS。
以下语句是多种绕过姿势:
##当 input 输入框获取焦点时执行一段 Javascript代码
##当用户离开input输入框时执行一段Javascript代码
##通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发。(容易造成死循环)
一个内联框架被用来在当前 HTML文档中嵌入另一个文档,onload 事件在frame或者iframe载入完成后被触发。
##onscroll 事件在元素滚动条在滚动时触发。
##利用link远程包含js文件
利用javascript伪协议(常用于钓鱼):
不要点我
4.转义字符的排查
在测试xss的位置写入以下字符,查看页面源码,观察哪些代码被过滤或者转义。
jaVasCript: /*-/*/*\/*'/*"/**/ ( /* */ oNcliCk=alert() ) //%0D%0A%0d%0a//\x3csVg/\x3e
用/代替空格
双写关键字、大小写、字符拼接、其它字符混淆、编码绕过
如果是html标签中,可以不用引号。如果是在js中,可以用反引号代替单双引号。或者用编码绕过
``
老师说,在实际渗透中建议不用alert(),用console_log(),查看控制台是否有回显,应尽量减小对所受测试网站的影响。