web安全作业(xss漏洞)
需要掌握的知识
- XSS漏洞(原理、分类、危害、常用的payload)
- XSS平台的搭建与使用
理论作业
1.xss 漏洞原理?
2.XSS的类型?
3.反射型XSS和存储型XSS的区别?
4.XSS的攻击过程?
5.XSS常用的payload构造方法?
1.原理:攻击者在有漏洞的前端页面嵌入恶意代码,导致受害者访问页面时不知情的情况下触发恶意代码,获取受害者关键信息。
其本质上还是对输入输出的过滤限制不严格,导致精心构造的恶意脚本输入后,在前端被当做有效代码并执行。
2.可以分为反射型,存储型,DOM型
3.区别:
反射型xss与服务端交互,一次性,又称非持久型xss
存储型又叫持久型xss,攻击脚本将被永久地放在目标服务器的数据库或文件中,具有很高的隐蔽性
4.xss攻击过程:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
5.常见payload构造方法:
' onclick="alert('xss')"
'><img src="#" onmuouseover="alert('xss')">
"><img src=1 onerror=alert("xss")>
<script>alert(1)</script>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
onclick=alert(1);
实践作业
任务1:完成dvwa的XSS实验
任务2:完成pikachu的(反射型XSS、存储型XSS、DOM型XSS)XSS实验
任务3:找到book网站的XSS漏洞
任务4:xss-labs-master靶场练习
任务一 dvwa的xss实验
low级别xss
Reflected xss
源代码:
可以看到low级别只判断了name参数是否为空,并没有对name参数做任何过滤和检查,存在非常明显的xss漏洞
所以我们输入 <script> alert('goodevenning') </script>,直接执行我们的js代码
Stored xss
源代码:
trim(string,charlist) : 移除string字符两侧的预定义字符,预定义字符包括\t 、 \n 、\x0B 、\r以及空格,可选参数charlist支持添加额外需要删除的字符
stripslashes(string): 去除掉string字符的反斜杠\
mysqli_real_escape_string(string,connection) :函数会对字符串string中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。
GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
可以看出,low级别的代码对我们输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞
我们输入 Twilight 和 <script>alert('sparkle')</script>,可以看到,我们的js代码立即就执行了
DOM xss
源代码:
可见low级别没有任何的保护性措施,页面对default参数没有任何的过滤
所以构造xss代码然后回车访问即可
xss_d/?default=<script>alert('Twilight Sparkle')</script>
medium级别xss
Reflected xss
源代码:
pre元素可定义预格式化的文本。被包围在pre元素中的文本通常会保留空格和换行符,而文本也会呈现为等宽字体。
可以看到该级别的代码只是在low级别上增加了对script的过滤,并没有多大用,可以直接大写绕过,也可以换标签
<SCRIPT>alert('暮光闪闪')</SCRIPT>
然后看网页代码发现,虽然躲过了过滤,但是最后输出的却是小写
Stored xss
源代码:
addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL
strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签
htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素
当我们再次输入1 和 <script>alert('hack')</script>,strip_tags函数把<script>标签给剥除了,addslashes函数把 ' 转义成了 \ '
在操作之前,先去数据库删去之前插入的数据
虽然message参数把xss都给过滤了,但是name参数只过滤了<script>标签,唯一一点就是name参数有长度限制,最大长度为10
所以我们选择抓包
修改经过url编码后的<script>al为%3CSCRIPT%3Ealert('hack')%3C%2FSCRIPT%3E
放包后就可以看到
DOM xss
源代码:
可以看到,medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到的default值。这里还使用了stripos 用于检测default值中是否有 <script> ,如果有的话,则将 default=English 。
很明显,这里过滤了<script> (不区分大小写),那么我们可以使用
<imgsrc=1 onerror=('hack')>
然而没有弹窗,查看网页代码发现确实插入到value,但是没有插入到option标签的值中,所以img没有发挥任何作用
因此要先闭合之前的标签,构造语句:
<option value=' " + lang + " '> " + decodeURI(lang) + " </option>
default=></option><img src=1 onerror=alert("fluttershy")>
结果还是没有执行,因为</option>闭合了option标签,所以img没有插入,只插入了>
于是我们继续构造语句去闭合select标签,这下我们的img标签就是独立的一条语句了
default= ></option></select><img src=1 onerror=alert('fluttershy')>成功插入并弹窗
high级别xss
Reflected xss
源代码:
preg_replace( '/<(.)s(.)c(.)r(.)i(.)p(.)t/i', '', $_GET[ 'name' ] ); 该句使用正则表达式过滤,*代表一个或多个任意字符,i不区分大小写。因此只能使用新标签img,body等标签的事件或者iframe等标签的src注入恶意js代码
输入<img src=1 onerror=alert("Sunset-Shimmer")>
意思是,当图片显示错误时,然后执行 alert('hack') ,这里我们的src=1肯定显示错误啊,所以就执行alert语句。
Stored xss
源代码:
相比medium,只是在name参数处用了正则表达式过滤而已,依然可以抓包修改,不过要用img标签
<img src=1 onerror=alert('rainbow-dash')>
经过URL编码后
%3Cimg%20src%3D1%20%20onerror%3Dalert('rainbow-dash')%3E%20%0A%0A
接着放包就可以看到,当然搞完后要去数据库把它删了
DOM xss
源代码:
可以看出用了白名单,必须有其中一个才行,但是只检测default参数,所以我们双参数绕过即可
default=English&=<script>alert('startlight-glimmer')</script>
任务2:完成pikachu的XSS实验
反射型xss(get)
首先随便输入一个试试,看有没有过滤什么字符
发现没有过滤什么便插入js语句,这里有长度限制,可以F12看网页源码能不能修改长度,不能再抓包
改成100后就直接输入语句即可,<script>alert("Apple-Jack")</script>
反射型xss(post)
登陆密码admin,123456
然后和上面一样的操作
直接输入<script>alert("my-little-pony")</script>
虽然这个页面有xss漏洞,但是由于是POST方式,我们不能把嵌入到url中,所以我们需要换一种思路去利用该类型的漏洞。
xss反射型(post)利用方式
- 攻击者伪造表单自动提交页面
- 用户request伪造页面,触发表单
- 页面js自动post表单数据,触发xss。访问存在post型xss漏洞的网站
- 执行js窃取cookie
- 攻击者利用cookie伪造用户登录,造成危害
存储型xss
步骤与之前一样第一步插入特殊字符看是否有过滤,第二步直接插入完整的js代码
<script>alert("Pinkie-Pie")</script>
DOM型xss
DOM可以简单理解为一个访问HTML的标准的编程接口,可以使得js通过该接口对整个HTML界面进行各种操作,并且DOM是前端的操作不会涉及到后端。
操作和之前差不多,先输入特殊字符看有没有过滤
发现没啥回显,输入123看下网页代码
提示说:
可以看到这是一段js代码并且调用了dom中getElementById获取到了标签 Id 为 text的内容赋值给str,然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中。
输入的内容放在a标签内,没编码(由第一个输入验证的),是双引号
我们可以尝试闭合的方式构造一个我们想要的payload(javascript:alert("rethym"))(#' onclick=alert("xss")>)
点击what do you see?
- DOM型xss-x
先测试过滤,结果有点奇怪,输入123看网页代码,发现和上一个差不多
payload一样
任务3:找到book网站的XSS漏洞
在签写留言处,有xss漏洞,可以通过网页源码看出
在内容框中插入<script>alert("xss")</script>
留言成功后,网页返回到查看留言的地方时会出现弹窗,是存储型xss
在作者处插入<script>alert("xss")</script>也可以,img标签失败了,估计标题处也是,都是插入到数据库的存储型xss漏洞
任务4:xss-labs-master靶场练习
这个之后用新文件写在一起,这里不做展示