所有行为均为苯人梦到的,请勿模仿,请勿找我询问与此相关的任何问题...
最近会比较忙,不定时更新喔。
. . . * . * ☄️. * . * . 🔆 .* . * . 🧶 * . * . . .
这次也是莫名其妙,没有什么参考价值(因为它看上去不是框架),但是这个洞发现的过程很有意思。
要感谢我的朋友们,给我这个php低手非常好思路。下次KTV我会对着他们唱感恩的心的^ ^。
1 简单难用的跨站脚本
小黄站,不知道为什么我老是在打小黄站- -。
进去先随便点了点,没发现啥大洞,只找到一个反射型XSS(顺带说一句,comefrom这种参数是XSS大头):
反射型XSS其实本来也能将就用用,骗骗客服啥的。不过苯人胆子真的很小,能不和对方打照面尽量不去打。所以先放着。
2 难窥门径的反序列化
由于前台没毛病,注册个账号:
由于我打码了,可能读者没发现什么华点。
但是我把__user放进Decoder里解一下URLencode:
这不就是php反序列化吗??
虽然php反序列化在不知道源码的情况下,不好利用,只能盲打。但是,如果这玩意就是Cookie的全貌的话,我是否能通过修改内容,伪造任意用户的Cookie?
说干就干。php序列化类似ruby(可能这是脚本语言的特性?),比java的字节码好读多了。它的结构如下:
O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}
而这段反序列化,含有以下字段:
●Nickname
●Id
●Hash
●...
最开始我想着先看看Id能不能伪造,所以先修改Id字段。修改php的反序列化字符串很容易,修改明文的值,然后更新对应的长度就行。比如说O:14:s:8:"11111111",改完之后就是O:10:s:8:"4444"。
改了之后发现无论如何都取不到值。
正常的__user返回是19632:
随便改一下,比如改了id,就是16574,也没有取到值:
我以为是我反序列化的姿势有问题,问朋友,朋友问我是不是__uniqueId的问题?
我一看,32位,长得是有点像啊,不过我反应大条了点,晚上到家才发现。
我把__user换成各种形状md5和uniqueId对比,但是没找到对得上的,很烦。
更烦的是发现删掉uniqueId之后还是能发包:
试了半天=白试,也是没谁了。不过没关系,记得上面那个Hash吗?那个玩意也是32位,而且名字还叫Hash:
这次我感觉稳了,就算找不到是怎么MD5的,但是肯定是校验了这个^ ^。因为Cookie的其他部分已经被证明为不值一文,而和用户有关的操作又都不存在其他参数:
最后证明确实校验的是这个(我去看了源码),不过不是试出来的,因为我在其他地方有了进展。
3 峰回路转的命令执行
3.1 发现黑马程序员
俗话说得好,当你在一个房间内发现一只蟑螂,那么房间里实际上会有甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱甴曱。。。。。。
当我在一个网站内发现多个漏洞并且发现程序员疑似脑袋不好(一种直觉,你就想想他会怎么写)的时候,那么我就会怀疑这个网站上还会有更多大漏洞。
所以我开始从头到尾再测了一遍接口,没想到发现了个大家伙。
还记得这个包吗?注册用的:
action,长得有点像thinkphp(很多别的框架里也有,但总的来说基本是一种调用方法),放在往常我是不会仔细测的,但通过之前的测试我知道这是诡计多端的程序员自己实现的一个玩意。所以我直接一改:
妈呀,看到了这辈子很少看到的东西,属实吓了我一跳。这大哥黑马程序员出厂的吧,这都敢写?
为了确信我看到的不是假的,phpinfo一下:
这下瞬间感觉shell了,神清气爽啊^ ^。
3.2 斗折蛇行,呼叫好丽友
据我推测,这个action对应的代码应该是这么写的:
eval($_POST['action']+"()");
所以我一开始认为,只能执行无参函数(要满足后面的括号)。
先用一些显示环境的无参函数:
get_included_files:
get_defined_functions:
但是往后,我就不知道咋写了,毕竟你要在没有参数的情况下造成命令执行?于是我又问朋友:
在跟朋友掰扯半天这是不是真的能执行命令之后,朋友使用var_dump告诉我是能执行带参函数的(也是我蠢,最基本的执行顺序都忘了,思路太窄)。
用var_dump继续尝试执行,发现存在一些过滤,'"/+-*,都不行,最致命的是空格也不行。
这导致了,就算执行到shell,也不能执行带有空格的命令。现在就陷入了一个僵局。为了绕过空格去问了另一个朋友,他让我按照CTF空格绕过做,也就是用下面几个字符代替:
前面三个直接被过滤了,最后的%09没有被过滤,但是执行不了。后面发现%2509被拦截,也就是说%实际上也被拦了。
这下又进入死路,离shell这么近,超不甘心- -。
但怎么说在外靠朋友呢,这个时候朋友跟我说他找到shell的方式了:
怎么个事呢?要回到我之前使用的探测环境函数get_defined_functions:
直接用base64编码命令,成功执行:
原文始发于微信公众号(重生之成为赛博女保安):BC实战从注册到getshell
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论