Android WebView 动态注入 CSS 和 JavaScript

by admin on 2020年1月5日

CSS仅仅只是后生可畏种用来表示样式的语言吗?当然不是!CSS就已被安全商讨职员动用于渗透测量试验个中。使用质量选拔器和iFrame,并因此CSS注入来盗取敏感数据的艺术。但由于该方法须求iFrame,而大部分主流站点都不容许该操作,因而这种攻击方法并不实用。这里为大家详细介绍生龙活虎种没有必要iframe且只需10秒,就会为获取CSRAV4F
token的办法。

首先

先增多三个widgets,代码如下(提醒:使用时只顾校订命名空间)

持续阅读

如何在 Android WebView 重动态加载页面和注入 CSS 和 JavaScript ?

图片 1

利用CSS注入(无iFrames)窃取CSRF令牌

2018/03/05 · CSS ·
CSRF

原稿出处:
FreeBuf.COM   

CSS相信大家不会不熟悉,在百度完善中它的表达是风流浪漫种用来突显HTML(规范通用标识语言的三个利用)或XML(标准通用标志语言的贰个子集)等公事样式的Computer语言。那么,它仅仅只是生龙活虎种用来表示样式的语言吗?当然不是!其实早在N年前,CSS就已被平安商讨职员动用于渗透测量检验个中。这里有大器晚成篇小说就为我们详细介绍了意气风发种,使用性质接纳器和iFrame,并经过CSS注入来偷取敏感数据的法子。但鉴于该措施供给iFrame,而大多数主流站点都不许该操作,因而这种攻击方法并不实用。

此地笔者将为大家详细介绍后生可畏种不须要iframe且只需10秒,就可以为大家有效地窃取CS巴博斯 SL级F
token的点子

假若客户的CSLX570F
token被盗取,由于受害人已经在攻击者的网址上,因而攻击者能够三回九转抨击并完毕对用户的CS昂科拉F攻击操作。

什么是CSS注入

我们在开辟进度中恐怕有与上述同类的急需, 用三个 WebView 去加载网页的时候,
原本的网页里面包车型客车样式用安卓的WebView控件展开,
想退换原网页的体制为此外的大器晚成种体裁, 那个时候就足以选拔那样的不二法门:

CSS相信大家不会素不相识,在百度康健中它的分解是生龙活虎种用来显现HTML或XML等文件样式的微型机语言。那么,它仅仅只是黄金年代种用来代表样式的言语吗?当然不是!其实早在多年前,CSS就已被安全钻探人口运用于渗透测量检验此中。这里有风流罗曼蒂克篇小说就为大家详细介绍了生机勃勃种,使用品质选用器和iFrame,并通过CSS注入来偷取敏感数据的主意。但鉴于该办法要求iFrame,而半数以上主流站点都差异意该操作,因而这种攻击形式并不实用。

背景

正如原版的书文所描述的那么,CSS属性采纳器开荒者能够依据属性标签的值相称子字符串来采撷成分。
这个属性值选用器能够做以下操作:

  • 若果字符串以子字符串开端,则至极
  • 假如字符串以子字符串结尾,则匹配
  • 假如字符串在别的市方含有子字符串,则至极

属性接收器能让开辟职员查询单个属性的页面HTML标志,何况万分它们的值。叁个实际上的用例是将以“”起头的有着href属性别变化为某种特定的颜料。

而在实际条件中,一些敏锐音讯会被贮存在在HTML标签内。在大部动静下CSQX56F
token都以以这种艺术被贮存的:即潜伏表单的属性值中。

那使得我们得以将CSS接收器与表单中的属性举行相配,并依附表单是不是与早先字符串相配,加载二个外界能源,比如背景图片,来尝试猜测属性的早先字母。

因而这种方法,攻击者能够进行逐字猜解并最终获得到完全的机敏数值。

想要解决那些难题受害者能够在其服务器施行内容安全战略(CSP),幸免攻击者从表面加载CSS代码。

咱们对XSS攻击都特别纯熟了,或然超少关注到CSS注入攻击,以下行为有望面前境遇CSS注入攻击:

驷不及舌利用了 Android WebView 这么些类里面的三个函数:

这里笔者将为大家详细介绍风姿罗曼蒂克种不须求iframe且只需10秒,就能够为我们有效地盗取CS索罗德F
token的法子

无iFrames

要做到无iFrame,作者将动用意气风发种恍若于事情发生前本身谈谈过的措施:我将创立贰个弹窗,然后在安装放大计时器后修改弹出窗口的职位。

运用这种措施,笔者还是能加载受害者的CSS,但自己不再依附于受害者是或不是允许iFrame。因为早期的弹出是因此客户事件触发的,所以本身并从未被浏览器阻止。

为了免强重载,笔者在CSS注入间弹出一个设想窗口,如下:

JavaScript

var win2 = window.open(”, ‘f’,
“top=100000,left=100000,menubar=1,resizable=1,width=1,height=1”) var
win2 =
window.open(`,
‘f’, “top=100000,left=100000,menubar=1,resizable=1,width=1,height=1”)

1
2
var win2 = window.open(‘https://security.love/anything’, ‘f’, "top=100000,left=100000,menubar=1,resizable=1,width=1,height=1")
var win2 = window.open(`https://security.love/cssInjection/victim.html?injection=${css}`, ‘f’, "top=100000,left=100000,menubar=1,resizable=1,width=1,height=1")

从顾客提供的UCRUISERL中引入CSS文件CSS代码中应用了客户的输入数据原理

loadDataWithBaseURL(url, page, null, mDefaultEncoding, null);

若是客商的CSMuranoF
token被偷取,由于受害人已经在攻击者的网址上,因而攻击者能够继续抨击并做到对客商的CS本田CR-VF攻击操作。

从未后端服务器

在CureSec的小说中陈说了将数据传输到后端服务器,但鉴于CS奥德赛F是指向客户端的口诛笔伐,由此只要我们能想出大器晚成种不必要服务器的方法,那么就足以为大家节省大批量的开支和简化大家的操作。

为了选用受害者顾客端加载能源,我们得以应用ServiceWorkers来堵住和读取央求数据。ServiceWorkers近来只适用于同源诉求,在本人的演示中被害人和攻击者页面已居于同风流洒脱源上。

可是不久后,chrome异常的大概会归拢这些实验性的成效,允许ServiceWorkers拦截跨域央浼。

这么,就能够保险大家在客商端的笔伐口诛100%的实行,并仰制客户在10秒内点击链接实行CSOdysseyF攻击,演示如下:

CSS属性选拔器让开拓者能够根据属性标签的值相配子字符串来接纳元素。
那么些属性值选取器能够做以下操作:1.假若字符串以子字符串最初,则非常;2.若是字符串以子字符串结尾,则相配;3.举例字符串在别之处含有子字符串,则格外;4.属性选用器能让开辟职员查询单个属性的页面HTML标记,况兼同盟它们的值。

上面是完好的 CSS注入 代码:

背景

Demo

总的来讲,因为本身并不想运行四个web服务器,所以小编利用service
workers拦截和模仿服务器端组件。近日,该演示只适用于Chrome浏览器。

率先,小编创制了叁个易受攻击的靶子,它存在三个基于DOM的CSS注入漏洞,并在页面放置了八个乖巧token。作者还对台本标签加多了有的尊敬措施,对左尖括号和右尖括号实行了编码。

<form action=”” id=”sensitiveForm”> <input
type=”hidden” id=”secret” name=”secret” value=”dJ7cwON4BMyQi3Nrq26i”>
</form> <script src=”mockingTheBackend.js”></script>
<script> var fragment =
decodeURIComponent(window.location.href.split(“?injection=”)[1]); var
htmlEncode = fragment.replace(/</g,”<“).replace(/>/g,”>”);
document.write(“<style>” + htmlEncode + “</style>”);
</script>

1
2
3
4
5
6
7
8
9
<form action="https://security.love" id="sensitiveForm">
    <input type="hidden" id="secret" name="secret" value="dJ7cwON4BMyQi3Nrq26i">
</form>
<script src="mockingTheBackend.js"></script>
<script>
    var fragment = decodeURIComponent(window.location.href.split("?injection=")[1]);
    var htmlEncode = fragment.replace(/</g,"&lt;").replace(/>/g,"&gt;");
    document.write("<style>" + htmlEncode + "</style>");
</script>

接下去,大家将挟持加载受害者的CSS,况且采纳上述情势,可二遍盗取(猜解)五个灵活字符。

在接受端,作者意气风发度定义了叁个截留央求的service
worker,并透过post-message将它们发送回域,然后大家将token存储在该地存款和储蓄中以供后续使用。你也足以想像叁个后端Web服务器,通过Web套接字或轮询将CS奥德赛F
token回发给攻击者域。

一时一刻该测量检验仅扶植CHROME:

demo

假使你的浏览器帮忙的话,只需点击展开页面大叁地方,你将见到CSOdysseyF
token将依次被猜解出来。

而在实际条件中,倘若有些机敏消息会被存放在在HTML标签内,如CSRubiconF
token存款和储蓄在掩盖表单的属性值中,那使得大家能够将CSS接收器与表单中的属性举行相配,并基于表单是不是与初阶字符串相称,加载多少个表面财富,比如背景图片,来品尝推断属性的开头字母。通过这种方法,攻击者能够拓宽逐字猜解并最终拿到到完全的Smart数值。

public class StyledWebView extends WebView {

    private static final String TAG              = "AsSamsung";
    public static String mDefaultEncoding = "UTF-8";
    private Context             mContext;
    private String mCss, mUrl;

    public StyledWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        this.setHorizontalScrollBarEnabled(true);
        this.getSettings().setJavaScriptEnabled(true);
        this.getSettings().setBuiltInZoomControls(true);

        // Read custom attributes
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.StyledWebView);

        mCss = a.getString(R.styleable.StyledWebView_css);
        mUrl = a.getString(R.styleable.StyledWebView_url);

        a.recycle();

        loadUrl(mUrl);
    }


    /**
     * Complete delete everything in the webview.
     * Is needed to repaint 
     */
    public void clean() {
        super.loadUrl("javascript:document.getElementsByTagName('body')[0].innerHTML='';");

    }

    /**
     * Download url content, store it as a file and concat styles
     */
    @Override
    public void loadUrl(String url) {
        String page = WGet(url);
        String css = buildCss();
        page = injectCss(page, css);
        super.loadDataWithBaseURL(url, page, null, mDefaultEncoding, null);
    }

    /**
     * Concatenates CSS rules to given page content
     * @return Concatenation result
     */
    private String injectCss(String page, String css) {
        int headEnd = page.indexOf("</head>");
        String res = "";
        if (headEnd > 0) {
            res = page.substring(0, headEnd) + css + page.substring(headEnd, page.length());    
        } else {
            res = "<head>" + css + "</head>" + page;
        }
        return res;
    }

    /**
     * Fetches url content and returns it as string
     */
    private String WGet(String webUrl) {
        StringBuilder total = new StringBuilder();
        try {
            URL url = new URL(webUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream is = connection.getInputStream();
            String encoding = connection.getContentEncoding();
            if (encoding == null) {
                encoding = mDefaultEncoding;
            }
            BufferedReader r = new BufferedReader(new InputStreamReader(is, encoding));
            String line;
            while ((line = r.readLine()) != null) {
                total.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return total.toString();
    }

    /**
     * Read CSS file from assets
     * @return String with the format '<style> xxxx </style>'
     */
    private String buildCss() {
        StringBuilder contents = new StringBuilder();

        InputStreamReader reader;
        try {
            reader = new InputStreamReader(mContext.getAssets().open(mCss), mDefaultEncoding);
            BufferedReader br = new BufferedReader(reader);

            String line;
            while ((line = br.readLine()) != null) {
                contents.append(line);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "<style>" + contents.toString().trim().replace("\n", "") + "</style>";

    }


    public void setDefaultEncoding(String encoding) {
        mDefaultEncoding = encoding;
    }
}

正如原作所汇报的那样,CSS属性选用器开荒者可以依从属性标签的值相称子字符串来筛选成分。
那一个属性值选拔器能够做以下操作:

结语

风趣的是,反射型CSS注入实际上比存款和储蓄型CSS注入更致命,因为存款和储蓄型CSS注入供给多个服务器在被害者渲染以前来更新CSS。

黄金年代段时间以来,CSS注入在严重程度上往返变化。过去IE浏览器是同意客商在CSS中施行Javascript代码的。这些演示也从某种程度上注解了CSS注入,以致在您的域上渲染不受信赖的CSS仍会导致严重的安全难题。

*参照来源:github,FB我secist 编写翻译,转发请表明来源FreeBuf.COM

1 赞 收藏
评论

图片 2

守护政策

assets目录下的两个公文:

假诺字符串以子字符串早先,则相称

想要化解那一个标题受害者能够在其服务器实践内容安全攻略,防止攻击者从外表加载CSS代码。

文件1: customStyle.css

只要字符串以子字符串结尾,则相配

总结

a {
 color: #A4C639 !important;
 font-weight: bold;
} 

假诺字符串在任哪儿方含有子字符串,则相当

用作前端开采者,大家与客商这段日子,也是互连网安全防守的第豆蔻年华道线,要任何时候关切来自各地点的互连网攻击,保证客户音讯的平安。

文件2: resultados.css

品质选拔器能让开采人士查询单个属性的页面HTML标志,而且卓殊它们的值。二个实际上的用例是将以“”发轫的兼具href属性别变化为某种特定的水彩。

h1, h2 {
    color: red;
}

ul.tabmain a{
    color: green;
}

而在骨子里条件中,一些乖巧新闻会被贮存在在HTML标签内。在超越五分之二地方下CS普拉多F
token都以以这种办法被积累的:即潜伏表单的属性值中。

同理 JavaScript 也是相仿的思路. 有意思味小同伙能够去试一下.

那使得我们能够将CSS选取器与表单中的属性举办匹配,并基于表单是不是与开首字符串相配,加载四个表面能源,比方背景图片,来品尝估摸属性的初阶字母。

透过这种措施,攻击者能够张开逐字猜解并最后赢获得意气风发体化的灵活数值。

想要消除这些主题材料受害者能够在其服务器施行内容安全战略,幸免攻击者从表面加载CSS代码。

无 iFrames

要水到渠成无iFrame,笔者将选拔意气风发种恍若于事情发生以前作者谈谈过的章程:作者将制造叁个弹窗,然后在设置机械漏刻后改进弹出窗口的职分。

使用这种方法,小编仍旧能够加载受害者的CSS,但自个儿不再依附于受害者是不是允许iFrame。因为开始的豆蔻梢头段时期的弹出是由此顾客事件触发的,所以自己并从未被浏览器阻止。

为了强制重载,小编在CSS注入间弹出八个设想窗口,如下:

在CureSec的稿子中呈报了将数据传输到后端服务器,但鉴于CS汉兰达F是针对客商端的抨击,因而只要咱们能想出生机勃勃种不需求服务器的措施,那么就足以为大家节省大批量的开销和简化我们的操作。

为了选取受害者客户端加载能源,我们能够使用ServiceWorkers来阻止和读取诉求数据。ServiceWorkers近来只适用于同源乞求,在自身的以身作则中被害者和攻击者页面已居于同风流倜傥源上。

可是不久后,chrome很或许会联合那么些实验性的坚决守住,允许ServiceWorkers拦截跨域央求。

与上述同类,就能够保险我们在顾客端的大张征讨百分之百的实践,并强逼顾客在10秒内点击链接推行CSHavalF攻击,演示如下:

Demo

总的看,因为作者并不想运行贰个web服务器,所以自个儿使用service
workers拦截和模仿服务器端组件。近日,该演示只适用于Chrome浏览器。

第风流罗曼蒂克,小编成立了二个易受攻击的指标,它存在二个依据DOM的CSS注入漏洞,并在页面放置了多个灵活token。笔者还对台本标签增多了一些尊崇措施,对左尖括号和右尖括号进行了编码。

接下去,大家将强迫加载受害者的CSS,何况动用上述方法,可叁回盗取一个机警字符。

在选拔端,作者曾经定义了四个挡住央浼的service
worker,并由此post-message将它们发送回域,然后我们将token存款和储蓄在地方存款和储蓄中以供后续使用。你也得以伪造一个后端Web服务器,通过Web套接字或轮询将CSHavalF
token回发给攻击者域。

脚下该测验仅辅助CHROME:

只要您的浏览器协理的话,只需点击张开页面大三个人置,你将见到CS宝马7系F
token将次第被猜解出来。

结语

有趣的是,反射型CSS注入实际上比存款和储蓄型CSS注入更致命,因为存款和储蓄型CSS注入必要五个服务器在被害者渲染从前来更新CSS。

风度翩翩段时间以来,CSS注入在严重程度上往返变化。过去IE浏览器是同意客商在CSS中实行Javascript代码的。这么些演示也从某种程度上申明了CSS注入,以致在您的域上渲染不受信赖的CSS仍会促成严重的安全难点。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图