0x01 web200-简单ping
看题目名字像是命令注入。
测试了一些如|,$(),;,&等,发现&可用于拼接注入:
肯定不会这么简单的吧,然后试试其他命令,可以看出有命令长度限制,过滤了空格等:
上面列出来的upload看一下,这里有一个filter协议的文件包含,可以直接读取到该页源码,这里可以看出来有自动加后缀.php:
base64解密之后看到的上传页面源码如下:
光看上传代码,这里是白名单,我没看出有可以绕过的地方。
还有就是你自己传的png上去也猜不出来上传后的文件名。是根据当前时间随机运算得到的结果+_+源文件名。
mt_srand():播种 Mersenne Twister 随机数生成器。
mt_rand(min,max)说明 : 如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数。
也就是说上述echo的两个mt_rand(),是不一样的,而且好像没啥关系。
搜了下,网上说可以根据同页面的另外一个生成的随机值逆推出种子,在使用该种子输出两次随机值即可复现。
参考https://www.anquanke.com/post/id/84531.
我实际测试并没有成功,不知为何。
根据源代码随机数算法mt_srand((time() % rand(1,100000)%rand(1000,9000)));,可以看见种子范围大概在1-10000,自己根据种子范围,在本机生成两次每个种子的随机数,取第二次,拿到的值去爆破服务器文件名即可。
实现过程如下:
生成第二次随机数的php:
生成页面第二次随机数到t.txt
上传文件并开始爆破文件名:
为了实现更快地爆破效果,我直接在同时一直重放上传包,
上传了几百个文件:
然后十几秒后查看当前目录,test.png结尾的都是服务器存在的文件名:
接下来看文件包含绕过
源代码文件包含这边正则只过滤了../,截断是不行的。
下面的文件包含,我也测试了%00截断还有4096目录字节限制的截断都没有成功。
关于目录字节限制我只能想到././././和.///////////这种,放在目标文件名之前,在目录解析时与直接输入文件名无异:
如:
看他代码逻辑,.php后缀添加源文件名之后,用我上述的截断方式则不合理,无法截断。
截断字符应该放在文件名之后如:
这样的我在环境里测试没有成功,有测试过的大佬请指教。
那么无论是php://input,file://等协议,都无法避免自动添加后缀的问题。
data://协议理论可以避免如提交xxx.php?p=data://text/plain,//
需要allow_url_include=On,题目没开。
远程文件包含也可直接绕过(allow_url_fopen=On,allow_url_include=On),就不说了吧。不过题目没这么简单。
后来跟基友讨论,想到了php的phar归档格式,即phar://。
简述一下phar://效果,具体文档自行搜索:对比zip://协议,无需绝对路径即可读取压缩文件内容,不限制后缀。其他用法与zip协议无异。
如1.txt压缩为2.zip,如此读取:phar://2.zip/1.txt。
如此来说思路就有了,压缩文件内部的文件后缀是可控的。
我们把2.php(文件内容是666)压缩成test.zip再改zip为png上传即可。
找到flag并读取:
0x02. web300-难点的ping
robots.txt看到有index.txt:
看源码的话,可以直接绕过啊,在本地搭建:
肯定不会这么简单,我觉得index.php的内容根本就不是index.txt。
题目就是想告诉你,这是个命令注入,没有回显,我还过滤了>,你无法把执行结果定向到文件再读取。
这样的话其实有几种方式绕过,如:
我试了下,服务器没有curl,没有wget,没有base64。我吃。
那用ping配合DNSLOG,不过需要避免空格和换行问题。
使用sed配合正则即可。
我尝试只替换空格为tttt是可以的:
我使用了吐司的DNSLOG,真的好用。
得到.t00ls.
继续读取:
得到.t00ls
还有几个难的题目到现在没做出来,抽空研究出来再分享吧。做了CTF才知道自己与大牛的差别啊啊啊啊啊
领取专属 10元无门槛券
私享最新 技术干货