那么,问题来了。
毕竟我们还有另外一个身份,开发者该如何防御呢?
0×00、来个最简单的,只修改前端代码在input标签里面加上maxlength属性
<input type=http://www.52bug.cn/hkjs/"text" name=http://www.52bug.cn/hkjs/"nickname" placeholder=http://www.52bug.cn/hkjs/"留言者昵称" maxlength=http://www.52bug.cn/hkjs/"10">至于原理嘛,就是因为js脚本的形式为<script></script>长度为17,所以只要我们在前端对长度进行限制,就可以阻止黑客进行xss攻击了
可是!开发可没这么好做!
我们是想做开发的黑客,所以还得自己搞自己。
作为攻击者,我们同样可以修改前端代码,具体的操作是使用浏览器的F12(开发者工具)
可以看到,我们可以直接进行长度的修改。
另外,还可以用抓包的方法,在包里面直接写,也是不受长度限制的。
0×01、对关键字script进行过滤作为开发者,你很容易发现,要想进行xss攻击,必须插入一段js脚本,而js脚本的特征是很明显的,脚本中包含script关键字,那么我们只需要进行script过滤即可。
回到之前的代码。
为方便说明,我只取nickname参数,其实传入的四个参数需要做同样的处理。
$nickname = str_replace("script", "", @$_POST['nickname']);//昵称上面这个str_replace()函数的意思是把script替换为空。
可以看到,script被替换为空,弹框失败。
那么黑客该如何继续进行攻击呢?
答案是:大小写绕过
<sCrIPt>alert(1)</ScripT>
因为js是不区分大小写的,所以我们的大小写不影响脚本的执行
成功弹框
0×02、使用str_ireplace()函数进行不区分大小写地过滤script关键字
作为一名优秀的开发,发现了问题当然要及时改正,不区分大小写不就行了嘛
后端代码修正如下:
$nickname = str_ireplace("script", "", @$_POST['nickname']);//昵称str_ireplace()函数类似于上面的str_replace(),但是它不区分大小写。
那么,大黑阔该如何绕过?
答案是:双写script
<Sscriptcript>alert(1)</Sscriptcript>
原理就是str_ireplace()函数只找出了中间的script关键字,前面的S和后面的cript组合在一起,构成了新的Script关键字。
弹框成功!