XSS,即(Cross Site Scripting)跨站脚本攻击
XSS漏洞类型:
反射型(非持久):主要用于将恶意代码附加到URL地址的参数中,常用于窃取客户端cookie信息和钓鱼欺骗。
存储型(持久型):攻击者将恶意代码注入到Web服务器中并保存起来,只要客户端访问了相应的页面就会受到攻击。
DOM型:利用浏览器的DOM特性,不是向浏览器发请求而是直接通过在本地执行从而修改或窃取本地的信息。
现在我们开始XSS反射型练习
Low
源代码:
array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。这里键名为 name
可以看到,low级别的代码只是判断了name参数是否为空,如果不为空的话就直接打印出来,并没有对name参数做任何的过滤和检查,存在非常明显的XSS漏洞
我们输入 <script>alert('hack')</script> 直接就执行了我们的 js 代码
Medium
源代码:
在这里,str_replace()函数只把“<script>”做了一次过滤,(str_replace()函数不太完美,因为它区分大小写)
但是双写,大写还是可以写入的,
我们可以直接大写绕过
我们输入 <SCRIPT>alert('hack')</SCRIPT> ,直接就执行了我们的js代码
现在开始双写绕过
过滤代码:
$name = str_replace( '<script>', '', $_GET[ 'name' ] ),<script>被拦截过滤掉;
1、在What's your name? 输入框内输入: <script>alert(123)</script>
提交后,浏览器没有弹出我们预期的弹窗,显示alert内容,相反,直接把“alert(123)”作为name显示了出来,说明str_replace()函数在这里生效:
2、下面尝试攻击,在What's your name? 输入框内输入:
<sc<script>ript>alert("如果你能看到,说明攻击成功")</script>
原理:在这里,str_replace()函数只把“<script>”做了一次过滤,
High
源代码:
可以看到,high级别的代码使用了正则表达式直接把 <*s*c*r*i*p*t 给过滤了,* 代表一个或多个任意字符,i 代表不区分大小写。所以,我们的<script>标签在这里就不能用了。
但是我们可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
Impossible
源代码:
htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素
如果当我们输入 <script>alert('hack')</script> ,因为 htmlspecialchars 函数会将 < 和 > 转换成html实体,并且${name}取的是$name的值,然后包围在<pre></pre>标签中被打印出来,所以我们插入的语句并不会被执行。
可以看出,impossible级别的代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击。然后再用htmlspecialchars函数将name中的预定义字符转换成html实体,这样就防止了我们填入标签