最近看了关于xss攻击的相关知识点,想找个小站试一下结果没成功,自己搭了bwapp的环境,做了一个关于XSS - Reflected (POST)这一项的实验。
过程
看题目应该是一个Post提交的反射型xss漏洞。看到页面有文本框,直接注入
<script>alert("hi")</script>
就可以得到:

然后我把难度改成了medium,发现这样行不通,尝试输入',发现输出\',说明输出对单引号进行了转义。
看了下源码,找到xss_post.php核心php代码,找到输出的位置如下:

寻找xss函数:

再找xss_check_4()函数,在functions_external.php中找到:

这里用了addslashes函数对输出进行了转义,看了下函数的作用,是对 ',",\ 和 NULL进行了转义,所以实际上,<script></script>还是执行了,只不过对双引号进行了转义,只是简单的<script>alert(1)</script>就可以得到:

然后我把难度调到了high,发现怎么都会原样输出,并不会执行脚本。看了下源码,发现对输出进行了转义,利用的是htmlspecialchars函数,可以看到:

htmlspecialchars函数看了它的介绍,它的作用是:

简单的说就是,&通过编码变成了html实体&; " 通过编码变成了html实体的 " 等等。
那么这里就不知道该怎么绕过了,因为它把特殊字符转化为了实体,<script>alert(1)</script>变成了内容而不是脚本的含义了。
xss编码剖析这篇文章讲到了htmlspecialchars函数的绕过问题,它说明了如果这个函数先在script环境内的话,再在html环境内,像这样:

浏览器在接收html文件的时候就会先进行js解码,再进行HTML解码,那么我们先对输入进行js编码的话,就可以绕过htmlspecialchars函数,然后通过js解码成为html的内部代码执行。
关于浏览器的编码解码问题,可以参考这篇文章HTTP协议及浏览器编码行为
总结
这个high难度的xss该怎么注入没什么头绪,浏览器编码解码的问题还有点迷糊。
网友评论