主页 > 网络编程 > 前端实例:绕过XSS过滤对自动化暗链检测带来的启发

前端实例:绕过XSS过滤对自动化暗链检测带来的启发

本文只针对比较流行的跳转型暗链作为研究对象,其他类型的暗链暂时不做讨论。只对bypass进行讨论,不涉及检测工具的编写。本着不知功焉知防的思想,从绕过XSS过滤的角度对暗链检测提出一些新的idea。

跳转型暗链的一般模式 暗链模式一:见人说人话

如今很多的被植入暗链的网站都有一个奇怪的现象,就是通过地址直接访问不会跳转到非法网站,但是通过搜索引擎搜索关键字才会跳转到非法网站。

 

1609223496_5feacd4813c276d50ef53.png!small?1609223495516

 

这种一般是通过JS的document.refere字段来实现的:

HTTP Header referer这玩意主要是告诉人们我是从哪儿来的,就是告诉人家我是从哪个页面过来的,可以用于统计访问本网站的用户来源,也可以用来防盗链。获取这个东西最好的方式是js,如果在服务器端获取(方法如:Request.Headers["Referer"]) 不靠谱,人家可以伪造,用js获取最好,人家很难伪造,方法:利用js的 document.referer 方法可以准确地判断网页的真实来路。 目前百度统计,google ads统计,CNZZ统计,都是用的这个方法。防盗链也很简单了,js里判断来路url如果不是本站不显示图片,嘿嘿。

但是黑客可以通过这个方法来实现区别用户的跳转或者是区别修改网页的一些内容。示例代码如下:

<script> if(document.referrer.IndexOf("baidu.com")>0){ location.href="http://evil.com" ; } </script> 暗链模式二:谜之诱惑title

想这种跳转型的暗链,一般还会修改网页的title,因为他的目的之一就是为了让人通过所搜引擎搜索那些谜之关键字来点击进正常网站从而跳转到不正常的网站,像下面这个站:

1609224858_5fead29a14d3dddb629d6.png!small?1609224862893

 

(其实我觉得我没必要打码,毕竟这种东西fofa一搜一大堆。。。)

 

当然这两种模式都是暗链普遍存在的特征,也比较容易检测,那么什么样的特征不容易被检测出来呢?

正文内容 0x00 html属性xss注入带来的思考之“10进制unicode编码title”

在平时挖洞的时候经常会碰到带过滤的xss绕过,可能会将<script></script> 标签过滤掉,当这对标签被过滤掉的时候,我们就会采用HTML属性xss,比如

<img onmouseover='javascript:alert("Hello world!")' src="http://www.52bug.cn/hkjs/xxxx" >

我们可以通过不写<script>标签转而写html属性来绕过过滤。于是就有了过滤用户输入的属性,过滤掉里边的javascript开头的关键字,这样就可以暂时封堵XSS。但是javascript:alert("Hello world!")可以用10进制unicode编码代替。写成如下这种样式:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert("Hello world!")

通过这种方式可能会绕过一些过滤不是那么严格的规则。那么通过对这个的思考,黑客在植入暗链修改网页的title的时候,也可能会采用这种10进制Unicode编码的方式来绕过一些简单的暗链检测工具的检测,例子如下:

<title>这是一行演示代码/title> <title>&#x8FD9;&#x662F;&#x4E00;&#x884C;&#x6F14;&#x793A;&#x4EE3;&#x7801;</title> 这行代码在渲染过后的页面中显示的是正常的汉字,现在很多的被植入暗链网站的title都采用这种方式规避检测规则了。 0x01 16进制JS代码XSS带来的思考

平时绕过XSS过滤的时候还会经常使用16进制代码来进行绕过,那么是不是在植入暗链的时候也可以使用16进制代码来规避暗链检测工具的检测呢?就像下面这段代码。

<script type = "text/javascript"> window["open"]("http://www.baidu.com")</script> 这段代码调用window对象属性方法来打开baidu,当然也可以通过调用其他方法进行跳转到邪恶网站。

利用这样的代码就可以实现加密的js代码跳转,甚至这里调用的open方法也可以使用16进制表示,一般的不智能的暗链检测工具很难检测到。

相同的方法还有使用JavaScript的eval函数进行混淆。打开有些js文件看到的eval(function(p,a,c,k,e,d)开头,只有结尾部分有很多竖线|间隔的字符,这是eval混淆了的。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!