Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
mst-sec-lecture-notes
提交
df5cdd80
M
mst-sec-lecture-notes
项目概览
OpenDocCN
/
mst-sec-lecture-notes
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mst-sec-lecture-notes
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
df5cdd80
编写于
12月 20, 2016
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
xss
上级
3ef0c0b5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
131 addition
and
0 deletion
+131
-0
漏洞篇 XSS.md
漏洞篇 XSS.md
+131
-0
未找到文件。
漏洞篇 XSS.md
0 → 100644
浏览文件 @
df5cdd80
# 米斯特白帽培训讲义 漏洞篇 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录