1、xss相关知识
原理:
跨站脚本攻击。恶意攻击者常向web页面中插入恶意Script代码,当用户浏览该页时,嵌入其中web里面的Script代码被执行,达到恶意攻击的目的。
分类:
1、反射型xss:称为非持久xss,往往具有 一次性
2、存储型xss:称为持久型,攻击脚本存储在目标服务器的数据库中,具有更强隐蔽性
3、DOM型xss:使用DOM动态访问更新文档的内容、结构及样式
(服务器响应不会处理攻击者脚本,而是用户处理器处理)
过程:
1.用户登录
2.攻击者将自己准备的url提交给用户
3.用户请求攻击者的url
4.服务器对攻击者的js做出回应
5.攻击者的js在用户浏览器执行
6.用户的浏览器向攻击者发送会话令牌
7.攻击者劫持用户
最常见的XSS检测代码:
<script>alert(1)</script> // 调用JavaScript语句
<img src=x οnerrοr=alert(1)> // src是错误的 就会调用error函数
<a href=javascript:alert(1)> // 点击a即可触发
2、实训:
1、DVWA XSS (Reflected)(low)
array_key_exists() 函数:
array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。
观察代码发现未对变量进行限制,可以用script标签。输入<script>alert("XSS")</script>
内容与alert("")一致,说明成功。
2、XSS (Reflected)(medium)
str_replac函数:str_replace(‘A’,‘B’,‘C’)将C中的A替换成B
该函数区分大小写。请使用 str_ireplace() 函数执行不区分大小写的搜索。
代码意思为:将变量中的<script>替换为空,因为区分大小写则可以用大写绕过输入<Script>alert("XSS")</script>
3、XSS (Reflected)(high)
此题用了正则表达式来将script替换为空,过滤了script标签可以用img来替代输入<img src=0 οnerrοr=alert("XSS")>
4、XSS Store(low)
打开时表单格式尝试在两个单元只能进行注入测试,发现name栏有最大长度限制,可在前端进行修改,修改后发现代码无限制,两个单元都可注入。
is_object() 函数用于检测变量是否是一个对象
mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。
刷新会显示尝试过的注入,且有注入记录,是存储型特点。
5、XSS Store(medium)
对name进行限制,将<script>标签替换为空值,可用双写或大写来绕过。
对message进行限制:
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ' (单引号)成为 '
- < (小于)成为 <
- > (大于)成为 >
提示:如需把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数。
因此考虑在name中进行注入。
6、XSS Store(high)
对name进行过滤,过滤<script>标签,用<img>标签绕过。
7、XSS(DOM(low)
代码审计后发现无特变限制,但是限制了输入方式,可以用hackbar直接构造注入
8、XSS(DOM) (medium)
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
注释:stripos() 函数是不区分大小写的。
过滤关键词,尝试替换
尝试后无反应,发现没有完全闭合,构造payload:</ select><img src=1 οnerrοr=alert(“xss”)>
9、XSS(DOM) (high)
先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入默认的值。
在URL中添加注释#注释的内容不会提交到服务器,而是在浏览器执行:
English#< script >alert(“x”);尝试成功