见框就插之XSS
XSS 简介
XSS:跨站脚本攻击(Cross-site Scripting)通过前端输入可被执行的payload来达到想达到的目的
作用:
- 获取用户的信息
- 利用XSS构造出虚假的登录框进行钓鱼
- 注入木马或者广告链接
- 后台的增删改查(需要配合CSRF)
- XSS蠕虫
分类:
- 反射型XSS
- 存储型XSS
- DOM型XSS
反射型XSS
特点:一次一执行
一般有这样的一个特点,输入后有输入的回显,且可以在url中看见传了一个参数
源码简单分析:
<?php
if (存在name值且name值不为空){
$name = 用户输入;
echo $name;
}
?>
在回显的时候没有对用户输入做任何过滤所以导致用户可以在前端输入代码,从而让自己的脚本在网页中运行
常用测试语句:
<script>alert('b1nz')</script>
对用户输入进行屏蔽的一些方法:
第一种
$name = str_replace('<script>','', $name );
第二种
$name = preg_replace('\<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t\ i','', $name );
正则表达式分析工具:
https://regex101.com/
第三种
$name = htmlspecialchars( $name );
htmlspecialchars是将其中内容转换成字符实体,不能再被当成标签解析
绕过方法:
绕过:
由于str_replace函数是区分大小写的 所以直接换成大写字母就可以绕过(大小写绕过)
将
<script>
替换成<scr<script>ipt>
即可(拼凑绕过)运用别的标签来进行注入
例如:
<img src=1 onerror=alert(1)>
- 对htmlspecialchars()函数的绕过:
默认下,htmlspecialchars()不过滤单引号,可构造如下payload进行绕过
p'onclick='alert(1)
这样html代码就会变成
<input type='text' name='p' onclick=alert(1) >
点击按钮后就可以完成xss攻击了
存储型XSS
特点:输入会被存在数据库 所以存入后每次都会执行注入过的脚本
源码简单分析:
<?php
if(有提交){
$message = 输入
$name = 输入
$query = 插入数据库语句
function{
取出数据库内容
echo #导致XSS漏洞
}
}
?>
对用户输入进行屏蔽的一些方法:
第一种:
$name = strip_tags( addslashes( $name ) );
$message = strip_tags( addslashes( $message ) );
第二种:
$name = htmlspecialchars( $name );
$message = htmlspecialchars( $message );
可以在存入数据库时就存入实体,也可以在回显的时候转换成实体
DOM型XSS
特点:在前端执行 不与服务器进行交互
与之前的原理类似 只不过更加灵活 要通过源码来具体分析 构成payload