你尚未登录

未加入『代码审计』知识星球的用户只能查看少量内容,且不能下载附件。 加入『代码审计』知识星球即可查看所有内容。

2017 十一月 09
Hitcon 2017 《Baby^H Master PHP 2017》这题在比赛中并没有人能做出来,我当初看到题目以后以为是一道二进制相关的Web题,没想到并不是,还有学到了新姿势,我们来分析一下这道题的几个考点。 #奇技淫巧# 拿到源码( My-CTF-Web-Challenges/index.php at master · orange... )会发现,关键代码在Admin类的__destruct函数里,那么很容易想到通过反序列化能够构造出Admin对象,即可触发析构函数了。 源代码中的确存在一处反序列化,但在执行前会检查Cookie中的签名,如果要构造自己的反序列化字符串,必须构造这个字符串的哈希签名。哈希用到了hash_hmac,基本上没法绕过了,应该及时舍弃这个思路。 那么,还有没有其他地方可以触发反序列化操作呢? 这就是本题最大的考点:PHP在解析phar文件的Metadata的时候,可能会触发反序列化操作。这一点可以从官方文档看到(图1):PHP: Phar::getMetadata - Manual 再加上,phar默认会注册成一个协议 phar://,这样,在用phar://协议读取文件的时候会自动解析成phar对象,同时反序列化其中存储的Metadata信息。 所以,一个可控协议的文件读取的操作,将会触发反序列化操作(文件读取漏洞 => 反序列化漏洞)。到这里思路就比较明确了,我们通过upload函数(图2)可以写入任意文件,并再次通过upload函数读取之。 不过upload函数中检查了文件头是否是"GIF89a",这也好说,加上即可,因为phar在读取的时候这个头会被忽略掉。最后,编写如下POC: <?php class Admin { public $avatar = 'orz'; } $p = new Phar(__DIR__ . '/avatar.phar', 0); $p['file.php'] = '<?php ?>'; $p->setMetadata(new Admin()); $p->setStub('GIF89a<?php __HALT_COMPILER(); ?>'); rename(__DIR__ . '/avatar.phar', __DIR__ . '/avatar.gif'); ?> 即可生成包含序列化的Admin对象的avatar.gif。 本题第二个考点,是考察匿名函数真正的名字。我们现在构造好了反序列化对象,已经可以进入__destruct方法了,这个方法中执行了 $_GET["lucky"](); 这很类似于我以前出过的一个题 安全箱子的秘密 | 离别歌 ,那个题目当时是调用了get_defined_functions(),找到了可以利用的函数。 但这道题,获取flag的函数是一个匿名函数:$FLAG = create_function("", 'die("flagflagflag");'); ,是通过create_function创建的,所以用get_defined_functions()没法获得其真实名字。 这就涉及到另一个知识:PHP中匿名函数其实是有名字的,名字是"\x00lambda_%d",这个%d是一个1开始的递增序列,表示这是当前进程中第%d个匿名函数。 所以,如果一个崭新的PHP进程,其第一的第1个匿名函数就是"\x00lambda_1",所以我只需要传入lucky=%00lambda_1即可。 但是实战中,因为有很多人做题,每个人访问一次网页,就会使%d加1,所以我们并不知道自己访问时的这个%d是多少。 这就涉及到第三个考点,我们通过大量请求,使目标Apache难以同时处理这么多请求,所以以Pre-fork模式启动的Apache会启动新进程来处理这个请求。那么,新进程下%d就是以1重新开始的,所以就可以预测了。

图片


2017 十一月 09
又到了萌新练手的时候了。另外期待和师傅们交流更多骚知识

附件


# 附件名 大小 时间 操作
最基本的dogByPass一条龙服务.pdf 1.2 MB 11/09/2017
2017 十一月 06
后面几天我分享一下Hitcon的几道代码审计相关题,我的思路和考点分析。就不写writeup了 😂 官方解法已经由 @Orange 发到他的github上了。 #奇技淫巧# 先说一下我比较熟悉的一道题目《SQL so Hard》,因为这题是我做的,并趁歪果仁还没起床拿到了这题的first blood 400分 [捂脸] 比赛开始前我有种预感,肯定有Node.js相关的题目,然后回想了一下这段时间有没有特别有意思的漏洞,于是想到了node-postgres的那个代码执行漏洞,赶在比赛前把这个漏洞分析了一遍。(那天早上6点写的文章啊兄弟们) 果然《SQL so Hard》这道题就是这个考点,押题真是第一准。看代码(代码 《SQL so Hard》源码 ),可以看到他连接了两个数据库(mysql和postgres),其中postgres存在SQL注入。那么,很容易就想到node-postgres这个代码执行漏洞,但是有如下2个难点: 1. SQL语句被分号分割,所以无法多句执行 2. WAF拦截了一些关键字 第1点,我发现这是一个INSERT语句中的注入点,而且不能多句执行。而我前面对node-postgres的分析得知,代码执行是因为返回的“字段名”被拼接进JavaScript代码导致的。那么,我必须控制字段名。在Mysql中似乎INSERT语句是没有返回值的,所以肯定控制不了字段名,但我翻阅Postgresql文档发现pg的INSERT语句是可以构造出返回值的(图1),那就是用到RETURNING语法。官方文档中对这个语法的说明是: An expression to be computed and returned by the INSERT command after each row is inserted or updated. The expression can use any column names of the table named by table_name. Write * to return all columns of the inserted or updated row(s). 也就是说,通过这个语法,在INSERT完成之后可以将这个表的任意字段返回给客户端,当然也就可以用AS语句来构造一个恶意fieldName来触发代码执行漏洞。 本地测试 RETURNING "name" AS "\'+console.log(process.env)]=null;//" -- 成功,说明这个思路是对的。 解决了第1个问题,第2个问题就是,我需要绕过WAF。因为WAF把最重要的反斜线给拦截了,如果绕不过WAF这个题的肯定做不了。 观察一下WAF部分的源码(图2),可以发现一个特点,这个WAF是检查用户输入的GP变量,如果存在恶意字符,“将ip和payload存入mysql数据库”,然后“根据ip查询数据库,只要查到有结果则拦截”。也就是说拦截过程分两步,那么顺理成章就想到,如果第1步也就是插入mysql数据库的操作如果失败的话,那么第二步也就查不出数据,也就可以绕过了WAF。 插入数据库的操作是没有注入点的,那么我们怎么让INSERT语句出错呢?常见方法有: 1. 重复提交数据,触发唯一键错误 2. 提交一个很长的payload,触发长度错误 3. 字段是utf8的情况下,可以提交4字节(utf8mb4)unicode字符触发错误 第1点不行,因为INSERT时有ON DUPLICATE KEY UPDATE操作。 第2点不行,正常情况下TEXT类型的长度是64k,我试了64k的payload无法触发错误,可能是用到了LONGTEXT类型。 第3点不行,可能是数据库用了utf8mb4编码。 最后经过fuzz我发现,当SQL语句超过16M(还是8M来着)就会触发错误,本地测试发现报的错是 max_allowed_packet 错误。原来是mysql限制了最大数据包不能超过max_allowed_packet的值,默认好像是16M。所以,这也是一个构造错误的方法。 最后,通过构造出INSERT语句的错误,导致WAF执行失败,绕过了WAF。 另外,因为Payload中不能有分号,所以我博客中的那个payload还需要修改,这块比较简单我就不多说了。 最后感谢一下🍊 @Orange 师傅的题目,能学习不少知识。

图片


2017 十月 25
(重新开放了发帖子的权限) Typecho这个代码执行漏洞 typecho “后门”分析 - Th1s's Bl0g 是前几个礼拜 @他是鹿 挖的......
2017 十月 16
[呲牙]分享一些资料。一些ppt合集 https://drive.g......

图片


2017 十月 12
前几天,@Chu 师傅分享了一个解密PHP的工具,刚抽时间测试了一下,包括之前说过的phpjiami,和phpjm、威盾加密,还有pigcms、齐博......

图片


2017 九月 25
虚拟主机控制面板Sentora/ZPanel密码重置漏洞 SSD Advisory – Sentora / ZPanel Password Reset Vul... 这个漏洞比较有意思,简单描......
2017 九月 24
《phpjiami的数种解法》 phpjiami 数种解密方法 | 离别歌 那么,从防御者的角度看待,有什么办法能尽量保证自己的PHP源码不被泄露? #问题解答# 如果你是软件售卖者,防止自......
2017 九月 21
对PHP一些封装协议进......

附件


# 附件名 大小 时间 操作
文件包含与伪协议小总结(一).pdf 726.4 KB 09/21/2017
2017 九月 19
分享一个藏了许久的小tip,结果刚才群里聊天,发现别人出题已经用过了 😂 。 如下代码: <?php $url = $_GET['url']; $parts ......

图片