pikachu -Xss
跨站脚本漏洞常见类型 危害:存储型>反射型> DOM型
1.反射型 交互的数据一般不会被存在在数据库里面,一次性,所见即所得,一般出现在查询类页面等。
2.存储型 交互的数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面。
3.DOM型 不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。
xss漏洞形成的原因:
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造"的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
跨站脚本漏洞测试流程:
1.在目标站点上找到输入点,比如查询接口,留言板等;
2.输入一组”特殊字符+唯一识别字符”, 点击提交后,查看返回的源码,是否有做对应的处理;
3.通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件 (构造闭合) ;
4.提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
提示:
1.一般查询接口容易出现反射型XSS ,留言板容易出现存储型XSS ;
2.由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效或者环境限制了执行(浏览器) ;
3.通过变化不同的script ,尝试绕过后台过滤机制;
-
反射型xss(get)
在输入kobe和其他敏感字符后,按照输入输出,判断出没有对字符进行过滤
输入JavaScript语句后发现不能显示完全,查看源码更改输入字符限制
<input class="xssr_in" type="text" maxlength="20" name="message">
-
反射型xss(post)
和get差不多,参数传递为post
<script>alert('Hello')</script>
GET和POST典型区别:
GET是以url方式提交数据;
POST是以表单方式在请求体里面提交;
GET方式的XSS漏洞更加容易被利用, 一般利用的方式是将带有跨站脚本的URL伪装后发送给目标,而POST方式由于是以表单方式提交,无法直接使用URL方式进行攻击,
-
存储型xss
存储型xss又名永久性xss,每一次刷新页面都会弹出窗口。输入敏感符号没有被过滤。
-
DOM型xss
在输入框输入字符以后发现输入的字符被放入一个href中,利用""构造闭合 输入#' onclick="alert('Hello')">
将其拼接成<a href="#" onclick="alert('Hello')">'>what do you see?</a>
-
DOM型xss-x
他的输入从url中获得,构造闭合 #' onclick="alert('Hello')">
-
xss之盲打
输入框一般是前端数据交互的地方。在输入框输入语句,然后在后端发现语句没有被过滤。这样在其插入语句,当管理员打开的时候就会执行插入的语句。 这不会立马得到结果,一般尝试输入后管理员执行相应操作才会有结果。
-
xss之过滤
在本题中输入<script>时只有>说明script被过滤了,再尝试大小写,并没有被过滤。
然后通过oneerror事件属性(报错)也成功<img src=x onerror= " alert%28%27xss%27%29" />
也可使用其他方式对其编码
-
xss之htmlspecialchars
htmlspecialchars()函数把预定义的字符转换为HTML实体。 &(和号)成为& "(双引号)成为" '(单引号)成为' <(小于)成为< ‘>’(大于)成为> 可用的引号类型: ENT_ COMPAT -默认。仅编码双引号。 ENT QUOTES -编码双引号和单引号。 ENT NOQUOTES -不编码任何引号。
在输入1'1'1"1<1>1&后发现只有'没有被过滤。 <a href="1" 1'1"1<1>1&'="">1'1'1"1<1>1&</a> 输入#' onclick='alert(666)'得到结果
-
xss之href输出
输入Javascript:alert('Hello')
alert被执行,出现弹窗。在这里我们可以做出相应防范,只允许http,https,其次在进行htmlspecialchars处理。
-
xss之js输出
查看源码后对$ms进行闭合
输入:x'</script><script>alert('xss')</script>'
$ms='tmac';
if($ms.length != 0){
if($ms == 'tmac'){ $('#fromjs').text('tmac确实厉害,看那小眼神..') }else { // alert($ms); $('#fromjs').text('无论如何不要放弃心中所爱..') }
执行alert($ms);