目前就我接触到路由器的JavaScript HTML注入(后面简称为JS注入)手段有:1.内核态注入,采用netfiler 的hook机制实现 2.用户态注入,采用http代理实现。下面具体谈下两种技术手段的特点和优缺点。
内核态注入
特点:由于技术实现的缺陷,内核中不能改修content-size的大小,所以一般都是采用替换字符串或字符压缩后替换的的模式来实现注入。所以我们能看到标志性特征就是注入点一般都是在HTML中的HEAD标签内。
优点:不会给路由器带来巨大的CPU和IO负载,因为netfilter的hook只要处理http包的前几个包,所以效能和稳定性都是可以得到保证。
缺点:由于是内核态实现,对开发人员的编码能力就是一种考验,同时也带来一个灵活性的问题。
2.HTTP透明代理
特点:HTTP透明代理无非就是让用户所有80端口数据通过iptables规则重定向到本地的代理服务器,一般注入点是HTML的BODY标签尾部。
优点:HTTP透明代理是比较常用的技术,所以二次开发也相对容易上手。
缺点:1)不能处理80端口的非HTTP请求,很多特殊应用可能会用到80端口,所以此技术存在致命缺陷。
2)当流量比较大,可能出现网络堵塞不能上网或者死机问题。由于路由器的性能有限并不能承载大流量下HTTP代理带来的压力,可能会出现HTTP透明代理程序性能不挤或者挂掉问题。
PS:博主有对应两套技术方案的代码,有意向的可以联系博主。