提交 df5cdd80 编写于 作者: W wizardforcel

xss

上级 3ef0c0b5
# 米斯特白帽培训讲义 漏洞篇 XSS
> 讲师:[gh0stkey](https://www.zhihu.com/people/gh0stkey/answers)
> 整理:[飞龙](https://github.com/)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
## 分类
总共有三种
+ 反射型:经过后端,不经过数据库
+ 存储型:经过后端,经过数据库
+ DOM:不经过后端
## 原理:反射型
将这段代码保存为`xss.php`
```php
\\XSS反射演示
<form action="" method="get">
<input type="text" name="xss"/>
<input type="submit" value="test"/>
</form>
<?php
$xss = @$_GET['xss'];
if($xss!==null){
echo $xss;
}
```
我们看到,这段代码中首先包含一个表单,用于向页面自己发送 GET 请求,带一个名为`xss`的参数。 然后 PHP 会读取该参数,如果不为空,则直接打印出来,我们看到这里不存在任何过滤。也就是说,如果`xss`中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。
我们部署好这个文件,访问`http://localhost/xss.php`,如图:
![](http://ww3.sinaimg.cn/large/841aea59jw1faxil77wmkj20m906y74m.jpg)
我们直接输入一个 HTML 代码,比如`<script>alert(1)</script>`,之后点击`test`
![](http://ww4.sinaimg.cn/large/841aea59jw1faxilg2ftoj213s0nbwfm.jpg)
我们可以看到弹窗,也就是我们输入的 HTML 代码被执行了。
之后我们查看元素,这表明,我们输出的内容直接插入到了页面中,解释为`<script>`标签。
![](http://ww3.sinaimg.cn/large/841aea59jw1faxillhzadj20v906sq3d.jpg)
我们可以自定义弹窗中的内容来利用 XSS,比如改成`alert(document.cookie)`
从上面的例子中,我们可以看出,反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器。
## 原理:存储型
这里我们把`xss.php`内容改为(同时数据库中需要配置相应的表):
```php
\\存储XSS演示
<form action="" method="post">
<input type="text" name="xss"/>
<input type="submit" value="test"/>
</form>
<?php
$xss=@$_POST['xss'];
mysql_connect("localhost","root","root");
mysql_select_db("xss");
if($xss!==null){
$sql="insert into test(id,payload) values('1',$xss)";
$result=mysql_query($sql);
echo $result;
}
```
可以看到,用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。
我们新建`res.php`,内容为:
```php
mysql_connect("localhost","root","root");
mysql_select_db("xss");
$sql="select payload from test where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
echo $row['payload'];
}
```
该代码从数据库读取了之前插入的内容,并将其显示出来。
我们部署之后首先查看`test`数据库,确认它是空的:
![](http://ww2.sinaimg.cn/large/841aea59jw1faxilwsv6bj213x0n9q5c.jpg)
然后访问`xss.php`,像之前一样输入 HTML 代码并点击`test`,如下:
![](http://ww2.sinaimg.cn/large/841aea59jw1faxim219m0j20ma073q3c.jpg)
点击之后却发现没有任何动静,但事实上,我们的数据已经插入到了数据库中。
![](http://ww3.sinaimg.cn/large/841aea59jw1faxim4y27jj20xv0i4gn1.jpg)
那么,当我们访问`res.php`查询这个值的时候,代码就会被执行。
![](http://ww1.sinaimg.cn/large/841aea59jw1faxim9t2myj213z0ndt9u.jpg)
所以说,存储型 XSS 的执行位置通常不同于输入位置。我们可以看出,存储行 XSS 的数据流向是:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
## 利用
米斯特安全团队为大家准备了一个 XSS 利用平台,位于`xss.hi-ourlife.com`。我们可能需要通过 XSS 来获得用户 Cookie 或其他有用信息,利用平台负责接收并保存这些信息。另外,利用平台能够托管利用脚本,于是我们可以向页面只注入一个脚本链接,使长度极大缩短。
我们登录进去之后,查看一下利用说明:
![](http://ww1.sinaimg.cn/large/841aea59jw1faximf8m9uj213m0o0q6c.jpg)
基本意思就是把一段远程`script`标签插入到存在 XSS 漏洞的地方。比如,我们把其中的`<script src="..."></script>`注入到反射型 XSS 的演示页面中。
![](http://ww3.sinaimg.cn/large/841aea59jw1faximjwhluj20m807ht95.jpg)
提交之后页面没什么动静,但是我们查看利用平台,可以发现新增了一条数据:
![](http://ww4.sinaimg.cn/large/841aea59jw1faximnishnj20qs0g5q4k.jpg)
## 附录:
+ [XSS 过滤绕过备忘单](http://cheatsheets.hackdig.com/?4.htm)
+ [HTML5 安全备忘单](https://html5sec.org/)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册