
地 址:北京市门头沟区66号
电 话:18069106274
网址:91martech.com
邮 箱:62003607@qq.com
三、这时我们的解析采用了另一种引擎:php 思考一下这时会发生什(shen)么情况?(php引擎中以竖线(xian)来分隔键和(he)值) 如果像上面我们的payload换一下,传入内容以(yi)及得到的存储内容如下: $_SESSION['key'] = '|O:4:"User":0:{ }'; a:1:{ s:3:"key";s:16:"|O:4:"User":0:{ }";} 这时候a:1:{ s:3:"key";s:16:"被当作了key,而(er)后(hou)续的O:4:"User":0:{ }";}被当作了value从而被反序列化。这里可能有人会问了,为什么会被反序列化? 看看官方(fang)文档 这里可能还会有人问?那(na)串value不符合"正常"的被反序列化的字符串规则。这个也(ye)不用担心,这里提到一个unserialize的特性,之前(qian)也做题也遇到过。在执行unserialize的时候,如果字符串前面满足了可被反序列化的规则即后续的不规则字符会被(bei)忽略。 四、如果(guo)不太好理解不(bu)如直接来看一个在线测试用例: 总结一下,在php以php_serialize引擎生成session,然而又以php引擎来解析时,我们通过传入类似 $_SESSION[‘name’] = |序列化内容 这种形式的payload即有可(ke)能触发反序列化漏洞。当然这里只是提(ti)到了能够找到反序列化利用的点,至于能不能真正触发反序列化(hua)漏洞还需要结合当前环境以及一些魔术函数中是否存(cun)在可利(li)用点。这就涉及到php反序列化漏洞的利用知识(shi)点了,这里也就不详细讲了。关于(yu)Session反序列化攻击的复杂利用方式,可(ke)以参考2018LCTF中的bestphp’s revenge一题。 五、没有$_SESSION变量赋值 从上(shang)面的情况中我们可以发现我们对session的赋值可控。那如果(guo)代码中不存在对$_SESSION变(bian)量赋值的情况下如何利用(yong)呢?来看下面(mian)一个点。 php还存在一个(ge)upload_process机制,即自动在$_SESSION中创建一个键值对,值中刚(gang)好存在用户可控的(de)部分。 写入的方(fang)式主要是利用PHP中Session Upload Progress来进行设置,具(ju)体为,在上传文件时,如果POST一个名为PHP_SESSION_UPLOAD_PROGRESS的(de)变量,就可以将filename的值赋值到session中。 //上传表单 既然filename字段能够写入session中那么就(jiu)满足了session可控条件,后续的利用条件同上面所述的情(qing)景一致,两种不同引擎先后作用导致了恶意的序列化字符串被解(jie)析。 六(liu)、0x04 Session文件包含 这(zhe)个(ge)也(ye)是一个比(bi)较旧的知识点了,其实不仅是Session文件包含,仔细想想,理论上只(zhi)要能够在文件中写入php代码,再被include包含进来不都可以实(shi)现getshell嘛?只不过在(zai)这里我们的(de)可控点是Session文件(jian),如果能向其中写入php代码,也是可以实现文件包含漏洞利用的。 作为(wei)文件包含的利用这里就不展示了,网上关于(yu)这个(ge)的基础资料早就烂大街了。 值得一提的(de)是,往往现在的CTF出题不会仅限于文件包含这一个点来出题,而(er)是利用诸如session+lfi的形式来入题获取(qu)源码等。而且可(ke)能加入(ru)open=""_basedir来限制路径,此时就需要(yao)熟悉了解session的机制,通过函数(shu)来改变(bian)save路径来利用。这个思(si)路是在(zai)XCTF Final中出现的bestphp一题中的考点。感兴趣的同学可以(yi)去找到环境复现一波。 七、0x05 Session伪造用户登录 前几天正好(hao)3CTF出了一个(ge)这个考点,这里以(yi)那个题目来说明一下利用方式。(由于没有提供复现环境,此处也只能限于“纸上谈兵”,希望大家(jia)能够理解一下利(li)用原理即可(ke)。) **利用前提:**session可控;知道session存储格式。 这里的考题是多个攻击面的组合。题面index.php下(xia)提示要以admin登录。 sql盲注可以跑sqlmap拿到执行shellsql root用户存在(zai)file权限,但是往站点直接写shell无(wu)法成功(猜测应该是站点根目录有限制,但是可以猜测/tmp可写扫后台发现test.php,访问(wen)发现回显了session的数据结构Array([username]=>test),知道了session的格式。key为(wei)username,至于采用了哪种序列化引擎?三种都测一下就完事。这(zhe)里满足了两个利用前提。通过sqlmap-shell往/tmp写入文件伪造adminpayload:select 'username|s:5:"admin";' into outfile '/tmp/sess_PHPSESSID'最后修改成对应设计的PHPSESSID即可(ke)伪造admin登录拿到flag。0x06 Session逻辑漏洞 很遗憾这个点也没有可以复现的环境。(官方买断...)这个是上两(liang)周unctf中出现的一道web题考点(dian)。这个逻辑漏洞处在(zai)重置密码处。过程大致如下(xia)。 八、密码重置分为三个步骤 填写需要重置的用户名用户名绑定的邮箱中收到验证码填写验(yan)证码,进入重置密码页面(mian),填写完新密码完成重置。这里存在的逻辑漏洞在于第一个页面的填写用户名处,猜测后台有(you)设置session。类似:$_SESSION[‘name’] = $_POST['name']; 九、利用方式:重置admin密码 打开一个正常页面完(wan)整流程走到最后一步(bu),填写完验证码通过后,填写新密码,此时并(bing)不提交。新开另外一个页面完成第一步,重置用户填写admin,此时Session不再是我们之前自己的用户,而变成了admin。这(zhe)时完成之前页面的提交。成功重置admin密码。这里逻辑漏洞产生的原因在(zai)于对填写验证码后没有(you)对相关用户绑定做记录,在最后一步重置密码时没有对Session的可靠性进行检查就直接执行了功能。而我(wo)们都知(zhi)道Session存储在服务器端,因此我们再开一个页面即可完成对单一session文件内(nei)容的修改(保证在同一个PHPSEEID下)。 这里仅仅是记录了自己关于PHP的session机制相关的(de)学习,举的都是自己最近在(zai)CTF题(ti)中(zhong)接触到的点,但关于session的利用点怎么可能只有这几(ji)个?遇到了再补充学习吧。限于篇幅没有展开讲拓展利(li)用,但是说白了(le),拓展利用就(jiu)是多个复杂知识点(dian)的综合。我认为只有把原理性的问题搞清楚了才有可能(neng)去理(li)解(jie)复杂的组合攻击。另外如果文(wen)中(zhong)有(you)什么理解表达错误的地方还望师傅们指正。小伙伴们要(yao)想获得更多php session的内容,请关注新网!
